From d093d0564a0baca4f45bba49622a87666ef886c1 Mon Sep 17 00:00:00 2001 From: Andrei Mihu Date: Sat, 23 May 2020 13:17:26 +0100 Subject: [PATCH] Replace metrics implementation, more accurate devconsole stats. --- CHANGELOG.md | 5 + console/a_console-packr.go | 12 +- console/ui/src/routes/status/index.tsx | 47 +- console/ui/src/routes/users/details.tsx | 10 +- console/ui/src/store/users/actions.ts | 6 +- console/ui/src/store/users/sagas.ts | 50 +- console/ui/src/store/users/types.ts | 12 + data/modules/clientrpc.lua | 1 + go.mod | 14 +- go.sum | 122 +- main.go | 13 +- sample_go_module/sample.go | 5 + server/api.go | 64 +- server/api_account.go | 16 +- server/api_authenticate.go | 66 +- server/api_channel.go | 8 +- server/api_event.go | 8 +- server/api_friend.go | 40 +- server/api_group.go | 96 +- server/api_leaderboard.go | 32 +- server/api_link.go | 66 +- server/api_match.go | 8 +- server/api_notification.go | 16 +- server/api_rpc.go | 27 +- server/api_storage.go | 32 +- server/api_tournament.go | 40 +- server/api_unlink.go | 64 +- server/api_user.go | 8 +- server/config.go | 14 +- server/console.go | 14 +- server/match_handler.go | 11 +- server/match_registry.go | 12 +- server/metrics.go | 364 +- server/metrics_exporter.go | 106 - server/metrics_grpc_handler.go | 71 + server/runtime.go | 6 +- server/runtime_event.go | 10 +- server/runtime_lua.go | 24 +- server/runtime_lua_match_core.go | 6 +- server/runtime_lua_nakama.go | 64 +- server/session_registry.go | 12 +- server/socket_ws.go | 15 +- server/status_handler.go | 14 +- vendor/cloud.google.com/go/LICENSE | 202 - .../go/compute/metadata/metadata.go | 526 - .../container/apiv1/cluster_manager_client.go | 676 -- .../go/container/apiv1/doc.go | 49 - .../go/internal/version/update_version.sh | 19 - .../go/internal/version/version.go | 71 - .../monitoring/apiv3/alert_policy_client.go | 288 - .../go/monitoring/apiv3/doc.go | 105 - .../go/monitoring/apiv3/group_client.go | 373 - .../go/monitoring/apiv3/metric_client.go | 472 - .../apiv3/notification_channel_client.go | 464 - .../go/monitoring/apiv3/path_funcs.go | 107 - .../monitoring/apiv3/uptime_check_client.go | 372 - vendor/cloud.google.com/go/trace/apiv2/doc.go | 105 - .../go/trace/apiv2/path_funcs.go | 43 - .../go/trace/apiv2/trace_client.go | 159 - .../exporter/prometheus/.gitignore | 1 - .../exporter/prometheus/.travis.yml | 17 - .../exporter/prometheus/Makefile | 95 - .../exporter/prometheus/README.md | 14 - .../exporter/prometheus/go.mod | 6 - .../exporter/prometheus/go.sum | 51 - .../exporter/prometheus/prometheus.go | 277 - .../exporter/prometheus/sanitize.go | 50 - .../exporter/stackdriver/.gitignore | 10 - .../exporter/stackdriver/.travis.yml | 20 - .../exporter/stackdriver/AUTHORS | 1 - .../exporter/stackdriver/CONTRIBUTING.md | 24 - .../exporter/stackdriver/LICENSE | 202 - .../exporter/stackdriver/Makefile | 125 - .../exporter/stackdriver/README.md | 14 - .../exporter/stackdriver/RESOURCE.md | 53 - .../exporter/stackdriver/go.mod | 21 - .../exporter/stackdriver/go.sum | 179 - .../exporter/stackdriver/label.go | 33 - .../exporter/stackdriver/metrics.go | 486 - .../exporter/stackdriver/metrics_batcher.go | 91 - .../exporter/stackdriver/metrics_proto.go | 559 - .../stackdriver/metrics_test_utils.go | 67 - .../aws_identity_doc_utils.go | 57 - .../monitoredresource/gcp_metadata_config.go | 117 - .../monitoredresource/monitored_resources.go | 232 - .../exporter/stackdriver/resource.go | 113 - .../exporter/stackdriver/sanitize.go | 50 - .../exporter/stackdriver/stackdriver.go | 445 - .../exporter/stackdriver/stats.go | 683 -- .../exporter/stackdriver/trace.go | 178 - .../exporter/stackdriver/trace_proto.go | 291 - vendor/github.com/aws/aws-sdk-go/LICENSE.txt | 202 - vendor/github.com/aws/aws-sdk-go/NOTICE.txt | 3 - .../aws/aws-sdk-go/aws/awserr/error.go | 164 - .../aws/aws-sdk-go/aws/awserr/types.go | 221 - .../aws/aws-sdk-go/aws/awsutil/copy.go | 108 - .../aws/aws-sdk-go/aws/awsutil/equal.go | 27 - .../aws/aws-sdk-go/aws/awsutil/path_value.go | 221 - .../aws/aws-sdk-go/aws/awsutil/prettify.go | 113 - .../aws-sdk-go/aws/awsutil/string_value.go | 88 - .../aws/aws-sdk-go/aws/client/client.go | 96 - .../aws-sdk-go/aws/client/default_retryer.go | 106 - .../aws/aws-sdk-go/aws/client/logger.go | 194 - .../aws/client/metadata/client_info.go | 13 - .../github.com/aws/aws-sdk-go/aws/config.go | 536 - .../aws/aws-sdk-go/aws/context_1_5.go | 37 - .../aws/aws-sdk-go/aws/context_1_9.go | 11 - .../aws-sdk-go/aws/context_background_1_5.go | 56 - .../aws-sdk-go/aws/context_background_1_7.go | 20 - .../aws/aws-sdk-go/aws/context_sleep.go | 24 - .../aws/aws-sdk-go/aws/convert_types.go | 387 - .../aws-sdk-go/aws/corehandlers/handlers.go | 230 - .../aws/corehandlers/param_validator.go | 17 - .../aws-sdk-go/aws/corehandlers/user_agent.go | 37 - .../aws/credentials/chain_provider.go | 100 - .../aws-sdk-go/aws/credentials/credentials.go | 299 - .../ec2rolecreds/ec2_role_provider.go | 180 - .../aws/credentials/endpointcreds/provider.go | 203 - .../aws/credentials/env_provider.go | 74 - .../aws-sdk-go/aws/credentials/example.ini | 12 - .../aws/credentials/processcreds/provider.go | 425 - .../shared_credentials_provider.go | 150 - .../aws/credentials/static_provider.go | 55 - .../stscreds/assume_role_provider.go | 312 - .../stscreds/web_identity_provider.go | 100 - .../github.com/aws/aws-sdk-go/aws/csm/doc.go | 69 - .../aws/aws-sdk-go/aws/csm/enable.go | 89 - .../aws/aws-sdk-go/aws/csm/metric.go | 109 - .../aws/aws-sdk-go/aws/csm/metric_chan.go | 55 - .../aws-sdk-go/aws/csm/metric_exception.go | 26 - .../aws/aws-sdk-go/aws/csm/reporter.go | 265 - .../aws/aws-sdk-go/aws/defaults/defaults.go | 207 - .../aws-sdk-go/aws/defaults/shared_config.go | 27 - vendor/github.com/aws/aws-sdk-go/aws/doc.go | 56 - .../aws/aws-sdk-go/aws/ec2metadata/api.go | 170 - .../aws/aws-sdk-go/aws/ec2metadata/service.go | 152 - .../aws/aws-sdk-go/aws/endpoints/decode.go | 188 - .../aws/aws-sdk-go/aws/endpoints/defaults.go | 5564 ---------- .../aws/endpoints/dep_service_ids.go | 141 - .../aws/aws-sdk-go/aws/endpoints/doc.go | 66 - .../aws/aws-sdk-go/aws/endpoints/endpoints.go | 452 - .../aws/aws-sdk-go/aws/endpoints/v3model.go | 308 - .../aws/endpoints/v3model_codegen.go | 351 - .../github.com/aws/aws-sdk-go/aws/errors.go | 13 - .../aws/aws-sdk-go/aws/jsonvalue.go | 12 - .../github.com/aws/aws-sdk-go/aws/logger.go | 118 - .../aws/request/connection_reset_error.go | 18 - .../aws/aws-sdk-go/aws/request/handlers.go | 322 - .../aws-sdk-go/aws/request/http_request.go | 24 - .../aws-sdk-go/aws/request/offset_reader.go | 65 - .../aws/aws-sdk-go/aws/request/request.go | 670 -- .../aws/aws-sdk-go/aws/request/request_1_7.go | 39 - .../aws/aws-sdk-go/aws/request/request_1_8.go | 36 - .../aws-sdk-go/aws/request/request_context.go | 14 - .../aws/request/request_context_1_6.go | 14 - .../aws/request/request_pagination.go | 264 - .../aws/aws-sdk-go/aws/request/retryer.go | 266 - .../aws/request/timeout_read_closer.go | 94 - .../aws/aws-sdk-go/aws/request/validation.go | 286 - .../aws/aws-sdk-go/aws/request/waiter.go | 295 - .../aws/session/cabundle_transport.go | 26 - .../aws/session/cabundle_transport_1_5.go | 22 - .../aws/session/cabundle_transport_1_6.go | 23 - .../aws/aws-sdk-go/aws/session/credentials.go | 259 - .../aws/aws-sdk-go/aws/session/doc.go | 245 - .../aws/aws-sdk-go/aws/session/env_config.go | 277 - .../aws/aws-sdk-go/aws/session/session.go | 660 -- .../aws-sdk-go/aws/session/shared_config.go | 491 - .../aws-sdk-go/aws/signer/v4/header_rules.go | 82 - .../aws/aws-sdk-go/aws/signer/v4/options.go | 7 - .../aws/aws-sdk-go/aws/signer/v4/uri_path.go | 24 - .../aws/aws-sdk-go/aws/signer/v4/v4.go | 806 -- vendor/github.com/aws/aws-sdk-go/aws/types.go | 207 - vendor/github.com/aws/aws-sdk-go/aws/url.go | 12 - .../github.com/aws/aws-sdk-go/aws/url_1_7.go | 29 - .../github.com/aws/aws-sdk-go/aws/version.go | 8 - .../aws/aws-sdk-go/internal/ini/ast.go | 120 - .../aws-sdk-go/internal/ini/comma_token.go | 11 - .../aws-sdk-go/internal/ini/comment_token.go | 35 - .../aws/aws-sdk-go/internal/ini/doc.go | 29 - .../aws-sdk-go/internal/ini/empty_token.go | 4 - .../aws/aws-sdk-go/internal/ini/expression.go | 24 - .../aws/aws-sdk-go/internal/ini/fuzz.go | 17 - .../aws/aws-sdk-go/internal/ini/ini.go | 51 - .../aws/aws-sdk-go/internal/ini/ini_lexer.go | 165 - .../aws/aws-sdk-go/internal/ini/ini_parser.go | 349 - .../aws-sdk-go/internal/ini/literal_tokens.go | 324 - .../aws-sdk-go/internal/ini/newline_token.go | 30 - .../aws-sdk-go/internal/ini/number_helper.go | 152 - .../aws/aws-sdk-go/internal/ini/op_tokens.go | 39 - .../aws-sdk-go/internal/ini/parse_error.go | 43 - .../aws-sdk-go/internal/ini/parse_stack.go | 60 - .../aws/aws-sdk-go/internal/ini/sep_tokens.go | 41 - .../aws/aws-sdk-go/internal/ini/skipper.go | 45 - .../aws/aws-sdk-go/internal/ini/statement.go | 35 - .../aws/aws-sdk-go/internal/ini/value_util.go | 284 - .../aws/aws-sdk-go/internal/ini/visitor.go | 166 - .../aws/aws-sdk-go/internal/ini/walker.go | 25 - .../aws/aws-sdk-go/internal/ini/ws_token.go | 24 - .../aws/aws-sdk-go/internal/sdkio/io_go1.6.go | 10 - .../aws/aws-sdk-go/internal/sdkio/io_go1.7.go | 12 - .../aws/aws-sdk-go/internal/sdkmath/floor.go | 15 - .../internal/sdkmath/floor_go1.9.go | 56 - .../internal/sdkrand/locked_source.go | 29 - .../aws/aws-sdk-go/internal/sdkuri/path.go | 23 - .../internal/shareddefaults/ecs_container.go | 12 - .../internal/shareddefaults/shared_config.go | 40 - .../aws/aws-sdk-go/private/protocol/host.go | 68 - .../private/protocol/host_prefix.go | 54 - .../private/protocol/idempotency.go | 75 - .../private/protocol/json/jsonutil/build.go | 296 - .../protocol/json/jsonutil/unmarshal.go | 250 - .../aws-sdk-go/private/protocol/jsonvalue.go | 76 - .../aws-sdk-go/private/protocol/payload.go | 81 - .../private/protocol/query/build.go | 36 - .../protocol/query/queryutil/queryutil.go | 246 - .../private/protocol/query/unmarshal.go | 39 - .../private/protocol/query/unmarshal_error.go | 69 - .../aws-sdk-go/private/protocol/rest/build.go | 310 - .../private/protocol/rest/payload.go | 45 - .../private/protocol/rest/unmarshal.go | 237 - .../aws-sdk-go/private/protocol/timestamp.go | 84 - .../aws-sdk-go/private/protocol/unmarshal.go | 21 - .../private/protocol/xml/xmlutil/build.go | 306 - .../private/protocol/xml/xmlutil/unmarshal.go | 291 - .../protocol/xml/xmlutil/xml_to_struct.go | 148 - .../aws/aws-sdk-go/service/sts/api.go | 2750 ----- .../aws-sdk-go/service/sts/customizations.go | 11 - .../aws/aws-sdk-go/service/sts/doc.go | 108 - .../aws/aws-sdk-go/service/sts/errors.go | 73 - .../aws/aws-sdk-go/service/sts/service.go | 95 - .../service/sts/stsiface/interface.go | 96 - .../opencensus-proto/AUTHORS | 1 - .../opencensus-proto/LICENSE | 202 - .../gen-go/agent/common/v1/common.pb.go | 361 - .../gen-go/metrics/v1/metrics.pb.go | 1127 -- .../gen-go/resource/v1/resource.pb.go | 100 - vendor/github.com/golang/groupcache/LICENSE | 191 - .../github.com/golang/groupcache/lru/lru.go | 133 - vendor/github.com/google/go-cmp/LICENSE | 27 - .../google/go-cmp/cmp/cmpopts/equate.go | 89 - .../google/go-cmp/cmp/cmpopts/ignore.go | 207 - .../google/go-cmp/cmp/cmpopts/sort.go | 147 - .../go-cmp/cmp/cmpopts/struct_filter.go | 182 - .../google/go-cmp/cmp/cmpopts/xform.go | 35 - .../github.com/google/go-cmp/cmp/compare.go | 616 -- .../google/go-cmp/cmp/export_panic.go | 15 - .../google/go-cmp/cmp/export_unsafe.go | 23 - .../go-cmp/cmp/internal/diff/debug_disable.go | 17 - .../go-cmp/cmp/internal/diff/debug_enable.go | 122 - .../google/go-cmp/cmp/internal/diff/diff.go | 372 - .../google/go-cmp/cmp/internal/flags/flags.go | 9 - .../cmp/internal/flags/toolchain_legacy.go | 10 - .../cmp/internal/flags/toolchain_recent.go | 10 - .../go-cmp/cmp/internal/function/func.go | 99 - .../cmp/internal/value/pointer_purego.go | 23 - .../cmp/internal/value/pointer_unsafe.go | 26 - .../google/go-cmp/cmp/internal/value/sort.go | 106 - .../google/go-cmp/cmp/internal/value/zero.go | 48 - .../github.com/google/go-cmp/cmp/options.go | 524 - vendor/github.com/google/go-cmp/cmp/path.go | 308 - vendor/github.com/google/go-cmp/cmp/report.go | 51 - .../google/go-cmp/cmp/report_compare.go | 296 - .../google/go-cmp/cmp/report_reflect.go | 278 - .../google/go-cmp/cmp/report_slices.go | 333 - .../google/go-cmp/cmp/report_text.go | 387 - .../google/go-cmp/cmp/report_value.go | 121 - .../github.com/googleapis/gax-go/v2/LICENSE | 27 - .../googleapis/gax-go/v2/call_option.go | 161 - vendor/github.com/googleapis/gax-go/v2/gax.go | 39 - vendor/github.com/googleapis/gax-go/v2/go.mod | 3 - vendor/github.com/googleapis/gax-go/v2/go.sum | 25 - .../github.com/googleapis/gax-go/v2/header.go | 53 - .../github.com/googleapis/gax-go/v2/invoke.go | 99 - .../jmespath/go-jmespath/.gitignore | 4 - .../jmespath/go-jmespath/.travis.yml | 9 - .../github.com/jmespath/go-jmespath/LICENSE | 13 - .../github.com/jmespath/go-jmespath/Makefile | 44 - .../github.com/jmespath/go-jmespath/README.md | 7 - vendor/github.com/jmespath/go-jmespath/api.go | 49 - .../go-jmespath/astnodetype_string.go | 16 - .../jmespath/go-jmespath/functions.go | 842 -- .../jmespath/go-jmespath/interpreter.go | 418 - .../github.com/jmespath/go-jmespath/lexer.go | 420 - .../github.com/jmespath/go-jmespath/parser.go | 603 -- .../jmespath/go-jmespath/toktype_string.go | 16 - .../github.com/jmespath/go-jmespath/util.go | 185 - .../m3db/prometheus_client_golang/AUTHORS.md | 18 + .../m3db/prometheus_client_golang}/LICENSE | 0 .../prometheus_client_golang}/NOTICE | 0 .../prometheus/.gitignore | 0 .../prometheus/README.md | 0 .../prometheus/collector.go | 75 + .../prometheus/counter.go | 172 + .../prometheus/desc.go | 53 +- .../prometheus/doc.go | 98 +- .../prometheus/expvar_collector.go | 0 .../prometheus/fnv.go | 13 - .../prometheus/gauge.go | 140 + .../prometheus/go_collector.go | 74 +- .../prometheus/histogram.go | 306 +- .../prometheus/http.go | 254 +- .../prometheus/metric.go | 92 +- .../prometheus/process_collector.go | 142 + .../prometheus/promhttp/http.go | 201 + .../prometheus/registry.go | 721 +- .../prometheus/summary.go | 196 +- .../prometheus/untyped.go | 138 + .../prometheus/value.go | 94 +- .../prometheus/vec.go | 404 + .../prometheus_client_model}/LICENSE | 0 .../prometheus_client_model}/NOTICE | 0 .../prometheus_client_model/go/metrics.pb.go | 360 + .../prometheus_common}/LICENSE | 0 .../common => m3db/prometheus_common}/NOTICE | 0 .../prometheus_common}/expfmt/decode.go | 4 +- .../prometheus_common}/expfmt/encode.go | 4 +- .../prometheus_common}/expfmt/expfmt.go | 0 .../prometheus_common}/expfmt/fuzz.go | 0 .../prometheus_common/expfmt/text_create.go | 303 + .../prometheus_common}/expfmt/text_parse.go | 6 +- .../bitbucket.org/ww/goautoneg/README.txt | 0 .../bitbucket.org/ww/goautoneg/autoneg.go | 0 .../prometheus_common}/model/alert.go | 0 .../model/fingerprinting.go | 0 .../prometheus_common}/model/fnv.go | 0 .../prometheus_common}/model/labels.go | 0 .../prometheus_common}/model/labelset.go | 0 .../prometheus_common}/model/metric.go | 0 .../prometheus_common}/model/model.go | 0 .../prometheus_common}/model/signature.go | 0 .../prometheus_common}/model/silence.go | 0 .../prometheus_common}/model/time.go | 2 +- .../prometheus_common}/model/value.go | 0 .../m3db/prometheus_procfs/.travis.yml | 5 + .../m3db/prometheus_procfs/AUTHORS.md | 21 + .../prometheus_procfs}/CONTRIBUTING.md | 6 +- .../common => m3db/prometheus_procfs}/LICENSE | 0 .../m3db/prometheus_procfs/Makefile | 6 + .../procfs => m3db/prometheus_procfs}/NOTICE | 0 .../prometheus_procfs}/README.md | 1 - .../procfs => m3db/prometheus_procfs}/doc.go | 0 .../github.com/m3db/prometheus_procfs/fs.go | 33 + .../procfs => m3db/prometheus_procfs}/ipvs.go | 69 +- .../prometheus_procfs}/mdstat.go | 13 - .../prometheus_procfs}/mountstats.go | 76 +- .../procfs => m3db/prometheus_procfs}/proc.go | 36 +- .../prometheus_procfs}/proc_io.go | 18 +- .../prometheus_procfs}/proc_limits.go | 51 +- .../prometheus_procfs}/proc_stat.go | 13 - .../github.com/m3db/prometheus_procfs/stat.go | 56 + .../client_golang/prometheus/collector.go | 120 - .../client_golang/prometheus/counter.go | 277 - .../client_golang/prometheus/gauge.go | 286 - .../prometheus/internal/metric.go | 85 - .../client_golang/prometheus/labels.go | 87 - .../client_golang/prometheus/observer.go | 52 - .../prometheus/process_collector.go | 204 - .../prometheus/promhttp/delegator.go | 199 - .../prometheus/promhttp/delegator_1_8.go | 181 - .../prometheus/promhttp/delegator_pre_1_8.go | 44 - .../client_golang/prometheus/promhttp/http.go | 311 - .../prometheus/promhttp/instrument_client.go | 97 - .../promhttp/instrument_client_1_8.go | 144 - .../prometheus/promhttp/instrument_server.go | 447 - .../client_golang/prometheus/timer.go | 54 - .../client_golang/prometheus/untyped.go | 42 - .../client_golang/prometheus/vec.go | 472 - .../client_golang/prometheus/wrap.go | 179 - .../prometheus/client_model/go/metrics.pb.go | 629 -- .../prometheus/common/expfmt/text_create.go | 468 - .../github.com/prometheus/procfs/.gitignore | 1 - vendor/github.com/prometheus/procfs/LICENSE | 201 - .../prometheus/procfs/MAINTAINERS.md | 1 - vendor/github.com/prometheus/procfs/Makefile | 30 - .../prometheus/procfs/Makefile.common | 223 - .../github.com/prometheus/procfs/buddyinfo.go | 95 - .../prometheus/procfs/fixtures.ttar | 462 - vendor/github.com/prometheus/procfs/fs.go | 82 - vendor/github.com/prometheus/procfs/go.mod | 1 - .../prometheus/procfs/internal/util/parse.go | 59 - .../procfs/internal/util/sysreadfile_linux.go | 45 - .../github.com/prometheus/procfs/net_dev.go | 216 - .../github.com/prometheus/procfs/nfs/nfs.go | 263 - .../github.com/prometheus/procfs/nfs/parse.go | 317 - .../prometheus/procfs/nfs/parse_nfs.go | 67 - .../prometheus/procfs/nfs/parse_nfsd.go | 89 - .../github.com/prometheus/procfs/proc_ns.go | 68 - vendor/github.com/prometheus/procfs/stat.go | 232 - vendor/github.com/prometheus/procfs/ttar | 389 - vendor/github.com/prometheus/procfs/xfrm.go | 187 - .../github.com/prometheus/procfs/xfs/parse.go | 330 - .../github.com/prometheus/procfs/xfs/xfs.go | 163 - vendor/github.com/uber-go/tally/.gitignore | 33 + vendor/github.com/uber-go/tally/.travis.yml | 21 + vendor/github.com/uber-go/tally/LICENSE | 21 + vendor/github.com/uber-go/tally/Makefile | 61 + vendor/github.com/uber-go/tally/README.md | 212 + .../github.com/uber-go/tally/check_license.sh | 4 + vendor/github.com/uber-go/tally/glide.lock | 74 + vendor/github.com/uber-go/tally/glide.yaml | 44 + vendor/github.com/uber-go/tally/histogram.go | 318 + vendor/github.com/uber-go/tally/key_gen.go | 134 + vendor/github.com/uber-go/tally/pool.go | 63 + .../uber-go/tally/prometheus/README.md | 118 + .../uber-go/tally/prometheus/config.go | 176 + .../uber-go/tally/prometheus/reporter.go | 610 ++ .../uber-go/tally/prometheus/sanitize.go | 44 + vendor/github.com/uber-go/tally/reporter.go | 140 + vendor/github.com/uber-go/tally/sanitize.go | 176 + vendor/github.com/uber-go/tally/scope.go | 747 ++ .../uber-go/tally/scope_registry.go | 113 + vendor/github.com/uber-go/tally/stats.go | 475 + vendor/github.com/uber-go/tally/types.go | 157 + vendor/go.opencensus.io/.gitignore | 9 - vendor/go.opencensus.io/.travis.yml | 17 - vendor/go.opencensus.io/AUTHORS | 1 - vendor/go.opencensus.io/CONTRIBUTING.md | 63 - vendor/go.opencensus.io/LICENSE | 202 - vendor/go.opencensus.io/Makefile | 96 - vendor/go.opencensus.io/README.md | 267 - vendor/go.opencensus.io/appveyor.yml | 24 - vendor/go.opencensus.io/go.mod | 15 - vendor/go.opencensus.io/go.sum | 74 - vendor/go.opencensus.io/internal/internal.go | 37 - vendor/go.opencensus.io/internal/sanitize.go | 50 - .../internal/tagencoding/tagencoding.go | 75 - .../internal/traceinternals.go | 53 - .../go.opencensus.io/metric/metricdata/doc.go | 19 - .../metric/metricdata/exemplar.go | 38 - .../metric/metricdata/label.go | 35 - .../metric/metricdata/metric.go | 46 - .../metric/metricdata/point.go | 193 - .../metric/metricdata/type_string.go | 16 - .../metric/metricdata/unit.go | 27 - .../metric/metricexport/doc.go | 19 - .../metric/metricexport/export.go | 26 - .../metric/metricexport/reader.go | 187 - .../metric/metricproducer/manager.go | 78 - .../metric/metricproducer/producer.go | 28 - vendor/go.opencensus.io/opencensus.go | 21 - .../go.opencensus.io/plugin/ocgrpc/client.go | 56 - .../plugin/ocgrpc/client_metrics.go | 107 - .../plugin/ocgrpc/client_stats_handler.go | 49 - vendor/go.opencensus.io/plugin/ocgrpc/doc.go | 19 - .../go.opencensus.io/plugin/ocgrpc/server.go | 80 - .../plugin/ocgrpc/server_metrics.go | 97 - .../plugin/ocgrpc/server_stats_handler.go | 63 - .../plugin/ocgrpc/stats_common.go | 227 - .../plugin/ocgrpc/trace_common.go | 107 - .../go.opencensus.io/plugin/ochttp/client.go | 117 - .../plugin/ochttp/client_stats.go | 143 - vendor/go.opencensus.io/plugin/ochttp/doc.go | 19 - .../plugin/ochttp/propagation/b3/b3.go | 123 - .../go.opencensus.io/plugin/ochttp/route.go | 61 - .../go.opencensus.io/plugin/ochttp/server.go | 453 - .../ochttp/span_annotating_client_trace.go | 169 - .../go.opencensus.io/plugin/ochttp/stats.go | 292 - .../go.opencensus.io/plugin/ochttp/trace.go | 244 - .../plugin/ochttp/wrapped_body.go | 44 - vendor/go.opencensus.io/resource/resource.go | 164 - .../resource/resourcekeys/const.go | 68 - vendor/go.opencensus.io/stats/doc.go | 69 - .../go.opencensus.io/stats/internal/record.go | 25 - vendor/go.opencensus.io/stats/measure.go | 109 - .../go.opencensus.io/stats/measure_float64.go | 55 - .../go.opencensus.io/stats/measure_int64.go | 55 - vendor/go.opencensus.io/stats/record.go | 117 - vendor/go.opencensus.io/stats/units.go | 26 - .../stats/view/aggregation.go | 121 - .../stats/view/aggregation_data.go | 293 - .../go.opencensus.io/stats/view/collector.go | 86 - vendor/go.opencensus.io/stats/view/doc.go | 47 - vendor/go.opencensus.io/stats/view/export.go | 58 - vendor/go.opencensus.io/stats/view/view.go | 221 - .../stats/view/view_to_metric.go | 149 - vendor/go.opencensus.io/stats/view/worker.go | 281 - .../stats/view/worker_commands.go | 186 - vendor/go.opencensus.io/tag/context.go | 43 - vendor/go.opencensus.io/tag/doc.go | 26 - vendor/go.opencensus.io/tag/key.go | 44 - vendor/go.opencensus.io/tag/map.go | 229 - vendor/go.opencensus.io/tag/map_codec.go | 239 - vendor/go.opencensus.io/tag/metadata.go | 52 - vendor/go.opencensus.io/tag/profile_19.go | 31 - vendor/go.opencensus.io/tag/profile_not19.go | 23 - vendor/go.opencensus.io/tag/validate.go | 56 - vendor/go.opencensus.io/trace/basetypes.go | 119 - vendor/go.opencensus.io/trace/config.go | 86 - vendor/go.opencensus.io/trace/doc.go | 53 - vendor/go.opencensus.io/trace/evictedqueue.go | 38 - vendor/go.opencensus.io/trace/export.go | 97 - .../trace/internal/internal.go | 22 - vendor/go.opencensus.io/trace/lrumap.go | 61 - .../trace/propagation/propagation.go | 108 - vendor/go.opencensus.io/trace/sampling.go | 75 - vendor/go.opencensus.io/trace/spanbucket.go | 130 - vendor/go.opencensus.io/trace/spanstore.go | 306 - vendor/go.opencensus.io/trace/status_codes.go | 37 - vendor/go.opencensus.io/trace/trace.go | 598 -- vendor/go.opencensus.io/trace/trace_go11.go | 32 - .../go.opencensus.io/trace/trace_nongo11.go | 25 - .../trace/tracestate/tracestate.go | 147 - .../go.opencensus.io/zpages/internal/gen.go | 19 - .../zpages/internal/resources.go | 284 - vendor/go.opencensus.io/zpages/rpcz.go | 333 - vendor/go.opencensus.io/zpages/templates.go | 125 - vendor/go.opencensus.io/zpages/tracez.go | 442 - vendor/go.opencensus.io/zpages/zpages.go | 70 - vendor/golang.org/x/net/context/context.go | 56 - .../x/net/context/ctxhttp/ctxhttp.go | 71 - vendor/golang.org/x/net/context/go17.go | 72 - vendor/golang.org/x/net/context/go19.go | 20 - vendor/golang.org/x/net/context/pre_go17.go | 300 - vendor/golang.org/x/net/context/pre_go19.go | 109 - vendor/golang.org/x/oauth2/.travis.yml | 13 - vendor/golang.org/x/oauth2/AUTHORS | 3 - vendor/golang.org/x/oauth2/CONTRIBUTING.md | 26 - vendor/golang.org/x/oauth2/CONTRIBUTORS | 3 - vendor/golang.org/x/oauth2/LICENSE | 27 - vendor/golang.org/x/oauth2/README.md | 35 - vendor/golang.org/x/oauth2/go.mod | 10 - vendor/golang.org/x/oauth2/go.sum | 12 - .../golang.org/x/oauth2/google/appengine.go | 38 - .../x/oauth2/google/appengine_gen1.go | 77 - .../x/oauth2/google/appengine_gen2_flex.go | 27 - vendor/golang.org/x/oauth2/google/default.go | 154 - vendor/golang.org/x/oauth2/google/doc.go | 40 - vendor/golang.org/x/oauth2/google/google.go | 209 - vendor/golang.org/x/oauth2/google/jwt.go | 74 - vendor/golang.org/x/oauth2/google/sdk.go | 201 - .../x/oauth2/internal/client_appengine.go | 13 - vendor/golang.org/x/oauth2/internal/doc.go | 6 - vendor/golang.org/x/oauth2/internal/oauth2.go | 37 - vendor/golang.org/x/oauth2/internal/token.go | 294 - .../golang.org/x/oauth2/internal/transport.go | 33 - vendor/golang.org/x/oauth2/jws/jws.go | 182 - vendor/golang.org/x/oauth2/jwt/jwt.go | 185 - vendor/golang.org/x/oauth2/oauth2.go | 381 - vendor/golang.org/x/oauth2/token.go | 178 - vendor/golang.org/x/oauth2/transport.go | 144 - vendor/golang.org/x/sync/AUTHORS | 3 - vendor/golang.org/x/sync/CONTRIBUTORS | 3 - vendor/golang.org/x/sync/LICENSE | 27 - vendor/golang.org/x/sync/PATENTS | 22 - .../golang.org/x/sync/semaphore/semaphore.go | 127 - vendor/google.golang.org/api/AUTHORS | 10 - vendor/google.golang.org/api/CONTRIBUTORS | 55 - vendor/google.golang.org/api/LICENSE | 27 - .../api/googleapi/transport/apikey.go | 38 - .../google.golang.org/api/internal/creds.go | 102 - vendor/google.golang.org/api/internal/pool.go | 61 - .../api/internal/service-account.json | 12 - .../api/internal/settings.go | 96 - .../api/iterator/iterator.go | 231 - .../api/option/credentials_go19.go | 33 - .../api/option/credentials_notgo19.go | 32 - vendor/google.golang.org/api/option/option.go | 235 - .../api/support/bundler/bundler.go | 349 - .../google.golang.org/api/transport/dial.go | 46 - vendor/google.golang.org/api/transport/doc.go | 21 - .../google.golang.org/api/transport/go19.go | 35 - .../api/transport/grpc/dial.go | 209 - .../api/transport/grpc/dial_appengine.go | 41 - .../api/transport/grpc/dial_socketopt.go | 59 - .../api/transport/http/dial.go | 161 - .../api/transport/http/dial_appengine.go | 30 - .../http/internal/propagation/http.go | 96 - .../api/transport/not_go19.go | 35 - .../google.golang.org/appengine/.travis.yml | 20 - .../appengine/CONTRIBUTING.md | 90 - vendor/google.golang.org/appengine/LICENSE | 202 - vendor/google.golang.org/appengine/README.md | 100 - .../google.golang.org/appengine/appengine.go | 135 - .../appengine/appengine_vm.go | 20 - vendor/google.golang.org/appengine/errors.go | 46 - vendor/google.golang.org/appengine/go.mod | 10 - vendor/google.golang.org/appengine/go.sum | 22 - .../google.golang.org/appengine/identity.go | 142 - .../appengine/internal/api.go | 675 -- .../appengine/internal/api_classic.go | 169 - .../appengine/internal/api_common.go | 123 - .../appengine/internal/app_id.go | 28 - .../app_identity/app_identity_service.pb.go | 611 -- .../app_identity/app_identity_service.proto | 64 - .../appengine/internal/base/api_base.pb.go | 308 - .../appengine/internal/base/api_base.proto | 33 - .../internal/datastore/datastore_v3.pb.go | 4367 -------- .../internal/datastore/datastore_v3.proto | 551 - .../appengine/internal/identity.go | 55 - .../appengine/internal/identity_classic.go | 61 - .../appengine/internal/identity_flex.go | 11 - .../appengine/internal/identity_vm.go | 134 - .../appengine/internal/internal.go | 110 - .../appengine/internal/log/log_service.pb.go | 1313 --- .../appengine/internal/log/log_service.proto | 150 - .../appengine/internal/main.go | 16 - .../appengine/internal/main_common.go | 7 - .../appengine/internal/main_vm.go | 69 - .../appengine/internal/metadata.go | 60 - .../internal/modules/modules_service.pb.go | 786 -- .../internal/modules/modules_service.proto | 80 - .../appengine/internal/net.go | 56 - .../appengine/internal/regen.sh | 40 - .../internal/remote_api/remote_api.pb.go | 361 - .../internal/remote_api/remote_api.proto | 44 - .../internal/socket/socket_service.pb.go | 2822 ----- .../internal/socket/socket_service.proto | 460 - .../appengine/internal/transaction.go | 115 - .../internal/urlfetch/urlfetch_service.pb.go | 527 - .../internal/urlfetch/urlfetch_service.proto | 64 - .../google.golang.org/appengine/namespace.go | 25 - .../google.golang.org/appengine/socket/doc.go | 10 - .../appengine/socket/socket_classic.go | 290 - .../appengine/socket/socket_vm.go | 64 - vendor/google.golang.org/appengine/timeout.go | 20 - .../appengine/travis_install.sh | 18 - .../appengine/travis_test.sh | 12 - .../appengine/urlfetch/urlfetch.go | 210 - .../api/distribution/distribution.pb.go | 638 -- .../genproto/googleapis/api/label/label.pb.go | 140 - .../googleapis/api/launch_stage.pb.go | 113 - .../googleapis/api/metric/metric.pb.go | 535 - .../api/monitoredres/monitored_resource.pb.go | 306 - .../container/v1/cluster_service.pb.go | 9166 ----------------- .../devtools/cloudtrace/v2/trace.pb.go | 1274 --- .../devtools/cloudtrace/v2/tracing.pb.go | 249 - .../googleapis/monitoring/v3/alert.pb.go | 862 -- .../monitoring/v3/alert_service.pb.go | 707 -- .../googleapis/monitoring/v3/common.pb.go | 854 -- .../monitoring/v3/dropped_labels.pb.go | 106 - .../googleapis/monitoring/v3/group.pb.go | 165 - .../monitoring/v3/group_service.pb.go | 931 -- .../googleapis/monitoring/v3/metric.pb.go | 236 - .../monitoring/v3/metric_service.pb.go | 1406 --- .../monitoring/v3/mutation_record.pb.go | 101 - .../monitoring/v3/notification.pb.go | 395 - .../monitoring/v3/notification_service.pb.go | 1377 --- .../googleapis/monitoring/v3/service.pb.go | 1553 --- .../monitoring/v3/service_service.pb.go | 1232 --- .../monitoring/v3/span_context.pb.go | 100 - .../googleapis/monitoring/v3/uptime.pb.go | 1019 -- .../monitoring/v3/uptime_service.pb.go | 830 -- .../type/calendarperiod/calendar_period.pb.go | 106 - .../grpclb/grpc_lb_v1/load_balancer.pb.go | 772 -- .../grpc/balancer/grpclb/grpclb.go | 488 - .../grpc/balancer/grpclb/grpclb_config.go | 66 - .../grpc/balancer/grpclb/grpclb_picker.go | 202 - .../balancer/grpclb/grpclb_remote_balancer.go | 407 - .../grpc/balancer/grpclb/grpclb_util.go | 208 - .../grpc/balancer/grpclb/regenerate.sh | 33 - .../grpc/credentials/alts/alts.go | 330 - .../alts/internal/authinfo/authinfo.go | 89 - .../grpc/credentials/alts/internal/common.go | 69 - .../alts/internal/conn/aeadrekey.go | 131 - .../alts/internal/conn/aes128gcm.go | 105 - .../alts/internal/conn/aes128gcmrekey.go | 116 - .../credentials/alts/internal/conn/common.go | 70 - .../credentials/alts/internal/conn/counter.go | 62 - .../credentials/alts/internal/conn/record.go | 271 - .../credentials/alts/internal/conn/utils.go | 63 - .../alts/internal/handshaker/handshaker.go | 375 - .../internal/handshaker/service/service.go | 54 - .../internal/proto/grpc_gcp/altscontext.pb.go | 152 - .../internal/proto/grpc_gcp/handshaker.pb.go | 1105 -- .../grpc_gcp/transport_security_common.pb.go | 184 - .../credentials/alts/internal/regenerate.sh | 35 - .../grpc/credentials/alts/utils.go | 163 - .../grpc/credentials/google/google.go | 125 - .../grpc/credentials/oauth/oauth.go | 185 - vendor/modules.txt | 165 +- 671 files changed, 7449 insertions(+), 116921 deletions(-) delete mode 100644 server/metrics_exporter.go create mode 100644 server/metrics_grpc_handler.go delete mode 100644 vendor/cloud.google.com/go/LICENSE delete mode 100644 vendor/cloud.google.com/go/compute/metadata/metadata.go delete mode 100644 vendor/cloud.google.com/go/container/apiv1/cluster_manager_client.go delete mode 100644 vendor/cloud.google.com/go/container/apiv1/doc.go delete mode 100644 vendor/cloud.google.com/go/internal/version/update_version.sh delete mode 100644 vendor/cloud.google.com/go/internal/version/version.go delete mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/alert_policy_client.go delete mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/doc.go delete mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/group_client.go delete mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/metric_client.go delete mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/notification_channel_client.go delete mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/path_funcs.go delete mode 100644 vendor/cloud.google.com/go/monitoring/apiv3/uptime_check_client.go delete mode 100644 vendor/cloud.google.com/go/trace/apiv2/doc.go delete mode 100644 vendor/cloud.google.com/go/trace/apiv2/path_funcs.go delete mode 100644 vendor/cloud.google.com/go/trace/apiv2/trace_client.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/prometheus/.gitignore delete mode 100644 vendor/contrib.go.opencensus.io/exporter/prometheus/.travis.yml delete mode 100644 vendor/contrib.go.opencensus.io/exporter/prometheus/Makefile delete mode 100644 vendor/contrib.go.opencensus.io/exporter/prometheus/README.md delete mode 100644 vendor/contrib.go.opencensus.io/exporter/prometheus/go.mod delete mode 100644 vendor/contrib.go.opencensus.io/exporter/prometheus/go.sum delete mode 100644 vendor/contrib.go.opencensus.io/exporter/prometheus/prometheus.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/prometheus/sanitize.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/.gitignore delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/.travis.yml delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/AUTHORS delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/CONTRIBUTING.md delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/LICENSE delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/Makefile delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/README.md delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/RESOURCE.md delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/go.mod delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/go.sum delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/label.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_batcher.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_proto.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_test_utils.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/aws_identity_doc_utils.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/gcp_metadata_config.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/monitored_resources.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/resource.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/sanitize.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/stackdriver.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/stats.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/trace.go delete mode 100644 vendor/contrib.go.opencensus.io/exporter/stackdriver/trace_proto.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/LICENSE.txt delete mode 100644 vendor/github.com/aws/aws-sdk-go/NOTICE.txt delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awsutil/copy.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awsutil/prettify.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/client/client.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/client/logger.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/config.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/context_1_5.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/context_1_9.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/context_background_1_5.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/context_background_1_7.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/context_sleep.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/convert_types.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/corehandlers/param_validator.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/web_identity_provider.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/doc.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/dep_service_ids.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/doc.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/errors.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/jsonvalue.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/logger.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request_context.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request_context_1_6.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/timeout_read_closer.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/validation.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/request/waiter.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_5.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_6.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/credentials.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/doc.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/session.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/signer/v4/options.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/signer/v4/uri_path.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/types.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/url.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/url_1_7.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/aws/version.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/ast.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/comma_token.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/comment_token.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/doc.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/empty_token.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/expression.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/fuzz.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/ini.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/ini_lexer.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/newline_token.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/number_helper.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/op_tokens.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/parse_error.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/parse_stack.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/sep_tokens.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/skipper.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/statement.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/value_util.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/visitor.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/walker.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/ini/ws_token.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.6.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.7.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor_go1.9.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/sdkrand/locked_source.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/ecs_container.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/shared_config.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/host.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/host_prefix.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/idempotency.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/jsonvalue.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/payload.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/rest/payload.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/timestamp.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/service/sts/api.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/service/sts/customizations.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/service/sts/doc.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/service/sts/errors.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/service/sts/service.go delete mode 100644 vendor/github.com/aws/aws-sdk-go/service/sts/stsiface/interface.go delete mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/AUTHORS delete mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/LICENSE delete mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1/common.pb.go delete mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1/metrics.pb.go delete mode 100644 vendor/github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1/resource.pb.go delete mode 100644 vendor/github.com/golang/groupcache/LICENSE delete mode 100644 vendor/github.com/golang/groupcache/lru/lru.go delete mode 100644 vendor/github.com/google/go-cmp/LICENSE delete mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/compare.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/export_panic.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/export_unsafe.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/function/func.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/value/sort.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/internal/value/zero.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/options.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/path.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/report.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/report_compare.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/report_reflect.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/report_slices.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/report_text.go delete mode 100644 vendor/github.com/google/go-cmp/cmp/report_value.go delete mode 100644 vendor/github.com/googleapis/gax-go/v2/LICENSE delete mode 100644 vendor/github.com/googleapis/gax-go/v2/call_option.go delete mode 100644 vendor/github.com/googleapis/gax-go/v2/gax.go delete mode 100644 vendor/github.com/googleapis/gax-go/v2/go.mod delete mode 100644 vendor/github.com/googleapis/gax-go/v2/go.sum delete mode 100644 vendor/github.com/googleapis/gax-go/v2/header.go delete mode 100644 vendor/github.com/googleapis/gax-go/v2/invoke.go delete mode 100644 vendor/github.com/jmespath/go-jmespath/.gitignore delete mode 100644 vendor/github.com/jmespath/go-jmespath/.travis.yml delete mode 100644 vendor/github.com/jmespath/go-jmespath/LICENSE delete mode 100644 vendor/github.com/jmespath/go-jmespath/Makefile delete mode 100644 vendor/github.com/jmespath/go-jmespath/README.md delete mode 100644 vendor/github.com/jmespath/go-jmespath/api.go delete mode 100644 vendor/github.com/jmespath/go-jmespath/astnodetype_string.go delete mode 100644 vendor/github.com/jmespath/go-jmespath/functions.go delete mode 100644 vendor/github.com/jmespath/go-jmespath/interpreter.go delete mode 100644 vendor/github.com/jmespath/go-jmespath/lexer.go delete mode 100644 vendor/github.com/jmespath/go-jmespath/parser.go delete mode 100644 vendor/github.com/jmespath/go-jmespath/toktype_string.go delete mode 100644 vendor/github.com/jmespath/go-jmespath/util.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/AUTHORS.md rename vendor/{contrib.go.opencensus.io/exporter/prometheus => github.com/m3db/prometheus_client_golang}/LICENSE (100%) rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/NOTICE (100%) rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/.gitignore (100%) rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/README.md (100%) create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/collector.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/counter.go rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/desc.go (81%) rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/doc.go (66%) rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/expvar_collector.go (100%) rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/fnv.go (50%) create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/gauge.go rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/go_collector.go (75%) rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/histogram.go (50%) rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/http.go (69%) rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/metric.go (67%) create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/process_collector.go create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/promhttp/http.go rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/registry.go (53%) rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/summary.go (65%) create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/untyped.go rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_golang}/prometheus/value.go (66%) create mode 100644 vendor/github.com/m3db/prometheus_client_golang/prometheus/vec.go rename vendor/github.com/{prometheus/client_golang => m3db/prometheus_client_model}/LICENSE (100%) rename vendor/github.com/{prometheus/client_model => m3db/prometheus_client_model}/NOTICE (100%) create mode 100644 vendor/github.com/m3db/prometheus_client_model/go/metrics.pb.go rename vendor/github.com/{prometheus/client_model => m3db/prometheus_common}/LICENSE (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/NOTICE (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/expfmt/decode.go (99%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/expfmt/encode.go (95%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/expfmt/expfmt.go (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/expfmt/fuzz.go (100%) create mode 100644 vendor/github.com/m3db/prometheus_common/expfmt/text_create.go rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/expfmt/text_parse.go (99%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/internal/bitbucket.org/ww/goautoneg/README.txt (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/internal/bitbucket.org/ww/goautoneg/autoneg.go (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/model/alert.go (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/model/fingerprinting.go (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/model/fnv.go (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/model/labels.go (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/model/labelset.go (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/model/metric.go (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/model/model.go (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/model/signature.go (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/model/silence.go (100%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/model/time.go (99%) rename vendor/github.com/{prometheus/common => m3db/prometheus_common}/model/value.go (100%) create mode 100644 vendor/github.com/m3db/prometheus_procfs/.travis.yml create mode 100644 vendor/github.com/m3db/prometheus_procfs/AUTHORS.md rename vendor/github.com/{prometheus/procfs => m3db/prometheus_procfs}/CONTRIBUTING.md (81%) rename vendor/github.com/{prometheus/common => m3db/prometheus_procfs}/LICENSE (100%) create mode 100644 vendor/github.com/m3db/prometheus_procfs/Makefile rename vendor/github.com/{prometheus/procfs => m3db/prometheus_procfs}/NOTICE (100%) rename vendor/github.com/{prometheus/procfs => m3db/prometheus_procfs}/README.md (78%) rename vendor/github.com/{prometheus/procfs => m3db/prometheus_procfs}/doc.go (100%) create mode 100644 vendor/github.com/m3db/prometheus_procfs/fs.go rename vendor/github.com/{prometheus/procfs => m3db/prometheus_procfs}/ipvs.go (78%) rename vendor/github.com/{prometheus/procfs => m3db/prometheus_procfs}/mdstat.go (85%) rename vendor/github.com/{prometheus/procfs => m3db/prometheus_procfs}/mountstats.go (86%) rename vendor/github.com/{prometheus/procfs => m3db/prometheus_procfs}/proc.go (80%) rename vendor/github.com/{prometheus/procfs => m3db/prometheus_procfs}/proc_io.go (63%) rename vendor/github.com/{prometheus/procfs => m3db/prometheus_procfs}/proc_limits.go (78%) rename vendor/github.com/{prometheus/procfs => m3db/prometheus_procfs}/proc_stat.go (88%) create mode 100644 vendor/github.com/m3db/prometheus_procfs/stat.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/collector.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/counter.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/gauge.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/labels.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/observer.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_1_8.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/timer.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/untyped.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/vec.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/wrap.go delete mode 100644 vendor/github.com/prometheus/client_model/go/metrics.pb.go delete mode 100644 vendor/github.com/prometheus/common/expfmt/text_create.go delete mode 100644 vendor/github.com/prometheus/procfs/.gitignore delete mode 100644 vendor/github.com/prometheus/procfs/LICENSE delete mode 100644 vendor/github.com/prometheus/procfs/MAINTAINERS.md delete mode 100644 vendor/github.com/prometheus/procfs/Makefile delete mode 100644 vendor/github.com/prometheus/procfs/Makefile.common delete mode 100644 vendor/github.com/prometheus/procfs/buddyinfo.go delete mode 100644 vendor/github.com/prometheus/procfs/fixtures.ttar delete mode 100644 vendor/github.com/prometheus/procfs/fs.go delete mode 100644 vendor/github.com/prometheus/procfs/go.mod delete mode 100644 vendor/github.com/prometheus/procfs/internal/util/parse.go delete mode 100644 vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go delete mode 100644 vendor/github.com/prometheus/procfs/net_dev.go delete mode 100644 vendor/github.com/prometheus/procfs/nfs/nfs.go delete mode 100644 vendor/github.com/prometheus/procfs/nfs/parse.go delete mode 100644 vendor/github.com/prometheus/procfs/nfs/parse_nfs.go delete mode 100644 vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_ns.go delete mode 100644 vendor/github.com/prometheus/procfs/stat.go delete mode 100644 vendor/github.com/prometheus/procfs/ttar delete mode 100644 vendor/github.com/prometheus/procfs/xfrm.go delete mode 100644 vendor/github.com/prometheus/procfs/xfs/parse.go delete mode 100644 vendor/github.com/prometheus/procfs/xfs/xfs.go create mode 100644 vendor/github.com/uber-go/tally/.gitignore create mode 100644 vendor/github.com/uber-go/tally/.travis.yml create mode 100644 vendor/github.com/uber-go/tally/LICENSE create mode 100644 vendor/github.com/uber-go/tally/Makefile create mode 100644 vendor/github.com/uber-go/tally/README.md create mode 100644 vendor/github.com/uber-go/tally/check_license.sh create mode 100644 vendor/github.com/uber-go/tally/glide.lock create mode 100644 vendor/github.com/uber-go/tally/glide.yaml create mode 100644 vendor/github.com/uber-go/tally/histogram.go create mode 100644 vendor/github.com/uber-go/tally/key_gen.go create mode 100644 vendor/github.com/uber-go/tally/pool.go create mode 100644 vendor/github.com/uber-go/tally/prometheus/README.md create mode 100644 vendor/github.com/uber-go/tally/prometheus/config.go create mode 100644 vendor/github.com/uber-go/tally/prometheus/reporter.go create mode 100644 vendor/github.com/uber-go/tally/prometheus/sanitize.go create mode 100644 vendor/github.com/uber-go/tally/reporter.go create mode 100644 vendor/github.com/uber-go/tally/sanitize.go create mode 100644 vendor/github.com/uber-go/tally/scope.go create mode 100644 vendor/github.com/uber-go/tally/scope_registry.go create mode 100644 vendor/github.com/uber-go/tally/stats.go create mode 100644 vendor/github.com/uber-go/tally/types.go delete mode 100644 vendor/go.opencensus.io/.gitignore delete mode 100644 vendor/go.opencensus.io/.travis.yml delete mode 100644 vendor/go.opencensus.io/AUTHORS delete mode 100644 vendor/go.opencensus.io/CONTRIBUTING.md delete mode 100644 vendor/go.opencensus.io/LICENSE delete mode 100644 vendor/go.opencensus.io/Makefile delete mode 100644 vendor/go.opencensus.io/README.md delete mode 100644 vendor/go.opencensus.io/appveyor.yml delete mode 100644 vendor/go.opencensus.io/go.mod delete mode 100644 vendor/go.opencensus.io/go.sum delete mode 100644 vendor/go.opencensus.io/internal/internal.go delete mode 100644 vendor/go.opencensus.io/internal/sanitize.go delete mode 100644 vendor/go.opencensus.io/internal/tagencoding/tagencoding.go delete mode 100644 vendor/go.opencensus.io/internal/traceinternals.go delete mode 100644 vendor/go.opencensus.io/metric/metricdata/doc.go delete mode 100644 vendor/go.opencensus.io/metric/metricdata/exemplar.go delete mode 100644 vendor/go.opencensus.io/metric/metricdata/label.go delete mode 100644 vendor/go.opencensus.io/metric/metricdata/metric.go delete mode 100644 vendor/go.opencensus.io/metric/metricdata/point.go delete mode 100644 vendor/go.opencensus.io/metric/metricdata/type_string.go delete mode 100644 vendor/go.opencensus.io/metric/metricdata/unit.go delete mode 100644 vendor/go.opencensus.io/metric/metricexport/doc.go delete mode 100644 vendor/go.opencensus.io/metric/metricexport/export.go delete mode 100644 vendor/go.opencensus.io/metric/metricexport/reader.go delete mode 100644 vendor/go.opencensus.io/metric/metricproducer/manager.go delete mode 100644 vendor/go.opencensus.io/metric/metricproducer/producer.go delete mode 100644 vendor/go.opencensus.io/opencensus.go delete mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/client.go delete mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/client_metrics.go delete mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/client_stats_handler.go delete mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/doc.go delete mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/server.go delete mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/server_metrics.go delete mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/server_stats_handler.go delete mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/stats_common.go delete mode 100644 vendor/go.opencensus.io/plugin/ocgrpc/trace_common.go delete mode 100644 vendor/go.opencensus.io/plugin/ochttp/client.go delete mode 100644 vendor/go.opencensus.io/plugin/ochttp/client_stats.go delete mode 100644 vendor/go.opencensus.io/plugin/ochttp/doc.go delete mode 100644 vendor/go.opencensus.io/plugin/ochttp/propagation/b3/b3.go delete mode 100644 vendor/go.opencensus.io/plugin/ochttp/route.go delete mode 100644 vendor/go.opencensus.io/plugin/ochttp/server.go delete mode 100644 vendor/go.opencensus.io/plugin/ochttp/span_annotating_client_trace.go delete mode 100644 vendor/go.opencensus.io/plugin/ochttp/stats.go delete mode 100644 vendor/go.opencensus.io/plugin/ochttp/trace.go delete mode 100644 vendor/go.opencensus.io/plugin/ochttp/wrapped_body.go delete mode 100644 vendor/go.opencensus.io/resource/resource.go delete mode 100644 vendor/go.opencensus.io/resource/resourcekeys/const.go delete mode 100644 vendor/go.opencensus.io/stats/doc.go delete mode 100644 vendor/go.opencensus.io/stats/internal/record.go delete mode 100644 vendor/go.opencensus.io/stats/measure.go delete mode 100644 vendor/go.opencensus.io/stats/measure_float64.go delete mode 100644 vendor/go.opencensus.io/stats/measure_int64.go delete mode 100644 vendor/go.opencensus.io/stats/record.go delete mode 100644 vendor/go.opencensus.io/stats/units.go delete mode 100644 vendor/go.opencensus.io/stats/view/aggregation.go delete mode 100644 vendor/go.opencensus.io/stats/view/aggregation_data.go delete mode 100644 vendor/go.opencensus.io/stats/view/collector.go delete mode 100644 vendor/go.opencensus.io/stats/view/doc.go delete mode 100644 vendor/go.opencensus.io/stats/view/export.go delete mode 100644 vendor/go.opencensus.io/stats/view/view.go delete mode 100644 vendor/go.opencensus.io/stats/view/view_to_metric.go delete mode 100644 vendor/go.opencensus.io/stats/view/worker.go delete mode 100644 vendor/go.opencensus.io/stats/view/worker_commands.go delete mode 100644 vendor/go.opencensus.io/tag/context.go delete mode 100644 vendor/go.opencensus.io/tag/doc.go delete mode 100644 vendor/go.opencensus.io/tag/key.go delete mode 100644 vendor/go.opencensus.io/tag/map.go delete mode 100644 vendor/go.opencensus.io/tag/map_codec.go delete mode 100644 vendor/go.opencensus.io/tag/metadata.go delete mode 100644 vendor/go.opencensus.io/tag/profile_19.go delete mode 100644 vendor/go.opencensus.io/tag/profile_not19.go delete mode 100644 vendor/go.opencensus.io/tag/validate.go delete mode 100644 vendor/go.opencensus.io/trace/basetypes.go delete mode 100644 vendor/go.opencensus.io/trace/config.go delete mode 100644 vendor/go.opencensus.io/trace/doc.go delete mode 100644 vendor/go.opencensus.io/trace/evictedqueue.go delete mode 100644 vendor/go.opencensus.io/trace/export.go delete mode 100644 vendor/go.opencensus.io/trace/internal/internal.go delete mode 100644 vendor/go.opencensus.io/trace/lrumap.go delete mode 100644 vendor/go.opencensus.io/trace/propagation/propagation.go delete mode 100644 vendor/go.opencensus.io/trace/sampling.go delete mode 100644 vendor/go.opencensus.io/trace/spanbucket.go delete mode 100644 vendor/go.opencensus.io/trace/spanstore.go delete mode 100644 vendor/go.opencensus.io/trace/status_codes.go delete mode 100644 vendor/go.opencensus.io/trace/trace.go delete mode 100644 vendor/go.opencensus.io/trace/trace_go11.go delete mode 100644 vendor/go.opencensus.io/trace/trace_nongo11.go delete mode 100644 vendor/go.opencensus.io/trace/tracestate/tracestate.go delete mode 100644 vendor/go.opencensus.io/zpages/internal/gen.go delete mode 100644 vendor/go.opencensus.io/zpages/internal/resources.go delete mode 100644 vendor/go.opencensus.io/zpages/rpcz.go delete mode 100644 vendor/go.opencensus.io/zpages/templates.go delete mode 100644 vendor/go.opencensus.io/zpages/tracez.go delete mode 100644 vendor/go.opencensus.io/zpages/zpages.go delete mode 100644 vendor/golang.org/x/net/context/context.go delete mode 100644 vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go delete mode 100644 vendor/golang.org/x/net/context/go17.go delete mode 100644 vendor/golang.org/x/net/context/go19.go delete mode 100644 vendor/golang.org/x/net/context/pre_go17.go delete mode 100644 vendor/golang.org/x/net/context/pre_go19.go delete mode 100644 vendor/golang.org/x/oauth2/.travis.yml delete mode 100644 vendor/golang.org/x/oauth2/AUTHORS delete mode 100644 vendor/golang.org/x/oauth2/CONTRIBUTING.md delete mode 100644 vendor/golang.org/x/oauth2/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/oauth2/LICENSE delete mode 100644 vendor/golang.org/x/oauth2/README.md delete mode 100644 vendor/golang.org/x/oauth2/go.mod delete mode 100644 vendor/golang.org/x/oauth2/go.sum delete mode 100644 vendor/golang.org/x/oauth2/google/appengine.go delete mode 100644 vendor/golang.org/x/oauth2/google/appengine_gen1.go delete mode 100644 vendor/golang.org/x/oauth2/google/appengine_gen2_flex.go delete mode 100644 vendor/golang.org/x/oauth2/google/default.go delete mode 100644 vendor/golang.org/x/oauth2/google/doc.go delete mode 100644 vendor/golang.org/x/oauth2/google/google.go delete mode 100644 vendor/golang.org/x/oauth2/google/jwt.go delete mode 100644 vendor/golang.org/x/oauth2/google/sdk.go delete mode 100644 vendor/golang.org/x/oauth2/internal/client_appengine.go delete mode 100644 vendor/golang.org/x/oauth2/internal/doc.go delete mode 100644 vendor/golang.org/x/oauth2/internal/oauth2.go delete mode 100644 vendor/golang.org/x/oauth2/internal/token.go delete mode 100644 vendor/golang.org/x/oauth2/internal/transport.go delete mode 100644 vendor/golang.org/x/oauth2/jws/jws.go delete mode 100644 vendor/golang.org/x/oauth2/jwt/jwt.go delete mode 100644 vendor/golang.org/x/oauth2/oauth2.go delete mode 100644 vendor/golang.org/x/oauth2/token.go delete mode 100644 vendor/golang.org/x/oauth2/transport.go delete mode 100644 vendor/golang.org/x/sync/AUTHORS delete mode 100644 vendor/golang.org/x/sync/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/sync/LICENSE delete mode 100644 vendor/golang.org/x/sync/PATENTS delete mode 100644 vendor/golang.org/x/sync/semaphore/semaphore.go delete mode 100644 vendor/google.golang.org/api/AUTHORS delete mode 100644 vendor/google.golang.org/api/CONTRIBUTORS delete mode 100644 vendor/google.golang.org/api/LICENSE delete mode 100644 vendor/google.golang.org/api/googleapi/transport/apikey.go delete mode 100644 vendor/google.golang.org/api/internal/creds.go delete mode 100644 vendor/google.golang.org/api/internal/pool.go delete mode 100644 vendor/google.golang.org/api/internal/service-account.json delete mode 100644 vendor/google.golang.org/api/internal/settings.go delete mode 100644 vendor/google.golang.org/api/iterator/iterator.go delete mode 100644 vendor/google.golang.org/api/option/credentials_go19.go delete mode 100644 vendor/google.golang.org/api/option/credentials_notgo19.go delete mode 100644 vendor/google.golang.org/api/option/option.go delete mode 100644 vendor/google.golang.org/api/support/bundler/bundler.go delete mode 100644 vendor/google.golang.org/api/transport/dial.go delete mode 100644 vendor/google.golang.org/api/transport/doc.go delete mode 100644 vendor/google.golang.org/api/transport/go19.go delete mode 100644 vendor/google.golang.org/api/transport/grpc/dial.go delete mode 100644 vendor/google.golang.org/api/transport/grpc/dial_appengine.go delete mode 100644 vendor/google.golang.org/api/transport/grpc/dial_socketopt.go delete mode 100644 vendor/google.golang.org/api/transport/http/dial.go delete mode 100644 vendor/google.golang.org/api/transport/http/dial_appengine.go delete mode 100644 vendor/google.golang.org/api/transport/http/internal/propagation/http.go delete mode 100644 vendor/google.golang.org/api/transport/not_go19.go delete mode 100644 vendor/google.golang.org/appengine/.travis.yml delete mode 100644 vendor/google.golang.org/appengine/CONTRIBUTING.md delete mode 100644 vendor/google.golang.org/appengine/LICENSE delete mode 100644 vendor/google.golang.org/appengine/README.md delete mode 100644 vendor/google.golang.org/appengine/appengine.go delete mode 100644 vendor/google.golang.org/appengine/appengine_vm.go delete mode 100644 vendor/google.golang.org/appengine/errors.go delete mode 100644 vendor/google.golang.org/appengine/go.mod delete mode 100644 vendor/google.golang.org/appengine/go.sum delete mode 100644 vendor/google.golang.org/appengine/identity.go delete mode 100644 vendor/google.golang.org/appengine/internal/api.go delete mode 100644 vendor/google.golang.org/appengine/internal/api_classic.go delete mode 100644 vendor/google.golang.org/appengine/internal/api_common.go delete mode 100644 vendor/google.golang.org/appengine/internal/app_id.go delete mode 100644 vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.proto delete mode 100644 vendor/google.golang.org/appengine/internal/base/api_base.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/base/api_base.proto delete mode 100644 vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto delete mode 100644 vendor/google.golang.org/appengine/internal/identity.go delete mode 100644 vendor/google.golang.org/appengine/internal/identity_classic.go delete mode 100644 vendor/google.golang.org/appengine/internal/identity_flex.go delete mode 100644 vendor/google.golang.org/appengine/internal/identity_vm.go delete mode 100644 vendor/google.golang.org/appengine/internal/internal.go delete mode 100644 vendor/google.golang.org/appengine/internal/log/log_service.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/log/log_service.proto delete mode 100644 vendor/google.golang.org/appengine/internal/main.go delete mode 100644 vendor/google.golang.org/appengine/internal/main_common.go delete mode 100644 vendor/google.golang.org/appengine/internal/main_vm.go delete mode 100644 vendor/google.golang.org/appengine/internal/metadata.go delete mode 100644 vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/modules/modules_service.proto delete mode 100644 vendor/google.golang.org/appengine/internal/net.go delete mode 100644 vendor/google.golang.org/appengine/internal/regen.sh delete mode 100644 vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto delete mode 100644 vendor/google.golang.org/appengine/internal/socket/socket_service.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/socket/socket_service.proto delete mode 100644 vendor/google.golang.org/appengine/internal/transaction.go delete mode 100644 vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto delete mode 100644 vendor/google.golang.org/appengine/namespace.go delete mode 100644 vendor/google.golang.org/appengine/socket/doc.go delete mode 100644 vendor/google.golang.org/appengine/socket/socket_classic.go delete mode 100644 vendor/google.golang.org/appengine/socket/socket_vm.go delete mode 100644 vendor/google.golang.org/appengine/timeout.go delete mode 100644 vendor/google.golang.org/appengine/travis_install.sh delete mode 100644 vendor/google.golang.org/appengine/travis_test.sh delete mode 100644 vendor/google.golang.org/appengine/urlfetch/urlfetch.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/distribution/distribution.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/label/label.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/launch_stage.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/metric/metric.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/api/monitoredres/monitored_resource.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/container/v1/cluster_service.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/devtools/cloudtrace/v2/trace.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/devtools/cloudtrace/v2/tracing.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/alert.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/alert_service.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/common.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/dropped_labels.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/group.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/group_service.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/metric.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/metric_service.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/mutation_record.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/notification.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/notification_service.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/service.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/service_service.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/span_context.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/uptime.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/monitoring/v3/uptime_service.pb.go delete mode 100644 vendor/google.golang.org/genproto/googleapis/type/calendarperiod/calendar_period.pb.go delete mode 100644 vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer.pb.go delete mode 100644 vendor/google.golang.org/grpc/balancer/grpclb/grpclb.go delete mode 100644 vendor/google.golang.org/grpc/balancer/grpclb/grpclb_config.go delete mode 100644 vendor/google.golang.org/grpc/balancer/grpclb/grpclb_picker.go delete mode 100644 vendor/google.golang.org/grpc/balancer/grpclb/grpclb_remote_balancer.go delete mode 100644 vendor/google.golang.org/grpc/balancer/grpclb/grpclb_util.go delete mode 100644 vendor/google.golang.org/grpc/balancer/grpclb/regenerate.sh delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/alts.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/authinfo/authinfo.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/common.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcm.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/counter.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/conn/utils.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/internal/regenerate.sh delete mode 100644 vendor/google.golang.org/grpc/credentials/alts/utils.go delete mode 100644 vendor/google.golang.org/grpc/credentials/google/google.go delete mode 100644 vendor/google.golang.org/grpc/credentials/oauth/oauth.go diff --git a/CHANGELOG.md b/CHANGELOG.md index b6b4f3271..b51e11ffc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,13 +10,18 @@ The format is based on [keep a changelog](http://keepachangelog.com) and this pr - Independent config flags for socket read and write buffer sizes. ### Changed +- Replace metrics implementation. - Strictly validate authoritative match create parameter encoding. - Only perform user account updates if fields have changed. +- Developer console status snapshot gauges more accurately reflect current server metrics. - Build with Go 1.14.2 release. ### Fixed - Ensure runtime environment values do not appear multiple times in the devconsole configuration view. - Channel presence events now populate room, group, and direct message fields. +- Developer console status graphs correctly show a fixed time window of metrics. +- Expose friend deletion in developer console user detail view. +- Expose group membership deletion in developer console user detail view. ## [2.11.1] - 2020-03-29 ### Changed diff --git a/console/a_console-packr.go b/console/a_console-packr.go index ba7c973a1..598f41927 100644 --- a/console/a_console-packr.go +++ b/console/a_console-packr.go @@ -7,20 +7,20 @@ import "github.com/gobuffalo/packr" // You can use the "packr clean" command to clean up this, // and any other packr generated files. func init() { - packr.PackJSONBytes("./ui/build", "asset-manifest.json", "\"H4sIAAAAAAAA/5yT0U6DMBSG7/cUhGtXSuFQ5tsczkook7q0nZoYfXZjdQywzGWXtN/3H85PeN8kSTqgNoycSx+TNHMevaaMnMvCOW8VcgE5o+5kDgF7GKV+5vS/CjSCA8qz0s8NNuDxJiuAwbQn4/WgPuMzZ7cEUOZFBePUhRuZvuZf5k86EUzKShS15JNCFr1FmWlQ/82AaIGaXXtpaf5aMeL/kMh+a1QI02av3ljnh6dgTR7D9dEqQurUdkCjW+U8kyUJqngNeSHaOq/yfYHYiJJXIOsad+dF7jN/FlT2RZPavj7bg7JjM39Ob/k2yz6ucsvAlR8glnkN3Xx8BQAA//8dDPqRZwMAAA==\"") + packr.PackJSONBytes("./ui/build", "asset-manifest.json", "\"H4sIAAAAAAAA/5yT0U6DMBSG7/cUC9euFLZS9G1Oz05Dma1L26mJ0Wc3VscAy1y8pP2+/3B+wttqvS4sGMcwhOJhXZQhQjRYYghlOueagNeiYtid3CFhd4PUT5z+rJDmotX0o/RTg1k43mQlMJn+5KKx9JGfOblFIXbVthHD1Jmbmb7kX+aPOqmZlE29bSUfFTLrLcuMg/ovRtRaoLrXl5amr5Uj/g7J7LdEpTDj9vTKumgfkzV6TNdHTwjY0caCM5pCZFrVe6ik1LLZ8VYBqAqEAM5bRYSI50X+Z34vSP7ZIG1envyB/NDMr9Nbvs28j6vcPHDhB8hlXkNX758BAAD//wUI9JRnAwAA\"") packr.PackJSONBytes("./ui/build", "favicon.ico", "\"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\"") - packr.PackJSONBytes("./ui/build", "index.html", "\"H4sIAAAAAAAA/4xW32/juBH+V2QVEESEpuW0aba26D606MMC7RbIvRwEYUFTw4gJTQpDyrnA0f9+oGTZ2b3N3QVBxB/zffNxZjhMuWicDK8dJG04mF0Z/yZG2Eeegk13ZQui2ZUHCCKRrUAPgad9UMtP6WpXGm2fEwTDU986DLIPiZbOpkmLoHi6UuIY50xLF81HFisOwNOjhpfOYUgT6WwAG3j6opvQ8gaOWsJynFBtddDCLL0UBvia+ha1fV4Gt1Q6cPs9aWjhAEvpjMN3vH/5z/jzrd6DsFqBDxep8wJ78s5G26CDgd2/4QjGdYDJv5z1zkDylvxPPIuDSB4Aj4DlajKcuM9kPoig5Up6v7pl9/d/v/3rp/uCyba3z0x6n55jFl4N+BYgpB/CD0JbVigQxe3d+vcZVlOq9q553ZXWeYm6C7ufXZ9YgCYJLgEr9gaSz+IoHsbduIi9TUKrfSK6jpWrC7Bs9DHRDU/RuZG+0cdded5cqN7KoJ3NDTnN4wRyICflMD8KTJAGajlURU0dh2pd055DdVtTxQuqeVVvVWmZAfsY2q26uSGB20rVtKtCnWWadb1v8zipipqMq7zYRnJMtE0c+bJ/AhlYhy64WL+sFf7Li/0/xmyFVyaFMbmjSLIsNxXW3FVYk5HBZ5nPgWz17J5o5lutQk5yskUIPdpEjgqY6Drzmkvav71VNaEiJ8PlvCK/Hhco8mKLpZw58ebmuhu4rLCmli8K6vh668ow27loF216HipXb4sF513V11mWW75Yk8FmWS6Z74yWkONySdeEAle5Yp6HGBwynCXDMPk6DbTjp/WmGKgcAz0LVjFBWuWhgpqcQXHM4Jd4Gf12TByPS/ykN0DNZrGm583NaRjm4JgIGiOMM5YivY4VochMPO1lbVDswA1VTPJAFWv4pYSAIg3kpJiLQ/L2dk5tA0pbmBM6mp3A9gfAWMabRUEfIWzCQAaqGL7jI6e0txO6SRc8VodTycPrYe9Mlk1fFtxDQG0ffxKPWfaRx9/a0tNRmB426X9d0xtIB0I/Aqdfv4I/m82wRTHJDVe5SKekrDPIshy5ypEQ+imDOUO41Sr/W9xN3egq5fOZMMviL7t6uoKmWjiLkwgiQG57Y0ikUwzz8JH0QNMGlOhNSL+P+HQKHAi9HQX5MS7XICOZS97Ga4pEsSYP1NL32ZklVlAPbK9tM+qillwuX4gxst+kdCpNyDJ4d9p/XiwurMDO2ofNDzYvFRx1IU1FSpFQjO7cNxV5gfypPhMBkaPj6So936IXbRv3wl5g3wn5/Nk72/1oLfYVajlO7WaMBpLtNOWxqyDz49WfelfkdrzYuhLfdxDIsXI1GV17brexT+VVTcrV3M6nb+JRXl+Yp/g+3d2qO7n/hzq/Lk8+Nvs/QI3P0t3+trgT9+sfAlfTO7Qa/6v4NQAA///P7NFNZQgAAA==\"") + packr.PackJSONBytes("./ui/build", "index.html", "\"H4sIAAAAAAAA/4xWXW/jthL9K7IuIIgITcu5N3dTW3QfWvRhgXYLpC+FICwYahgxoUlhSDkNHP33gpJlZ7ebtkEQ8WPOmcOZ4TDlonEyvHSQtGFvdmX8mxhhH3gKNt2VLYhmV+4hiES2Aj0EnvZBLW/T1a402j4lCIanvnUYZB8SLZ1NkxZB8XSlxCHOmZYumo8sVuyBpwcNz53DkCbS2QA28PRZN6HlDRy0hOU4odrqoIVZeikM8DX1LWr7tAxuqXTg9mvS0MIeltIZh294//PT+POl3r2wWoEPZ6nzAnv0zkbboIOB3Y9wAOM6wOQHZ70zkLwmv4gnsRfJHeABsFxNhhP3icwHEbRcSe9X1+zDh/9f//f2Q8Fk29snJr1PTzELLwZ8CxDSd+F7oS0rFIji+mb99wyrKVX3rnnZldZ5iboLu99dn1iAJgkuASvuDSQfxUHcjbtxEXubhFb7RHQdK1dnYNnoQ6IbnqJzI32jD7vytLlQvZVBO5sbcpzHCeRAjsphfhCYIA3UcqiKmjoO1bqmPYfquqaKF1Tzqt6q0jID9iG0W3V1RQK3lappV4U6yzTret/mcVIVNRlXebGN5Jhomzjy6f4RZGAduuBi/bJW+E/P9leM2QovTApjckeRZFluKqy5q7AmI4PPMp8D2erZPdHMt1qFnORkixB6tIkcFTDRdeYll7R/fa1qQkVOhvN5RX45LlDkxRZLOXPi1dVlN3BZYU0tXxTU8fXWlWG2c9Eu2vQ8VK7eFgvOu6qvsyy3fLEmg82yXDLfGS0hx+WSrgkFrnLFPA8xOGQ4SYZh8nUcaMeP600xUDkGehasYoK0ykMFNTmB4pjBH/Ey+u2YOB6X+FFvgJrNYk1Pm5vjMMzBMRE0RhhnLEV6GStCkZl42vPaoNieG6qY5IEq1vBzCQFFGshRMReH5PX1lNoGlLYwJ3Q0O4Lt94CxjDeLgj5A2ISBDFQxfMNHjmlvJ3STLnisDqeSu5f9vTNZNn1ZcHcBtX34TTxk2Xse/2pLjwdhetikP7umN5AOhL4HTj9/Bn8ym2GLYpIbLnKRTklZZ5BlOXKVIyH0NoM5Q7jVKv9f3E3d6Crl85kwy+Ivu3i6gKZaOImTCCJAbntjSKRTDPPwnvRA0waU6E1Iv474dAocCL0eBfkxLpcgI5lL3sZrikSxJg/U0rfZmSVWUA/sXttm1EUtOV++EGNkv0jpVJqQZfDmtN+fLc6swE7ah803Ns8VHHUhTUVKkVCM7twXFXmG/Ks+EwGRo+PpKj3domdtG/fMnuG+E/Lpo3e2+9Za7CvUcpzazRgNJNtpymNXQebHqz/1rsjteLF1Jb7tIJBj5WoyuvbcbmOfyqualKu5nU/fxKO8vDCP8X26uVY38v47dXpdHn1s9v+Amp4lUMXNrYJvAlfTO7Qa/6v4MwAA//9zarS4ZQgAAA==\"") packr.PackJSONBytes("./ui/build", "manifest.json", "\"H4sIAAAAAAAA/3SPsU7DMBCGdz/FyaxQaBpl6AozCyNC0eFcWquOLzq7kUvVd0fnIMHCDR78fff799UA2HRkyX3Eiewe7AstFHgmgWeOiQPZe5X+xTCywCuecEJ4I1lI1gXvOCa7h3cDAHCtpz4mTmNGXFTYeMdVX5n/Il2xXVu6FnZN2TXQtKVpYduVbfdr5stc2/gJD/RYHjTLVngzAB+1QMoouT9LUHGzlhp8mgNe9CZljAMGjj8fzEeaqHccWBTfPdVZ2Se600H4HIc/wljHmpv5DgAA//9/S1AMRgEAAA==\"") - packr.PackJSONBytes("./ui/build", "precache-manifest.74c2c6085132f8161d3aab24065788a9.js", "\"H4sIAAAAAAAA/6TQXUozMRTG8ftZRZjrkuZjTpJ5X1yCKxApJyc5NLWNMpkRQXTt0qo3grXi/cP/B0/Le5abzcOUCWmbr7EWzm0WV+KmE+K5E0KIfsqPpZX72v8TPY4Y0SEmN3iLyqlBhX71vlum/XGybjPOhdbU2vqApUrFGZUBLWm71DtJrfWdEC+rPwu7DwCiUYD+E9id7XNi4oQmjVFHtjpFMN/3p6XO5ZBfTw4BDNo6+EFIQyKH1gfgwVqNMAZ/5iMjvXfGBq8uO+gX+d2xDoaB4siXvUOEbIO3PjvGADaoFFQiCoaC1vAVKjXlJ7mdD/tTtbv9/xYAAP//PDi8dlMCAAA=\"") - packr.PackJSONBytes("./ui/build", "service-worker.js", "\"H4sIAAAAAAAA/3STUU8rNxCF3/dXTKNKhDSxIYEQQH2oWql9aCtIqKIqBOTYs7tuvJ6tx0tA0P9eOdlwEffmKVJ85puZM2dlr5dBD+boNFUIkeCFmgBzCusVPQ9q2mBAA4zhyWqEDYU1hu8y2Fb9Tc2Rc+ARTaoMWFiOGCCWliG3DsH6HW+DK1B1Dcqb9AdwSY0ziWEsq5VD+O3u7ga00qX1BeT0ERKJRJLOEKGMseYrKQsiUTjpy9vy17od565ECMgRKIdYImgyCJZBNZEGBXoMKqIRcONQMYIhfxShqY2K+KXbbqaAOrqXa7CeIyrTh0qtEXSpfIH82SVYNdYZ0ORzWzRBRUs+YdKyAQehaU3YyepAGpkPbTRU01+4zKAns8xWNYU408HWkbudvZIjBVWgKIgKh6q2LDRVctPeTBsvA253ZDkSYzF6f+KN+Ic7x9ef0RlAR9YBk/84qJS3OXIUF2d6qMcnk/PT0TCfnI5PzUip1fDsZHx+MZmoywTLEq3lC+0s+sg/O2Wrbnpo45Uu02pmc7Fv9JM3U2oido+hwliSAcxzqxPCvWyzgNyayDV5k4xPtID/NsiRtzH5a/o7p5ilg78PfsDb2eXtVK223jK6XDw+7kf5o62EH2GxFJq8VrF7SPP2Bovl8fX71q3A+kJwU9cBmecqeOsL7n5b9pUDB1r14fW/j/4GamKq339pf6onW2zztsN0pPUGn0UZK9fpw2sGkAGsnNJrZzlewUI+3MtH2Zf3cvEglz/ci+3P93LZz1Kn/wMAAP//pSPbIA8EAAA=\"") + packr.PackJSONBytes("./ui/build", "precache-manifest.fb2da177f76408baab1a55a008beeccc.js", "\"H4sIAAAAAAAA/6TQUUrsMBTG8feuIvR5yDRJT5Pci0twBSJDcnIOk7GN0rQiiK5dZtQXwXHE94//D75KI8vd7mEmDLin61AyU13ElbhphHhuhBCinekx13xf2n+i1coSWkxae8QYLFnj2s37bp3H42Rbl7Bk3GKt2ynkIjum0GlQEvdruZNYa9sI8bL5s3D4BIg7cEwfwOFsnxMjp6CTjyqyUSmC/r4/r2XJE72eHATolRngByH1CYdgrAPujVEBvLNnPtLS2kEbZ7vLDvpF/nCsg2bA6Pmyd0DFjnVvAzJ5Ms7oPoFRFgef/OC/QrkkepL7ZRpP1eb2/1sAAAD//zYXUT9TAgAA\"") + packr.PackJSONBytes("./ui/build", "service-worker.js", "\"H4sIAAAAAAAA/3ST3W7bOBCF7/UUs8YCcbw2mZ/NzybYi6IF2ou2SOwURuE4AUWOJNYUR+VQcYKk717QltMgra8MmGe+mTlzJAeDDAYwRaepRogED9QGmFJY5HQ/amiJAQ0whjurEZYUFhj+ymBV9ZXaHefAI5pUGbC0HDFArCxDYR2C9WveEnNQTQPKm/QHcEWtM4lhLKvcIXy4uroArXRlfQkFvYREIpGkE0SoYmz4TMqSSJRO+uqyet9041xVCAE5AhUQKwRNBsEyqDbSqESPQUU0Ai4cKkYw5HcitI1REX91W88UUEf3cA7Wc0RlhlCrBYKulC+RX7sEeWudAU2+sGUbVLTkEyYtG3AU2s6EtawJpJF520YHavyOqwwGMsts3VCIEx1sE7nf2yg5UlAlipKodKgay0JTLZfdzbTxMuBqR5aH4lgcPj/xUnzj3u75a3QG0JNNwOQ/jmrlbYEcRZEfGLV/clKcHP+7d5orle+royO1t3eaI2qtEyxLtI4vtLPoI791ytb99NDFK12m00ymYtPojTdjaiP2d6HGWJEBLAqrE8I9rLKA3JnIDXmTjE+0gN9b5MirmHwZf+QUs3Tw58G3eDv573Ks8pW3jK4Qt7ebUT51lfA/zOZCk9cq9rdpnp5gNt89f966E1hfCm6bJiDzVAVvfcn9P8t+c2BLqyE8/njpb6A2pvrNl/ZZ3dlylbc1pietN3gvqli73hAeM4AMIHdKL5zleAYzeXMtb+VQXsvZjZz/cy1WP3/L+TBLnX4GAAD///1yWgMPBAAA\"") packr.PackJSONBytes("./ui/build", "static/css/2.77623870.chunk.css", "\"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\"") packr.PackJSONBytes("./ui/build", "static/css/2.77623870.chunk.css.map", "\"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\"") packr.PackJSONBytes("./ui/build", "static/css/main.0fea0251.chunk.css", "\"H4sIAAAAAAAA/2xPTWrrMBDev1P44V14UhTz2oVCb9BuCj3AWH8ZImnEaEzSGt+9lCbQRXfDfP8z+fd1BndOTEv1ylEmtmOM8djAe6zJmmMBTlit2XTEkL3Grk7E+EFVIA/fT5VhDnlVlzCfUVTM4aoS08VOxx/3NmZKWH9LnOJjhBs+YEnrBb2c7GRMu94aqJlEqNjJtOumKzXCKoFXt3Antj5EWLL8xdKIBapsYxdiSGEQ/29ceuA+iL/Tb+ovI8GIDgSprvfV+j+HMhw4lO3PfjcOnRZ24QVaw5reXp+fCmDVJgYw08NBu9NSz9r1rgu0Ybf/DAAA///A7R/cWAEAAA==\"") packr.PackJSONBytes("./ui/build", "static/css/main.0fea0251.chunk.css.map", "\"H4sIAAAAAAAA/+xSMW/bPBD9K/yYlZIcf20HdWKUeMlQFEXhofZAUZR8EHmnklTsNsh/Lyg5amogKNChUzkI9+69xzve6ZE/GB+AkJf/Cx5o9NoEXn7hxedgfCgUNt5AcWsejKXBGYxFR0XwuuggHsY61+SKg/EE2qo6FKh65VShCQNZU4wwaXUIBWBjTrkOgQvuFGC+ao1ard9e5/owYj8xe8FRuamBfVINA2AXeMmllFLcy+pOfL1JYSUrKT4t0ceq2ojq9k6KvkoidxZJKbbVXaIqKT4k5niz4G3C2+WO/oJ5Vt5LEW5SQi+8TnDSc8FbsIaXrz5pGWpFGA3GNNuamm/scYeM1Ur3nacRm0yTJV+yq8103id2UE0D2JVsNUGnfAc4o6cd7jBvwdgmh5AdyMN3wqgsm5OZVbWxc5HWmlPWeTqWbP1svbLUAb7exHrzbiMvxOC62XCEJh5Ktl6thtOLzrKaYiSXiCk/94g0EGA0fvbq0YdUojGtGm1k/4EbyEeFcak2pj+PxeZXw/mWRRUiedWZ3+lypAgtaBWBzu/9Odb8jTeOXafPi3i2cvG395QdTd1DzC72xZbzb5F/ssgd8v3TjwAAAP//bNtuaegEAAA=\"") packr.PackJSONBytes("./ui/build", "static/js/2.52f5cb9f.chunk.js", "\"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\"") packr.PackJSONBytes("./ui/build", "static/js/2.52f5cb9f.chunk.js.map", "\"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\"") - packr.PackJSONBytes("./ui/build", "static/js/main.5b205a71.chunk.js", "\"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\"") - packr.PackJSONBytes("./ui/build", "static/js/main.5b205a71.chunk.js.map", "\"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\"") + packr.PackJSONBytes("./ui/build", "static/js/main.0ef058fe.chunk.js", "\"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\"") + packr.PackJSONBytes("./ui/build", "static/js/main.0ef058fe.chunk.js.map", "\"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\"") packr.PackJSONBytes("./ui/build", "static/js/runtime~main.c5541365.js", "\"H4sIAAAAAAAA/4xU34vjNhB+718RuyAkMqd1rrelxDv0vfS40mufjDkUR8rqqkhmLN928bp/e5EdO3fbXSgEImt+ffN9o8lM75tog+daDMt5Q5zEYALxL4o2HgxYpKqowSFVuxoUUvW2hgYL6LCqy+bOSqf9Kd6XzXYrDNqqqSFUpmask23f3fP0URW1mG6xKFNyv7F+48SHw2fdRNlSiCE+tlreq+7Dg/+NQqspPspGOccdeMEY15Wv0VW+FlOGlrGWkyi7pbzoZHdvTeSCi5J07Mlv+gmBVG3rHnkP6umpqgVELsa138iv7WogLEq665ectN1erRH7imrwmBVgcVfau7j42eSXfBzGytZlkSGGytWMcY/ZToyeMd7LrnW20ZzevIGdAI2GG9lhTOSI8QJZjxPxOIwQcNjtixH6RPQK2CSBrOG+olpcgtJZ6r/bQLErZ6zpCge7J3D7bAcX434Yx4UcnYImhuMSCxGuZyMgSpe6Xe9GI8+owcgGPRh5xOsIAUEUg5EhHcXT00XaozbW60XQyW3Qvj9rUgen91kBJx33cRQjGEn49UjmvZ+jj3mGmMYjmM3Hx/MhOMbmfxnDx0jWn/5QJ8ZeK/lfXxi+KNfrff4+HHun81HAa8H5p0+6u7gtYVkx443f9D+psmOUZhUN10LAT4wWiXRpDX+XrHmYSuW4NqUZSz95LXWNmtW8oGtIq6i5750TKZ+RxONr2CPkR21U72L+nPO5DT0KeDsh6iZi8mwFJNYNkB6qFkYeeQQPa78khq/GaJQH648TLvBifX4xkeS/ETXlJHzW7c+rxzWrvGAf9y8Y1xlOuAhylQMJoFQuPNPk4vi/Nk0KSDlazG/yiXmLD9Yfw4N80IdWNX/90gXfvnSXNgs4tPPCmdiwopw/kcCild30+OftlXIrLEp1XZ9quxXEbaVqMZVu0ZVpU/GqFuV3Nzffb7rQU6Pfq7a1/vTn778i9T7as/7nrKyXze3tu90PP97Kz508q/bfAAAA//+xcWbT3gUAAA==\"") packr.PackJSONBytes("./ui/build", "static/js/runtime~main.c5541365.js.map", "\"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\"") } diff --git a/console/ui/src/routes/status/index.tsx b/console/ui/src/routes/status/index.tsx index c8057ce9a..699b32a0b 100644 --- a/console/ui/src/routes/status/index.tsx +++ b/console/ui/src/routes/status/index.tsx @@ -45,16 +45,43 @@ type State = { class Status extends Component { public constructor(props: Props) { super(props); + let labels = []; + let latency_ms = []; + let rate_sec = []; + let input_kbs = []; + let output_kbs = []; + const now = new Date(); + for (let i = 0; i < 24; i++) { + const d = new Date(now.getTime() - (i * 5000)); + const t = d.valueOf(); + labels.push(d) + latency_ms.push({ + t, + y: 0 + }); + rate_sec.push({ + t, + y: 0 + }); + input_kbs.push({ + t, + y: 0 + }); + output_kbs.push({ + t, + y: 0 + }); + } this.state = { avg_latency_ms: 0, avg_rate_sec: 0, avg_input_kbs: 0, avg_output_kbs: 0, - labels: [], - latency_ms: [], - rate_sec: [], - input_kbs: [], - output_kbs: [], + labels: labels, + latency_ms: latency_ms, + rate_sec: rate_sec, + input_kbs: input_kbs, + output_kbs: output_kbs, interval: undefined }; } @@ -149,19 +176,19 @@ class Status extends Component { y: avg_output_kbs }); - if (labels.length > 360) { + if (labels.length > 24) { labels.shift(); } - if (latency_ms.length > 360) { + if (latency_ms.length > 24) { latency_ms.shift(); } - if (rate_sec.length > 360) { + if (rate_sec.length > 24) { rate_sec.shift(); } - if (input_kbs.length > 360) { + if (input_kbs.length > 24) { input_kbs.shift(); } - if (output_kbs.length > 360) { + if (output_kbs.length > 24) { output_kbs.shift(); } diff --git a/console/ui/src/routes/users/details.tsx b/console/ui/src/routes/users/details.tsx index 2ac7b3f71..199beaeca 100644 --- a/console/ui/src/routes/users/details.tsx +++ b/console/ui/src/routes/users/details.tsx @@ -13,7 +13,7 @@ import { LedgerObject, LedgerObjectRequest, UserObject, - UserObjectRequest + UserObjectRequest, UserDeleteFriendRequest } from '../../store/users/types'; import { @@ -211,15 +211,15 @@ class UsersDetails extends Component { public remove_friend(id: string) { const {match} = this.props; if (confirm('Are you sure you want to delete this friend?')) { - this.props.deleteFriendRequest({id}); + this.props.deleteFriendRequest({id: ((match.params as Record)["id"] as string), friendId: id}); this.props.fetchFriendRequest(match.params); } } public remove_group(id: string) { const {match} = this.props; - if (confirm('Are you sure you want to delete this group?')) { - this.props.deleteGroupRequest({id}); + if (confirm('Are you sure you want to delete this group membership?')) { + this.props.deleteGroupRequest({id: ((match.params as Record)["id"] as string), groupId: id}); this.props.fetchGroupRequest(match.params); } } @@ -1071,7 +1071,7 @@ const mapDispatchToProps = (dispatch: Dispatch) => ({ userActions.userUnlinkCustomRequest(data) ), - deleteFriendRequest: (data: UserObjectRequest) => dispatch( + deleteFriendRequest: (data: UserDeleteFriendRequest) => dispatch( userActions.userDeleteFriendRequest(data) ), deleteGroupRequest: (data: UserObjectRequest) => dispatch( diff --git a/console/ui/src/store/users/actions.ts b/console/ui/src/store/users/actions.ts index 8ac387644..5a592e4d2 100644 --- a/console/ui/src/store/users/actions.ts +++ b/console/ui/src/store/users/actions.ts @@ -1,6 +1,8 @@ import {action} from 'typesafe-actions'; import { UserActionTypes, + UserDeleteFriendRequest, + UserDeleteGroupRequest, UserObjectRequest, UserUnlinkDeviceRequest, UserObject, @@ -150,7 +152,7 @@ export const userFetchFriendError = (message: string) => action( message ); -export const userDeleteFriendRequest = (data: UserObjectRequest) => action( +export const userDeleteFriendRequest = (data: UserDeleteFriendRequest) => action( UserActionTypes.DELETE_FRIEND_REQUEST, data ); @@ -175,7 +177,7 @@ export const userFetchGroupError = (message: string) => action( message ); -export const userDeleteGroupRequest = (data: UserObjectRequest) => action( +export const userDeleteGroupRequest = (data: UserDeleteGroupRequest) => action( UserActionTypes.DELETE_GROUP_REQUEST, data ); diff --git a/console/ui/src/store/users/sagas.ts b/console/ui/src/store/users/sagas.ts index 8131076fc..cc6c56f8d 100644 --- a/console/ui/src/store/users/sagas.ts +++ b/console/ui/src/store/users/sagas.ts @@ -88,7 +88,7 @@ function* handleFetchMany({payload: data}: AnyAction) } else { - yield put(userFetchManyError('An unknown error occured.')); + yield put(userFetchManyError('An unknown error occurred.')); } } } @@ -132,7 +132,7 @@ function* handleDeleteMany({payload: data}: AnyAction) } else { - yield put(userDeleteManyError('An unknown error occured.')); + yield put(userDeleteManyError('An unknown error occurred.')); } } } @@ -179,7 +179,7 @@ function* handleFetch({payload: data}: AnyAction) } else { - yield put(userFetchError('An unknown error occured.')); + yield put(userFetchError('An unknown error occurred.')); } } } @@ -222,7 +222,7 @@ function* handleExport({payload: data}: AnyAction) } else { - yield put(userExportError('An unknown error occured.')); + yield put(userExportError('An unknown error occurred.')); } } } @@ -268,7 +268,7 @@ function* handleUpdate({payload: data}: AnyAction) } else { - yield put(userUpdateError('An unknown error occured.')); + yield put(userUpdateError('An unknown error occurred.')); } } } @@ -316,7 +316,7 @@ function* handleDelete({payload: data}: AnyAction) } else { - yield put(userDeleteError('An unknown error occured.')); + yield put(userDeleteError('An unknown error occurred.')); } } } @@ -360,7 +360,7 @@ function* handleBan({payload: data}: AnyAction) } else { - yield put(userBanError('An unknown error occured.')); + yield put(userBanError('An unknown error occurred.')); } } } @@ -404,7 +404,7 @@ function* handleUnban({payload: data}: AnyAction) } else { - yield put(userUnbanError('An unknown error occured.')); + yield put(userUnbanError('An unknown error occurred.')); } } } @@ -447,7 +447,7 @@ function* handleFetchLedger({payload: data}: AnyAction) } else { - yield put(userFetchLedgerError('An unknown error occured.')); + yield put(userFetchLedgerError('An unknown error occurred.')); } } } @@ -492,7 +492,7 @@ function* handleDeleteLedger({payload: data}: AnyAction) } else { - yield put(userDeleteLedgerError('An unknown error occured.')); + yield put(userDeleteLedgerError('An unknown error occurred.')); } } } @@ -535,7 +535,7 @@ function* handleFetchFriend({payload: data}: AnyAction) } else { - yield put(userFetchFriendError('An unknown error occured.')); + yield put(userFetchFriendError('An unknown error occurred.')); } } } @@ -546,7 +546,8 @@ function* handleDeleteFriend({payload: data}: AnyAction) { const res = yield call( window.nakama_api.deleteFriend, - data && data.id + data && data.id, + data && data.friendId ); if(res.error) { @@ -578,7 +579,7 @@ function* handleDeleteFriend({payload: data}: AnyAction) } else { - yield put(userDeleteFriendError('An unknown error occured.')); + yield put(userDeleteFriendError('An unknown error occurred.')); } } } @@ -621,7 +622,7 @@ function* handleFetchGroup({payload: data}: AnyAction) } else { - yield put(userFetchGroupError('An unknown error occured.')); + yield put(userFetchGroupError('An unknown error occurred.')); } } } @@ -632,7 +633,8 @@ function* handleDeleteGroup({payload: data}: AnyAction) { const res = yield call( window.nakama_api.deleteGroupUser, - data && data.id + data && data.id, + data && data.groupId ); if(res.error) { @@ -664,7 +666,7 @@ function* handleDeleteGroup({payload: data}: AnyAction) } else { - yield put(userDeleteGroupError('An unknown error occured.')); + yield put(userDeleteGroupError('An unknown error occurred.')); } } } @@ -708,7 +710,7 @@ function* handleUnlinkSteam({payload: data}: AnyAction) } else { - yield put(userUnlinkSteamError('An unknown error occured.')); + yield put(userUnlinkSteamError('An unknown error occurred.')); } } } @@ -752,7 +754,7 @@ function* handleUnlinkGoogle({payload: data}: AnyAction) } else { - yield put(userUnlinkGoogleError('An unknown error occured.')); + yield put(userUnlinkGoogleError('An unknown error occurred.')); } } } @@ -796,7 +798,7 @@ function* handleUnlinkGameCenter({payload: data}: AnyAction) } else { - yield put(userUnlinkGameCenterError('An unknown error occured.')); + yield put(userUnlinkGameCenterError('An unknown error occurred.')); } } } @@ -840,7 +842,7 @@ function* handleUnlinkFacebook({payload: data}: AnyAction) } else { - yield put(userUnlinkFacebookError('An unknown error occured.')); + yield put(userUnlinkFacebookError('An unknown error occurred.')); } } } @@ -884,7 +886,7 @@ function* handleUnlinkFacebookInstantGame({payload: data}: AnyAction) } else { - yield put(userUnlinkFacebookInstantGameError('An unknown error occured.')); + yield put(userUnlinkFacebookInstantGameError('An unknown error occurred.')); } } } @@ -928,7 +930,7 @@ function* handleUnlinkEmail({payload: data}: AnyAction) } else { - yield put(userUnlinkEmailError('An unknown error occured.')); + yield put(userUnlinkEmailError('An unknown error occurred.')); } } } @@ -973,7 +975,7 @@ function* handleUnlinkDevice({payload: data}: AnyAction) } else { - yield put(userUnlinkDeviceError('An unknown error occured.')); + yield put(userUnlinkDeviceError('An unknown error occurred.')); } } } @@ -1017,7 +1019,7 @@ function* handleUnlinkCustom({payload: data}: AnyAction) } else { - yield put(userUnlinkCustomError('An unknown error occured.')); + yield put(userUnlinkCustomError('An unknown error occurred.')); } } } diff --git a/console/ui/src/store/users/types.ts b/console/ui/src/store/users/types.ts index 7aa784b0f..310f19f8c 100644 --- a/console/ui/src/store/users/types.ts +++ b/console/ui/src/store/users/types.ts @@ -20,6 +20,18 @@ export interface GroupObject update_time?: string, }; +export interface UserDeleteFriendRequest +{ + id?: string, + friendId?: string +}; + +export interface UserDeleteGroupRequest +{ + id?: string, + groupId?: string +}; + export interface UserGroupObject { group: GroupObject, diff --git a/data/modules/clientrpc.lua b/data/modules/clientrpc.lua index e924b3934..a9582fdf1 100644 --- a/data/modules/clientrpc.lua +++ b/data/modules/clientrpc.lua @@ -22,6 +22,7 @@ local du = require("debug_utils") --]] local function rpc(_context, payload) + nk.event("foo", {bar = "baz"}, 12345, false) return payload end nk.register_rpc(rpc, "clientrpc.rpc") diff --git a/go.mod b/go.mod index 8822c29d9..cdfd6c1f8 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,8 @@ module github.com/heroiclabs/nakama/v2 go 1.13 require ( - cloud.google.com/go v0.45.1 // indirect - contrib.go.opencensus.io/exporter/prometheus v0.1.0 - contrib.go.opencensus.io/exporter/stackdriver v0.12.7 github.com/RoaringBitmap/roaring v0.4.21 // indirect - github.com/aws/aws-sdk-go v1.23.16 // indirect + github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 // indirect github.com/blevesearch/bleve v0.8.2 github.com/blevesearch/blevex v0.0.0-20180227211930-4b158bb555a3 // indirect github.com/blevesearch/go-porterstemmer v1.0.2 // indirect @@ -27,6 +24,7 @@ require ( github.com/gobuffalo/packr v1.30.1 github.com/gofrs/uuid v0.0.0-20190510204422-abfe1881e60e github.com/golang/protobuf v1.3.5 + github.com/google/go-cmp v0.3.1 // indirect github.com/gorilla/handlers v1.4.2 github.com/gorilla/mux v1.7.4 github.com/gorilla/websocket v1.4.2 @@ -36,7 +34,12 @@ require ( github.com/jackc/pgx v3.5.0+incompatible github.com/jmhodges/levigo v1.0.0 // indirect github.com/lib/pq v1.2.0 // indirect + github.com/m3db/prometheus_client_golang v0.8.1 // indirect + github.com/m3db/prometheus_client_model v0.1.0 // indirect + github.com/m3db/prometheus_common v0.1.0 // indirect + github.com/m3db/prometheus_procfs v0.8.1 // indirect github.com/mattn/go-sqlite3 v1.10.0 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/pkg/errors v0.9.1 github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7 // indirect github.com/rogpeppe/go-internal v1.3.1 // indirect @@ -48,14 +51,13 @@ require ( github.com/syndtr/goleveldb v1.0.0 // indirect github.com/tecbot/gorocksdb v0.0.0-20190519120508-025c3cf4ffb4 // indirect github.com/tinylib/msgp v1.1.2 // indirect + github.com/uber-go/tally v3.3.16+incompatible github.com/ziutek/mymysql v1.5.4 // indirect go.etcd.io/bbolt v1.3.4 // indirect - go.opencensus.io v0.22.3 go.uber.org/atomic v1.6.0 go.uber.org/zap v1.14.1 golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect - google.golang.org/api v0.10.0 // indirect google.golang.org/appengine v1.6.2 // indirect google.golang.org/genproto v0.0.0-20200226201735-46b91f19d98c google.golang.org/grpc v1.27.1 diff --git a/go.sum b/go.sum index a3f0bccca..09e4efb4f 100644 --- a/go.sum +++ b/go.sum @@ -1,30 +1,10 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.43.0 h1:banaiRPAM8kUVYneOSkhgcDsLzEvL25FinuiSZaH/2w= -cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1 h1:lRi0CHyU+ytlvylOlFKKq0af6JncuyoRh1J+QJBqQx0= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -contrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE5H/ukPWBRo314xiDvg= -contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= -contrib.go.opencensus.io/exporter/stackdriver v0.12.7 h1:XWDDoMSlZchLyQZw8HKE+7vn3FpfaVR5Yz9E4ifxiU0= -contrib.go.opencensus.io/exporter/stackdriver v0.12.7/go.mod h1:ZOhmSfHIoyVaQ+bKN+lR4h7K2olTIJsrdOwWHsNGw4w= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/RoaringBitmap/roaring v0.4.21 h1:WJ/zIlNX4wQZ9x8Ey33O1UaD9TCTakYsdLFSBcTwH+8= github.com/RoaringBitmap/roaring v0.4.21/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aws/aws-sdk-go v1.22.1 h1://WJvJi9iq/i5TWHuK3hIC23xCZYH7Qv7SIN2vZVqxY= -github.com/aws/aws-sdk-go v1.22.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.23.16 h1:cMEmZoIeno2dgz3grc4vUQ33ZJh32d/4C67tNDxOERw= -github.com/aws/aws-sdk-go v1.23.16/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/blevesearch/bleve v0.8.2 h1:dlG2QtAM91QzMatFLJAooZ8jpL/nG0xIA8+J0RHfcUY= @@ -90,14 +70,9 @@ github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIavi github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= github.com/gofrs/uuid v0.0.0-20190510204422-abfe1881e60e h1:Jf69fp2MfjbNjd1+JWc/B0Gom5DA5Dd3wN1qLihyCXU= github.com/gofrs/uuid v0.0.0-20190510204422-abfe1881e60e/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -112,22 +87,10 @@ github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgj github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/addlicense v0.0.0-20190510175307-22550fa7c1b0/go.mod h1:QtPG26W17m+OIQgE6gQ24gC1M6pUaMBAbFrTIDtwG/E= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/googleapis/gax-go/v2 v2.0.4 h1:hU4mGcQI4DaAYW+IbTun+2qEZVFxK0ySjQLTbS0VQKc= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99 h1:twflg0XRTjwKpxb/jFExr4HGq6on2dEOmnL6FV+fgPw= github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= @@ -138,10 +101,6 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.13.0 h1:sBDQoHXrOlfPobnKw69FIKa1wg9qsLLvvQ/Y19WtFgI= github.com/grpc-ecosystem/grpc-gateway v1.13.0/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/heroiclabs/nakama-common v1.4.0 h1:7IRb+FIYKa4iOY08lTVmZ5kHHNaDNWEQE9+w4bWNdCU= github.com/heroiclabs/nakama-common v1.4.0/go.mod h1:0lw1qUs5FhJlox1WsEPdODRsdvfZ7Q1c/2jxkbeL++M= @@ -152,17 +111,13 @@ github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGU github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.5.0+incompatible h1:BRJ4G3UPtvml5R1ey0biqqGuYUGayMYekm3woO75orY= github.com/jackc/pgx v3.5.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -173,6 +128,14 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/m3db/prometheus_client_golang v0.8.1 h1:t7w/tcFws81JL1j5sqmpqcOyQOpH4RDOmIe3A3fdN3w= +github.com/m3db/prometheus_client_golang v0.8.1/go.mod h1:8R/f1xYhXWq59KD/mbRqoBulXejss7vYtYzWmruNUwI= +github.com/m3db/prometheus_client_model v0.1.0 h1:cg1+DiuyT6x8h9voibtarkH1KT6CmsewBSaBhe8wzLo= +github.com/m3db/prometheus_client_model v0.1.0/go.mod h1:Qfsxn+LypxzF+lNhak7cF7k0zxK7uB/ynGYoj80zcD4= +github.com/m3db/prometheus_common v0.1.0 h1:YJu6eCIV6MQlcwND24cRG/aRkZDX1jvYbsNNs1ZYr0w= +github.com/m3db/prometheus_common v0.1.0/go.mod h1:EBmDQaMAy4B8i+qsg1wMXAelLNVbp49i/JOeVszQ/rs= +github.com/m3db/prometheus_procfs v0.8.1 h1:LsxWzVELhDU9sLsZTaFLCeAwCn7bC7qecZcK4zobs/g= +github.com/m3db/prometheus_procfs v0.8.1/go.mod h1:N8lv8fLh3U3koZx1Bnisj60GYUMDpWb09x1R+dmMOJo= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -195,16 +158,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7 h1:FUL3b97ZY2EPqg2NbXKuMHs5pXJB9hjj1fDHnF2vl28= github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -247,6 +202,8 @@ github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU= github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ= github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/uber-go/tally v3.3.16+incompatible h1:dlxi7iZMimK2Z0HXbZgvVFobZu4XRT/U3aEUWzLV1n4= +github.com/uber-go/tally v3.3.16+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/willf/bitset v1.1.10 h1:NotGKqX0KwQ72NUzqrjZq5ipPNDQex9lo3WpaS8L2sc= github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= @@ -255,11 +212,6 @@ github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= @@ -277,118 +229,67 @@ golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09 h1:KaQtG+aDELoNmXYas3TVkGNYRuq8JQ1aa7LJt8EXVyo= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd h1:r7DufRZuZbWB7j439YfAzP8RPDa9unLkpwQKUYbIMPI= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438 h1:khxRGsvPk4n2y8I/mLLjp7e5dMTJmH75wvqS6nMwUtY= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0 h1:9sdfJOzWlkqPltHAuzT2Cp+yrBeY1KRVYgms8soxMwM= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.10.0 h1:7tmAxx3oKE98VMZ+SBZzvYYWRQ9HODBxmC8mXUsraSQ= -google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.2 h1:j8RI1yW0SkI+paT6uGwMlrMI/6zwYA6/CFil8rxOzGI= google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20200226201735-46b91f19d98c h1:xFOdgVPpeowWAH0MJ5i0XMp+3yWiWamMtN/kx9xThIQ= google.golang.org/genproto v0.0.0-20200226201735-46b91f19d98c/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1 h1:j6XxA85m/6txkUCHvzlV5f+HBNl/1r5cZ2A/3IEFOO8= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= @@ -414,9 +315,6 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/main.go b/main.go index 5e417834d..8cecfd121 100644 --- a/main.go +++ b/main.go @@ -116,18 +116,19 @@ func main() { socialClient := social.NewClient(5 * time.Second) // Start up server components. + metrics := server.NewMetrics(logger, startupLogger, config) matchmaker := server.NewLocalMatchmaker(startupLogger, config.GetName()) - sessionRegistry := server.NewLocalSessionRegistry() + sessionRegistry := server.NewLocalSessionRegistry(metrics) tracker := server.StartLocalTracker(logger, config, sessionRegistry, jsonpbMarshaler) router := server.NewLocalMessageRouter(sessionRegistry, tracker, jsonpbMarshaler) leaderboardCache := server.NewLocalLeaderboardCache(logger, startupLogger, db) leaderboardRankCache := server.NewLocalLeaderboardRankCache(startupLogger, db, config.GetLeaderboard(), leaderboardCache) leaderboardScheduler := server.NewLocalLeaderboardScheduler(logger, db, config, leaderboardCache, leaderboardRankCache) - matchRegistry := server.NewLocalMatchRegistry(logger, startupLogger, config, tracker, router, config.GetName()) + matchRegistry := server.NewLocalMatchRegistry(logger, startupLogger, config, tracker, router, metrics, config.GetName()) tracker.SetMatchJoinListener(matchRegistry.Join) tracker.SetMatchLeaveListener(matchRegistry.Leave) streamManager := server.NewLocalStreamManager(config, sessionRegistry, tracker) - runtime, err := server.NewRuntime(logger, startupLogger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router) + runtime, err := server.NewRuntime(logger, startupLogger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, metrics, streamManager, router) if err != nil { startupLogger.Fatal("Failed initializing runtime modules", zap.Error(err)) } @@ -135,12 +136,10 @@ func main() { leaderboardScheduler.Start(runtime) pipeline := server.NewPipeline(logger, config, db, jsonpbMarshaler, jsonpbUnmarshaler, sessionRegistry, matchRegistry, matchmaker, tracker, router, runtime) - metricsExporter := server.NewMetricsExporter(logger) - metrics := server.NewMetrics(logger, startupLogger, config, metricsExporter) - statusHandler := server.NewLocalStatusHandler(logger, sessionRegistry, matchRegistry, tracker, metricsExporter, config.GetName()) + statusHandler := server.NewLocalStatusHandler(logger, sessionRegistry, matchRegistry, tracker, metrics, config.GetName()) consoleServer := server.StartConsoleServer(logger, startupLogger, db, config, tracker, router, statusHandler, configWarnings, semver) - apiServer := server.StartApiServer(logger, startupLogger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, sessionRegistry, matchRegistry, matchmaker, tracker, router, pipeline, runtime) + apiServer := server.StartApiServer(logger, startupLogger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, sessionRegistry, matchRegistry, matchmaker, tracker, router, metrics, pipeline, runtime) gaenabled := len(os.Getenv("NAKAMA_TELEMETRY")) < 1 cookie := newOrLoadCookie(config) diff --git a/sample_go_module/sample.go b/sample_go_module/sample.go index 30f5505b7..bf626c7f3 100644 --- a/sample_go_module/sample.go +++ b/sample_go_module/sample.go @@ -43,6 +43,11 @@ func InitModule(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runti if err := initializer.RegisterEventSessionEnd(eventSessionEnd); err != nil { return err } + if err := initializer.RegisterEvent(func(ctx context.Context, logger runtime.Logger, evt *api.Event) { + logger.Info("Received event: %+v", evt) + }); err != nil { + return err + } return nil } diff --git a/server/api.go b/server/api.go index 1940d6baf..c4bfd2ef4 100644 --- a/server/api.go +++ b/server/api.go @@ -25,10 +25,6 @@ import ( "strings" "time" - "go.opencensus.io/stats" - "go.opencensus.io/tag" - "go.opencensus.io/trace" - "github.com/heroiclabs/nakama-common/api" "google.golang.org/grpc/peer" @@ -47,8 +43,6 @@ import ( grpcRuntime "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/heroiclabs/nakama/v2/apigrpc" "github.com/heroiclabs/nakama/v2/social" - "go.opencensus.io/plugin/ocgrpc" - "go.opencensus.io/plugin/ochttp" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/codes" @@ -79,12 +73,13 @@ type ApiServer struct { matchRegistry MatchRegistry tracker Tracker router MessageRouter + metrics *Metrics runtime *Runtime grpcServer *grpc.Server grpcGatewayServer *http.Server } -func StartApiServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, matchmaker Matchmaker, tracker Tracker, router MessageRouter, pipeline *Pipeline, runtime *Runtime) *ApiServer { +func StartApiServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, matchmaker Matchmaker, tracker Tracker, router MessageRouter, metrics *Metrics, pipeline *Pipeline, runtime *Runtime) *ApiServer { var gatewayContextTimeoutMs string if config.GetSocket().IdleTimeoutMs > 500 { // Ensure the GRPC Gateway timeout is just under the idle timeout (if possible) to ensure it has priority. @@ -96,7 +91,7 @@ func StartApiServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.DB, j } serverOpts := []grpc.ServerOption{ - grpc.StatsHandler(&ocgrpc.ServerHandler{IsPublicEndpoint: true}), + grpc.StatsHandler(&MetricsGrpcHandler{metrics: metrics}), grpc.MaxRecvMsgSize(int(config.GetSocket().MaxRequestSizeBytes)), grpc.UnaryInterceptor(func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { ctx, err := securityInterceptorFunc(logger, config, ctx, req, info) @@ -121,6 +116,7 @@ func StartApiServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.DB, j matchRegistry: matchRegistry, tracker: tracker, router: router, + metrics: metrics, runtime: runtime, grpcServer: grpcServer, } @@ -166,12 +162,11 @@ func StartApiServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.DB, j dialAddr = fmt.Sprintf("%v:%d", config.GetSocket().Address, config.GetSocket().Port-1) } dialOpts := []grpc.DialOption{ - //TODO (mo, zyro): Do we need to pass the statsHandler here as well? grpc.WithDefaultCallOptions( grpc.MaxCallSendMsgSize(int(config.GetSocket().MaxRequestSizeBytes)), grpc.MaxCallRecvMsgSize(1024*1024*128), ), - grpc.WithStatsHandler(&ocgrpc.ClientHandler{}), + //grpc.WithStatsHandler(&ocgrpc.ClientHandler{}), } if config.GetSocket().TLSCert != nil { dialOpts = append(dialOpts, grpc.WithTransportCredentials(credentials.NewServerTLSFromCert(&config.GetSocket().TLSCert[0]))) @@ -188,7 +183,7 @@ func StartApiServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.DB, j grpcGatewayRouter := mux.NewRouter() // Special case routes. Do NOT enable compression on WebSocket route, it results in "http: response.Write on hijacked connection" errors. grpcGatewayRouter.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) }).Methods("GET") - grpcGatewayRouter.HandleFunc("/ws", NewSocketWsAcceptor(logger, config, sessionRegistry, matchmaker, tracker, runtime, jsonpbMarshaler, jsonpbUnmarshaler, pipeline)).Methods("GET") + grpcGatewayRouter.HandleFunc("/ws", NewSocketWsAcceptor(logger, config, sessionRegistry, matchmaker, tracker, metrics, runtime, jsonpbMarshaler, jsonpbUnmarshaler, pipeline)).Methods("GET") // Another nested router to hijack RPC requests bound for GRPC Gateway. grpcGatewayMux := mux.NewRouter() @@ -198,16 +193,16 @@ func StartApiServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.DB, j // Enable stats recording on all request paths except: // "/" is not tracked at all. // "/ws" implements its own separate tracking. - handlerWithStats := &ochttp.Handler{ - Handler: grpcGatewayMux, - IsPublicEndpoint: true, - } + //handlerWithStats := &ochttp.Handler{ + // Handler: grpcGatewayMux, + // IsPublicEndpoint: true, + //} // Default to passing request to GRPC Gateway. // Enable max size check on requests coming arriving the gateway. // Enable compression on responses sent by the gateway. // Enable decompression on requests received by the gateway. - handlerWithDecompressRequest := decompressHandler(logger, handlerWithStats) + handlerWithDecompressRequest := decompressHandler(logger, grpcGatewayMux) handlerWithCompressResponse := handlers.CompressHandler(handlerWithDecompressRequest) maxMessageSizeBytes := config.GetSocket().MaxRequestSizeBytes handlerWithMaxBody := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -515,41 +510,24 @@ func extractClientAddress(logger *zap.Logger, clientAddr string) (string, string return clientIP, clientPort } -func traceApiBefore(ctx context.Context, logger *zap.Logger, fullMethodName string, fn func(clientIP, clientPort string) error) error { - name := fmt.Sprintf("%v-before", fullMethodName) +func traceApiBefore(ctx context.Context, logger *zap.Logger, metrics *Metrics, fullMethodName string, fn func(clientIP, clientPort string) error) error { clientIP, clientPort := extractClientAddressFromContext(logger, ctx) - statsCtx, err := tag.New(ctx, tag.Upsert(MetricsFunction, name)) - if err != nil { - // If there was an error processing the stats, just execute the function. - logger.Warn("Error tagging API before stats", zap.String("full_method_name", fullMethodName), zap.Error(err)) - return fn(clientIP, clientPort) - } - startNanos := time.Now().UTC().UnixNano() - statsCtx, span := trace.StartSpan(statsCtx, name) + start := time.Now() - err = fn(clientIP, clientPort) + // Execute the before hook itself. + err := fn(clientIP, clientPort) - span.End() - stats.Record(statsCtx, MetricsAPITimeSpentMsec.M(float64(time.Now().UTC().UnixNano()-startNanos)/1e6), MetricsAPICount.M(1)) + metrics.ApiBefore(fullMethodName, time.Since(start), err != nil) return err } -func traceApiAfter(ctx context.Context, logger *zap.Logger, fullMethodName string, fn func(clientIP, clientPort string)) { - name := fmt.Sprintf("%v-after", logger) +func traceApiAfter(ctx context.Context, logger *zap.Logger, metrics *Metrics, fullMethodName string, fn func(clientIP, clientPort string) error) { clientIP, clientPort := extractClientAddressFromContext(logger, ctx) - statsCtx, err := tag.New(ctx, tag.Upsert(MetricsFunction, name)) - if err != nil { - // If there was an error processing the stats, just execute the function. - logger.Warn("Error tagging API after stats", zap.String("full_method_name", fullMethodName), zap.Error(err)) - fn(clientIP, clientPort) - return - } - startNanos := time.Now().UTC().UnixNano() - statsCtx, span := trace.StartSpan(statsCtx, name) + start := time.Now() - fn(clientIP, clientPort) + // Execute the after hook itself. + err := fn(clientIP, clientPort) - span.End() - stats.Record(statsCtx, MetricsAPITimeSpentMsec.M(float64(time.Now().UTC().UnixNano()-startNanos)/1e6), MetricsAPICount.M(1)) + metrics.ApiAfter(fullMethodName, time.Since(start), err != nil) } diff --git a/server/api_account.go b/server/api_account.go index 597754803..5de795b69 100644 --- a/server/api_account.go +++ b/server/api_account.go @@ -40,7 +40,7 @@ func (s *ApiServer) GetAccount(ctx context.Context, in *empty.Empty) (*api.Accou } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -56,12 +56,12 @@ func (s *ApiServer) GetAccount(ctx context.Context, in *empty.Empty) (*api.Accou // After hook. if fn := s.runtime.AfterGetAccount(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, user) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, user) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return user, nil @@ -87,7 +87,7 @@ func (s *ApiServer) UpdateAccount(ctx context.Context, in *api.UpdateAccountRequ } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -110,12 +110,12 @@ func (s *ApiServer) UpdateAccount(ctx context.Context, in *api.UpdateAccountRequ // After hook. if fn := s.runtime.AfterUpdateAccount(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil diff --git a/server/api_authenticate.go b/server/api_authenticate.go index fdff8a1b4..c510dfb58 100644 --- a/server/api_authenticate.go +++ b/server/api_authenticate.go @@ -72,7 +72,7 @@ func (s *ApiServer) AuthenticateCustom(ctx context.Context, in *api.Authenticate } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -107,12 +107,12 @@ func (s *ApiServer) AuthenticateCustom(ctx context.Context, in *api.Authenticate // After hook. if fn := s.runtime.AfterAuthenticateCustom(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return session, nil @@ -136,7 +136,7 @@ func (s *ApiServer) AuthenticateDevice(ctx context.Context, in *api.Authenticate } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -171,12 +171,12 @@ func (s *ApiServer) AuthenticateDevice(ctx context.Context, in *api.Authenticate // After hook. if fn := s.runtime.AfterAuthenticateDevice(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return session, nil @@ -200,7 +200,7 @@ func (s *ApiServer) AuthenticateEmail(ctx context.Context, in *api.AuthenticateE } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -265,12 +265,12 @@ func (s *ApiServer) AuthenticateEmail(ctx context.Context, in *api.AuthenticateE // After hook. if fn := s.runtime.AfterAuthenticateEmail(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, dbUserID, username, in.Account.Vars, exp, clientIP, clientPort, session, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, dbUserID, username, in.Account.Vars, exp, clientIP, clientPort, session, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return session, nil @@ -294,7 +294,7 @@ func (s *ApiServer) AuthenticateFacebook(ctx context.Context, in *api.Authentica } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -322,7 +322,7 @@ func (s *ApiServer) AuthenticateFacebook(ctx context.Context, in *api.Authentica // Import friends if requested. if in.Sync == nil || in.Sync.Value { - importFacebookFriends(ctx, s.logger, s.db, s.router, s.socialClient, uuid.FromStringOrNil(dbUserID), dbUsername, in.Account.Token, false) + _ = importFacebookFriends(ctx, s.logger, s.db, s.router, s.socialClient, uuid.FromStringOrNil(dbUserID), dbUsername, in.Account.Token, false) } token, exp := generateToken(s.config, dbUserID, dbUsername, in.Account.Vars) @@ -330,12 +330,12 @@ func (s *ApiServer) AuthenticateFacebook(ctx context.Context, in *api.Authentica // After hook. if fn := s.runtime.AfterAuthenticateFacebook(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return session, nil @@ -359,7 +359,7 @@ func (s *ApiServer) AuthenticateFacebookInstantGame(ctx context.Context, in *api } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -389,12 +389,12 @@ func (s *ApiServer) AuthenticateFacebookInstantGame(ctx context.Context, in *api // After hook. if fn := s.runtime.AfterAuthenticateFacebookInstantGame(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return session, nil @@ -418,7 +418,7 @@ func (s *ApiServer) AuthenticateGameCenter(ctx context.Context, in *api.Authenti } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -461,12 +461,12 @@ func (s *ApiServer) AuthenticateGameCenter(ctx context.Context, in *api.Authenti // After hook. if fn := s.runtime.AfterAuthenticateGameCenter(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return session, nil @@ -490,7 +490,7 @@ func (s *ApiServer) AuthenticateGoogle(ctx context.Context, in *api.Authenticate } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -521,12 +521,12 @@ func (s *ApiServer) AuthenticateGoogle(ctx context.Context, in *api.Authenticate // After hook. if fn := s.runtime.AfterAuthenticateGoogle(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return session, nil @@ -550,7 +550,7 @@ func (s *ApiServer) AuthenticateSteam(ctx context.Context, in *api.AuthenticateS } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -585,12 +585,12 @@ func (s *ApiServer) AuthenticateSteam(ctx context.Context, in *api.AuthenticateS // After hook. if fn := s.runtime.AfterAuthenticateSteam(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, dbUserID, dbUsername, in.Account.Vars, exp, clientIP, clientPort, session, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return session, nil diff --git a/server/api_channel.go b/server/api_channel.go index 02639c482..c90229f25 100644 --- a/server/api_channel.go +++ b/server/api_channel.go @@ -43,7 +43,7 @@ func (s *ApiServer) ListChannelMessages(ctx context.Context, in *api.ListChannel } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -82,12 +82,12 @@ func (s *ApiServer) ListChannelMessages(ctx context.Context, in *api.ListChannel // After hook. if fn := s.runtime.AfterListChannelMessages(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, messageList, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, messageList, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return messageList, nil diff --git a/server/api_event.go b/server/api_event.go index 9d50f4817..12d4d1e59 100644 --- a/server/api_event.go +++ b/server/api_event.go @@ -42,7 +42,7 @@ func (s *ApiServer) Event(ctx context.Context, in *api.Event) (*empty.Empty, err } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -58,12 +58,12 @@ func (s *ApiServer) Event(ctx context.Context, in *api.Event) (*empty.Empty, err // After hook. if fn := s.runtime.AfterEvent(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil diff --git a/server/api_friend.go b/server/api_friend.go index 4f0fea72f..fcb5855b8 100644 --- a/server/api_friend.go +++ b/server/api_friend.go @@ -44,7 +44,7 @@ func (s *ApiServer) ListFriends(ctx context.Context, in *api.ListFriendsRequest) } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -75,12 +75,12 @@ func (s *ApiServer) ListFriends(ctx context.Context, in *api.ListFriendsRequest) // After hook. if fn := s.runtime.AfterListFriends(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, friends) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, friends) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return friends, nil @@ -106,7 +106,7 @@ func (s *ApiServer) AddFriends(ctx context.Context, in *api.AddFriendsRequest) ( } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -156,12 +156,12 @@ func (s *ApiServer) AddFriends(ctx context.Context, in *api.AddFriendsRequest) ( // After hook. if fn := s.runtime.AfterAddFriends(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -187,7 +187,7 @@ func (s *ApiServer) DeleteFriends(ctx context.Context, in *api.DeleteFriendsRequ } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -237,12 +237,12 @@ func (s *ApiServer) DeleteFriends(ctx context.Context, in *api.DeleteFriendsRequ // After hook. if fn := s.runtime.AfterDeleteFriends(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -268,7 +268,7 @@ func (s *ApiServer) BlockFriends(ctx context.Context, in *api.BlockFriendsReques } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -317,12 +317,12 @@ func (s *ApiServer) BlockFriends(ctx context.Context, in *api.BlockFriendsReques // After hook. if fn := s.runtime.AfterBlockFriends(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -346,7 +346,7 @@ func (s *ApiServer) ImportFacebookFriends(ctx context.Context, in *api.ImportFac } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -364,12 +364,12 @@ func (s *ApiServer) ImportFacebookFriends(ctx context.Context, in *api.ImportFac // After hook. if fn := s.runtime.AfterImportFacebookFriends(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil diff --git a/server/api_group.go b/server/api_group.go index e40ec9874..5e1f8dd19 100644 --- a/server/api_group.go +++ b/server/api_group.go @@ -44,7 +44,7 @@ func (s *ApiServer) CreateGroup(ctx context.Context, in *api.CreateGroupRequest) } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -72,12 +72,12 @@ func (s *ApiServer) CreateGroup(ctx context.Context, in *api.CreateGroupRequest) // After hook. if fn := s.runtime.AfterCreateGroup(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, group, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, group, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return group, nil @@ -103,7 +103,7 @@ func (s *ApiServer) UpdateGroup(ctx context.Context, in *api.UpdateGroupRequest) } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -144,12 +144,12 @@ func (s *ApiServer) UpdateGroup(ctx context.Context, in *api.UpdateGroupRequest) // After hook. if fn := s.runtime.AfterUpdateGroup(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -175,7 +175,7 @@ func (s *ApiServer) DeleteGroup(ctx context.Context, in *api.DeleteGroupRequest) } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -200,12 +200,12 @@ func (s *ApiServer) DeleteGroup(ctx context.Context, in *api.DeleteGroupRequest) // After hook. if fn := s.runtime.AfterDeleteGroup(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -232,7 +232,7 @@ func (s *ApiServer) JoinGroup(ctx context.Context, in *api.JoinGroupRequest) (*e } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -259,12 +259,12 @@ func (s *ApiServer) JoinGroup(ctx context.Context, in *api.JoinGroupRequest) (*e // After hook. if fn := s.runtime.AfterJoinGroup(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), username, ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), username, ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -291,7 +291,7 @@ func (s *ApiServer) LeaveGroup(ctx context.Context, in *api.LeaveGroupRequest) ( } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -316,12 +316,12 @@ func (s *ApiServer) LeaveGroup(ctx context.Context, in *api.LeaveGroupRequest) ( // After hook. if fn := s.runtime.AfterLeaveGroup(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), username, ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), username, ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -347,7 +347,7 @@ func (s *ApiServer) AddGroupUsers(ctx context.Context, in *api.AddGroupUsersRequ } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -389,12 +389,12 @@ func (s *ApiServer) AddGroupUsers(ctx context.Context, in *api.AddGroupUsersRequ // After hook. if fn := s.runtime.AfterAddGroupUsers(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -420,7 +420,7 @@ func (s *ApiServer) BanGroupUsers(ctx context.Context, in *api.BanGroupUsersRequ } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -457,12 +457,12 @@ func (s *ApiServer) BanGroupUsers(ctx context.Context, in *api.BanGroupUsersRequ // After hook. if fn := s.runtime.AfterBanGroupUsers(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -488,7 +488,7 @@ func (s *ApiServer) KickGroupUsers(ctx context.Context, in *api.KickGroupUsersRe } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -525,12 +525,12 @@ func (s *ApiServer) KickGroupUsers(ctx context.Context, in *api.KickGroupUsersRe // After hook. if fn := s.runtime.AfterKickGroupUsers(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -556,7 +556,7 @@ func (s *ApiServer) PromoteGroupUsers(ctx context.Context, in *api.PromoteGroupU } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -596,12 +596,12 @@ func (s *ApiServer) PromoteGroupUsers(ctx context.Context, in *api.PromoteGroupU // After hook. if fn := s.runtime.AfterPromoteGroupUsers(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -625,7 +625,7 @@ func (s *ApiServer) ListGroupUsers(ctx context.Context, in *api.ListGroupUsersRe } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -665,12 +665,12 @@ func (s *ApiServer) ListGroupUsers(ctx context.Context, in *api.ListGroupUsersRe // After hook. if fn := s.runtime.AfterListGroupUsers(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, groupUsers, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, groupUsers, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return groupUsers, nil @@ -694,7 +694,7 @@ func (s *ApiServer) ListUserGroups(ctx context.Context, in *api.ListUserGroupsRe } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -734,12 +734,12 @@ func (s *ApiServer) ListUserGroups(ctx context.Context, in *api.ListUserGroupsRe // After hook. if fn := s.runtime.AfterListUserGroups(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, userGroups, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, userGroups, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return userGroups, nil @@ -763,7 +763,7 @@ func (s *ApiServer) ListGroups(ctx context.Context, in *api.ListGroupsRequest) ( } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -784,12 +784,12 @@ func (s *ApiServer) ListGroups(ctx context.Context, in *api.ListGroupsRequest) ( // After hook. if fn := s.runtime.AfterListGroups(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, groups, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, groups, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return groups, nil diff --git a/server/api_leaderboard.go b/server/api_leaderboard.go index bdcc4a1ec..fdb00cf47 100644 --- a/server/api_leaderboard.go +++ b/server/api_leaderboard.go @@ -48,7 +48,7 @@ func (s *ApiServer) DeleteLeaderboardRecord(ctx context.Context, in *api.DeleteL } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -69,12 +69,12 @@ func (s *ApiServer) DeleteLeaderboardRecord(ctx context.Context, in *api.DeleteL // After hook. if fn := s.runtime.AfterDeleteLeaderboardRecord(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -98,7 +98,7 @@ func (s *ApiServer) ListLeaderboardRecords(ctx context.Context, in *api.ListLead } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -142,12 +142,12 @@ func (s *ApiServer) ListLeaderboardRecords(ctx context.Context, in *api.ListLead // After hook. if fn := s.runtime.AfterListLeaderboardRecords(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, records, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, records, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return records, nil @@ -174,7 +174,7 @@ func (s *ApiServer) WriteLeaderboardRecord(ctx context.Context, in *api.WriteLea } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -201,12 +201,12 @@ func (s *ApiServer) WriteLeaderboardRecord(ctx context.Context, in *api.WriteLea // After hook. if fn := s.runtime.AfterWriteLeaderboardRecord(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), username, ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, record, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), username, ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, record, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return record, nil @@ -230,7 +230,7 @@ func (s *ApiServer) ListLeaderboardRecordsAroundOwner(ctx context.Context, in *a } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -273,12 +273,12 @@ func (s *ApiServer) ListLeaderboardRecordsAroundOwner(ctx context.Context, in *a // After hook. if fn := s.runtime.AfterListLeaderboardRecordsAroundOwner(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, recordList, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, recordList, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return recordList, nil diff --git a/server/api_link.go b/server/api_link.go index 59f811ebe..987c39ed6 100644 --- a/server/api_link.go +++ b/server/api_link.go @@ -49,7 +49,7 @@ func (s *ApiServer) LinkCustom(ctx context.Context, in *api.AccountCustom) (*emp } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -84,12 +84,12 @@ AND (NOT EXISTS // After hook. if fn := s.runtime.AfterLinkCustom(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -115,7 +115,7 @@ func (s *ApiServer) LinkDevice(ctx context.Context, in *api.AccountDevice) (*emp } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -173,12 +173,12 @@ func (s *ApiServer) LinkDevice(ctx context.Context, in *api.AccountDevice) (*emp // After hook. if fn := s.runtime.AfterLinkDevice(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -204,7 +204,7 @@ func (s *ApiServer) LinkEmail(ctx context.Context, in *api.AccountEmail) (*empty } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -246,12 +246,12 @@ AND (NOT EXISTS // After hook. if fn := s.runtime.AfterLinkEmail(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -277,7 +277,7 @@ func (s *ApiServer) LinkFacebook(ctx context.Context, in *api.LinkFacebookReques } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -313,17 +313,17 @@ AND (NOT EXISTS // Import friends if requested. if in.Sync == nil || in.Sync.Value { - importFacebookFriends(ctx, s.logger, s.db, s.router, s.socialClient, userID.(uuid.UUID), ctx.Value(ctxUsernameKey{}).(string), in.Account.Token, false) + _ = importFacebookFriends(ctx, s.logger, s.db, s.router, s.socialClient, userID.(uuid.UUID), ctx.Value(ctxUsernameKey{}).(string), in.Account.Token, false) } // After hook. if fn := s.runtime.AfterLinkFacebook(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -349,7 +349,7 @@ func (s *ApiServer) LinkFacebookInstantGame(ctx context.Context, in *api.Account } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -385,12 +385,12 @@ AND (NOT EXISTS // After hook. if fn := s.runtime.AfterLinkFacebookInstantGame(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -416,7 +416,7 @@ func (s *ApiServer) LinkGameCenter(ctx context.Context, in *api.AccountGameCente } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -462,12 +462,12 @@ AND (NOT EXISTS // After hook. if fn := s.runtime.AfterLinkGameCenter(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -493,7 +493,7 @@ func (s *ApiServer) LinkGoogle(ctx context.Context, in *api.AccountGoogle) (*emp } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -543,12 +543,12 @@ AND (NOT EXISTS // After hook. if fn := s.runtime.AfterLinkGoogle(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -574,7 +574,7 @@ func (s *ApiServer) LinkSteam(ctx context.Context, in *api.AccountSteam) (*empty } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -614,12 +614,12 @@ AND (NOT EXISTS // After hook. if fn := s.runtime.AfterLinkSteam(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil diff --git a/server/api_match.go b/server/api_match.go index e6406815f..2286b7223 100644 --- a/server/api_match.go +++ b/server/api_match.go @@ -41,7 +41,7 @@ func (s *ApiServer) ListMatches(ctx context.Context, in *api.ListMatchesRequest) } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -82,12 +82,12 @@ func (s *ApiServer) ListMatches(ctx context.Context, in *api.ListMatchesRequest) // After hook. if fn := s.runtime.AfterListMatches(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, list, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, list, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return list, nil diff --git a/server/api_notification.go b/server/api_notification.go index 16120fba9..7b68af9f5 100644 --- a/server/api_notification.go +++ b/server/api_notification.go @@ -48,7 +48,7 @@ func (s *ApiServer) ListNotifications(ctx context.Context, in *api.ListNotificat } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -84,12 +84,12 @@ func (s *ApiServer) ListNotifications(ctx context.Context, in *api.ListNotificat // After hook. if fn := s.runtime.AfterListNotifications(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, notificationList, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, notificationList, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return notificationList, nil @@ -115,7 +115,7 @@ func (s *ApiServer) DeleteNotifications(ctx context.Context, in *api.DeleteNotif } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -131,12 +131,12 @@ func (s *ApiServer) DeleteNotifications(ctx context.Context, in *api.DeleteNotif // After hook. if fn := s.runtime.AfterDeleteNotification(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil diff --git a/server/api_rpc.go b/server/api_rpc.go index 4405606f5..7ab1bd66d 100644 --- a/server/api_rpc.go +++ b/server/api_rpc.go @@ -20,6 +20,7 @@ import ( "io/ioutil" "net/http" "strings" + "time" "github.com/gofrs/uuid" "github.com/gorilla/mux" @@ -83,13 +84,22 @@ func (s *ApiServer) RpcFuncHttp(w http.ResponseWriter, r *http.Request) { return } + // After this point the RPC will be captured in metrics. + start := time.Now() + var success bool + var recvBytes, sentBytes int + defer func() { + s.metrics.Api("Rpc", time.Since(start), int64(recvBytes), int64(sentBytes), !success) + }() + var err error + // Check the RPC function ID. maybeID, ok := mux.Vars(r)["id"] if !ok || maybeID == "" { // Missing RPC function ID. w.WriteHeader(http.StatusBadRequest) w.Header().Set("content-type", "application/json") - _, err := w.Write(rpcIDMustBeSetBytes) + sentBytes, err = w.Write(rpcIDMustBeSetBytes) if err != nil { s.logger.Debug("Error writing response to client", zap.Error(err)) } @@ -103,7 +113,7 @@ func (s *ApiServer) RpcFuncHttp(w http.ResponseWriter, r *http.Request) { // No function registered for this ID. w.WriteHeader(http.StatusNotFound) w.Header().Set("content-type", "application/json") - _, err := w.Write(rpcFunctionNotFoundBytes) + sentBytes, err = w.Write(rpcFunctionNotFoundBytes) if err != nil { s.logger.Debug("Error writing response to client", zap.Error(err)) } @@ -123,12 +133,13 @@ func (s *ApiServer) RpcFuncHttp(w http.ResponseWriter, r *http.Request) { // Error reading request body. w.WriteHeader(http.StatusInternalServerError) w.Header().Set("content-type", "application/json") - _, err := w.Write(internalServerErrorBytes) + sentBytes, err = w.Write(internalServerErrorBytes) if err != nil { s.logger.Debug("Error writing response to client", zap.Error(err)) } return } + recvBytes = len(b) // Maybe attempt to decode to a JSON string to mimic existing GRPC Gateway behaviour. if !unwrap { @@ -136,7 +147,7 @@ func (s *ApiServer) RpcFuncHttp(w http.ResponseWriter, r *http.Request) { if err != nil { w.WriteHeader(http.StatusBadRequest) w.Header().Set("content-type", "application/json") - _, err := w.Write(badJSONBytes) + sentBytes, err = w.Write(badJSONBytes) if err != nil { s.logger.Debug("Error writing response to client", zap.Error(err)) } @@ -162,7 +173,7 @@ func (s *ApiServer) RpcFuncHttp(w http.ResponseWriter, r *http.Request) { response, _ := json.Marshal(map[string]interface{}{"error": fnErr, "message": fnErr.Error(), "code": code}) w.WriteHeader(runtime.HTTPStatusFromCode(code)) w.Header().Set("content-type", "application/json") - _, err := w.Write(response) + sentBytes, err = w.Write(response) if err != nil { s.logger.Debug("Error writing response to client", zap.Error(err)) } @@ -180,7 +191,7 @@ func (s *ApiServer) RpcFuncHttp(w http.ResponseWriter, r *http.Request) { s.logger.Error("Error marshaling wrapped response to client", zap.Error(err)) w.WriteHeader(http.StatusInternalServerError) w.Header().Set("content-type", "application/json") - _, err := w.Write(internalServerErrorBytes) + sentBytes, err = w.Write(internalServerErrorBytes) if err != nil { s.logger.Debug("Error writing response to client", zap.Error(err)) } @@ -198,10 +209,12 @@ func (s *ApiServer) RpcFuncHttp(w http.ResponseWriter, r *http.Request) { // Fall back to default response content type application/json. w.Header().Set("content-type", "application/json") } - _, err := w.Write(response) + sentBytes, err = w.Write(response) if err != nil { s.logger.Debug("Error writing response to client", zap.Error(err)) + return } + success = true } func (s *ApiServer) RpcFunc(ctx context.Context, in *api.Rpc) (*api.Rpc, error) { diff --git a/server/api_storage.go b/server/api_storage.go index ec0e8a3a2..297270625 100644 --- a/server/api_storage.go +++ b/server/api_storage.go @@ -48,7 +48,7 @@ func (s *ApiServer) ListStorageObjects(ctx context.Context, in *api.ListStorageO } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -82,12 +82,12 @@ func (s *ApiServer) ListStorageObjects(ctx context.Context, in *api.ListStorageO // After hook. if fn := s.runtime.AfterListStorageObjects(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, caller.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, storageObjectList, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, caller.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, storageObjectList, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return storageObjectList, nil @@ -113,7 +113,7 @@ func (s *ApiServer) ReadStorageObjects(ctx context.Context, in *api.ReadStorageO } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -142,12 +142,12 @@ func (s *ApiServer) ReadStorageObjects(ctx context.Context, in *api.ReadStorageO // After hook. if fn := s.runtime.AfterReadStorageObjects(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, objects, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, objects, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return objects, nil @@ -173,7 +173,7 @@ func (s *ApiServer) WriteStorageObjects(ctx context.Context, in *api.WriteStorag } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -225,12 +225,12 @@ func (s *ApiServer) WriteStorageObjects(ctx context.Context, in *api.WriteStorag // After hook. if fn := s.runtime.AfterWriteStorageObjects(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID, ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, acks, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID, ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, acks, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return acks, nil @@ -256,7 +256,7 @@ func (s *ApiServer) DeleteStorageObjects(ctx context.Context, in *api.DeleteStor } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -289,12 +289,12 @@ func (s *ApiServer) DeleteStorageObjects(ctx context.Context, in *api.DeleteStor // After hook. if fn := s.runtime.AfterDeleteStorageObjects(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID, ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID, ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil diff --git a/server/api_tournament.go b/server/api_tournament.go index 5ba1a659b..fc01a0414 100644 --- a/server/api_tournament.go +++ b/server/api_tournament.go @@ -53,7 +53,7 @@ func (s *ApiServer) JoinTournament(ctx context.Context, in *api.JoinTournamentRe } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -74,12 +74,12 @@ func (s *ApiServer) JoinTournament(ctx context.Context, in *api.JoinTournamentRe // After hook. if fn := s.runtime.AfterJoinTournament(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), username, ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), username, ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -103,7 +103,7 @@ func (s *ApiServer) ListTournamentRecords(ctx context.Context, in *api.ListTourn } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -163,12 +163,12 @@ func (s *ApiServer) ListTournamentRecords(ctx context.Context, in *api.ListTourn // After hook. if fn := s.runtime.AfterListTournamentRecords(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, recordList, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, recordList, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return recordList, nil @@ -193,7 +193,7 @@ func (s *ApiServer) ListTournaments(ctx context.Context, in *api.ListTournaments } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -256,12 +256,12 @@ func (s *ApiServer) ListTournaments(ctx context.Context, in *api.ListTournaments // After hook. if fn := s.runtime.AfterListTournaments(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, records, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, records, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return records, nil @@ -288,7 +288,7 @@ func (s *ApiServer) WriteTournamentRecord(ctx context.Context, in *api.WriteTour } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -334,12 +334,12 @@ func (s *ApiServer) WriteTournamentRecord(ctx context.Context, in *api.WriteTour // After hook. if fn := s.runtime.AfterWriteTournamentRecord(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.String(), username, ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, record, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), username, ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, record, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return record, nil @@ -363,7 +363,7 @@ func (s *ApiServer) ListTournamentRecordsAroundOwner(ctx context.Context, in *ap } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -406,12 +406,12 @@ func (s *ApiServer) ListTournamentRecordsAroundOwner(ctx context.Context, in *ap // After hook. if fn := s.runtime.AfterListTournamentRecordsAroundOwner(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, list, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, list, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return list, nil diff --git a/server/api_unlink.go b/server/api_unlink.go index 00089ca98..448f7019d 100644 --- a/server/api_unlink.go +++ b/server/api_unlink.go @@ -47,7 +47,7 @@ func (s *ApiServer) UnlinkCustom(ctx context.Context, in *api.AccountCustom) (*e } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -80,12 +80,12 @@ AND ((facebook_id IS NOT NULL // After hook. if fn := s.runtime.AfterUnlinkCustom(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -111,7 +111,7 @@ func (s *ApiServer) UnlinkDevice(ctx context.Context, in *api.AccountDevice) (*e } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -170,12 +170,12 @@ AND (EXISTS (SELECT id FROM users WHERE id = $1 AND // After hook. if fn := s.runtime.AfterUnlinkDevice(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -201,7 +201,7 @@ func (s *ApiServer) UnlinkEmail(ctx context.Context, in *api.AccountEmail) (*emp } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -235,12 +235,12 @@ AND ((facebook_id IS NOT NULL // After hook. if fn := s.runtime.AfterUnlinkEmail(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -266,7 +266,7 @@ func (s *ApiServer) UnlinkFacebook(ctx context.Context, in *api.AccountFacebook) } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -304,12 +304,12 @@ AND ((custom_id IS NOT NULL // After hook. if fn := s.runtime.AfterUnlinkFacebook(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -335,7 +335,7 @@ func (s *ApiServer) UnlinkFacebookInstantGame(ctx context.Context, in *api.Accou } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -374,12 +374,12 @@ AND ((custom_id IS NOT NULL // After hook. if fn := s.runtime.AfterUnlinkFacebookInstantGame(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -405,7 +405,7 @@ func (s *ApiServer) UnlinkGameCenter(ctx context.Context, in *api.AccountGameCen } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -454,12 +454,12 @@ AND ((custom_id IS NOT NULL // After hook. if fn := s.runtime.AfterUnlinkGameCenter(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -485,7 +485,7 @@ func (s *ApiServer) UnlinkGoogle(ctx context.Context, in *api.AccountGoogle) (*e } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -524,12 +524,12 @@ AND ((custom_id IS NOT NULL // After hook. if fn := s.runtime.AfterUnlinkGoogle(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil @@ -555,7 +555,7 @@ func (s *ApiServer) UnlinkSteam(ctx context.Context, in *api.AccountSteam) (*emp } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -598,12 +598,12 @@ AND ((custom_id IS NOT NULL // After hook. if fn := s.runtime.AfterUnlinkSteam(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return &empty.Empty{}, nil diff --git a/server/api_user.go b/server/api_user.go index 62ee8485d..8e37fdb01 100644 --- a/server/api_user.go +++ b/server/api_user.go @@ -41,7 +41,7 @@ func (s *ApiServer) GetUsers(ctx context.Context, in *api.GetUsersRequest) (*api } // Execute the before function lambda wrapped in a trace for stats measurement. - err := traceApiBefore(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) if err != nil { return nil, err } @@ -80,12 +80,12 @@ func (s *ApiServer) GetUsers(ctx context.Context, in *api.GetUsersRequest) (*api // After hook. if fn := s.runtime.AfterGetUsers(); fn != nil { - afterFn := func(clientIP, clientPort string) { - fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, users, in) + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, ctx.Value(ctxUserIDKey{}).(uuid.UUID).String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, users, in) } // Execute the after function lambda wrapped in a trace for stats measurement. - traceApiAfter(ctx, s.logger, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) } return users, nil diff --git a/server/config.go b/server/config.go index 740629012..97a2f9e56 100644 --- a/server/config.go +++ b/server/config.go @@ -505,19 +505,17 @@ func NewLoggerConfig() *LoggerConfig { // MetricsConfig is configuration relevant to metrics capturing and output. type MetricsConfig struct { - ReportingFreqSec int `yaml:"reporting_freq_sec" json:"reporting_freq_sec" usage:"Frequency of metrics exports. Default is 60 seconds."` - StackdriverProjectID string `yaml:"stackdriver_projectid" json:"stackdriver_projectid" usage:"This is the identifier of the Stackdriver project the server is uploading the stats data to. Setting this enables metrics to be exported to Stackdriver."` - Namespace string `yaml:"namespace" json:"namespace" usage:"Namespace for Prometheus or prefix for Stackdriver metrics. It will always prepend node name."` - PrometheusPort int `yaml:"prometheus_port" json:"prometheus_port" usage:"Port to expose Prometheus. If '0' Prometheus exports are disabled."` + ReportingFreqSec int `yaml:"reporting_freq_sec" json:"reporting_freq_sec" usage:"Frequency of metrics exports. Default is 60 seconds."` + Namespace string `yaml:"namespace" json:"namespace" usage:"Namespace for Prometheus metrics. It will always prepend node name."` + PrometheusPort int `yaml:"prometheus_port" json:"prometheus_port" usage:"Port to expose Prometheus. If '0' Prometheus exports are disabled."` } // NewMetricsConfig creates a new MatricsConfig struct. func NewMetricsConfig() *MetricsConfig { return &MetricsConfig{ - ReportingFreqSec: 60, - StackdriverProjectID: "", - Namespace: "", - PrometheusPort: 0, + ReportingFreqSec: 60, + Namespace: "", + PrometheusPort: 0, } } diff --git a/server/console.go b/server/console.go index 4b3557887..530803d4f 100644 --- a/server/console.go +++ b/server/console.go @@ -31,8 +31,6 @@ import ( "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/heroiclabs/nakama/v2/console" - "go.opencensus.io/plugin/ocgrpc" - "go.opencensus.io/zpages" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/codes" @@ -67,7 +65,7 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D } serverOpts := []grpc.ServerOption{ - grpc.StatsHandler(&ocgrpc.ServerHandler{IsPublicEndpoint: true}), + //grpc.StatsHandler(&ocgrpc.ServerHandler{IsPublicEndpoint: true}), grpc.MaxRecvMsgSize(int(config.GetConsole().MaxMessageSizeBytes)), grpc.UnaryInterceptor(consoleInterceptorFunc(logger, config)), } @@ -111,11 +109,11 @@ func StartConsoleServer(logger *zap.Logger, startupLogger *zap.Logger, db *sql.D grpcGatewayRouter.Handle("/favicon.ico", console.UI).Methods("GET") grpcGatewayRouter.PathPrefix("/static/").Handler(console.UI).Methods("GET") - zpagesMux := http.NewServeMux() - zpages.Handle(zpagesMux, "/metrics/") - grpcGatewayRouter.NewRoute().PathPrefix("/metrics").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - zpagesMux.ServeHTTP(w, r) - }) + //zpagesMux := http.NewServeMux() + //zpages.Handle(zpagesMux, "/metrics/") + //grpcGatewayRouter.NewRoute().PathPrefix("/metrics").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // zpagesMux.ServeHTTP(w, r) + //}) grpcGatewayRouter.HandleFunc("/v2/console/storage/import", s.importStorage) diff --git a/server/match_handler.go b/server/match_handler.go index 23b783826..39d78274a 100644 --- a/server/match_handler.go +++ b/server/match_handler.go @@ -196,18 +196,15 @@ func NewMatchHandler(logger *zap.Logger, config Config, matchRegistry MatchRegis return mh, nil } -// Used when an internal match process (or error) requires it to stop. +// Stop the match handler and clean up all its resources. func (mh *MatchHandler) Stop() { - mh.Close() - mh.matchRegistry.RemoveMatch(mh.ID, mh.Stream) -} - -// Used when the match is closed externally. -func (mh *MatchHandler) Close() { if !mh.stopped.CAS(false, true) { return } + // Drop the match handler from the match registry. + mh.matchRegistry.RemoveMatch(mh.ID, mh.Stream) + // Ensure any remaining deferred broadcasts are sent. mh.processDeferred() diff --git a/server/match_registry.go b/server/match_registry.go index 52c838777..10488e500 100644 --- a/server/match_registry.go +++ b/server/match_registry.go @@ -108,6 +108,7 @@ type LocalMatchRegistry struct { config Config tracker Tracker router MessageRouter + metrics *Metrics node string matches *sync.Map @@ -118,7 +119,7 @@ type LocalMatchRegistry struct { stoppedCh chan struct{} } -func NewLocalMatchRegistry(logger, startupLogger *zap.Logger, config Config, tracker Tracker, router MessageRouter, node string) MatchRegistry { +func NewLocalMatchRegistry(logger, startupLogger *zap.Logger, config Config, tracker Tracker, router MessageRouter, metrics *Metrics, node string) MatchRegistry { mapping := bleve.NewIndexMapping() mapping.DefaultAnalyzer = keyword.Name @@ -132,6 +133,7 @@ func NewLocalMatchRegistry(logger, startupLogger *zap.Logger, config Config, tra config: config, tracker: tracker, router: router, + metrics: metrics, node: node, matches: &sync.Map{}, @@ -182,7 +184,7 @@ func (r *LocalMatchRegistry) NewMatch(logger *zap.Logger, id uuid.UUID, core Run r.matches.Store(id, match) count := r.matchCount.Inc() - MetricsRuntimeMatchCount.M(count) + r.metrics.GaugeAuthoritativeMatches(float64(count)) return match, nil } @@ -198,7 +200,7 @@ func (r *LocalMatchRegistry) GetMatch(id uuid.UUID) *MatchHandler { func (r *LocalMatchRegistry) RemoveMatch(id uuid.UUID, stream PresenceStream) { r.matches.Delete(id) matchesRemaining := r.matchCount.Dec() - MetricsRuntimeMatchCount.M(matchesRemaining) + r.metrics.GaugeAuthoritativeMatches(float64(matchesRemaining)) r.tracker.UntrackByStream(stream) if err := r.index.Delete(fmt.Sprintf("%v.%v", id.String(), r.node)); err != nil { @@ -432,9 +434,7 @@ func (r *LocalMatchRegistry) Stop(graceSeconds int) chan struct{} { // Graceful shutdown not allowed/required, or grace period has expired. if graceSeconds == 0 { r.matches.Range(func(id, mh interface{}) bool { - mh.(*MatchHandler).Close() - r.matches.Delete(id) - // No need to clean up label index. + mh.(*MatchHandler).Stop() return true }) // Termination was triggered and there are no active matches. diff --git a/server/metrics.go b/server/metrics.go index 79a419d0d..fbe438a23 100644 --- a/server/metrics.go +++ b/server/metrics.go @@ -17,224 +17,232 @@ package server import ( "context" "fmt" + "go.uber.org/atomic" + "io" "net/http" + "strings" "time" - ocprometheus "contrib.go.opencensus.io/exporter/prometheus" - "contrib.go.opencensus.io/exporter/stackdriver" "github.com/gorilla/handlers" - "github.com/gorilla/mux" - "go.opencensus.io/plugin/ocgrpc" - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" + "github.com/uber-go/tally" + "github.com/uber-go/tally/prometheus" "go.uber.org/zap" ) -var ( - // Metrics stats measurements. - MetricsRuntimeCount = stats.Int64("nakama/runtime/count", "Number of pooled runtime instances", stats.UnitDimensionless) - MetricsRuntimeMatchCount = stats.Int64("nakama/runtime/match_count", "Number of authoritative matches running", stats.UnitDimensionless) - MetricsRuntimeEventsDroppedCount = stats.Int64("nakama/runtime/events_dropped_count", "Number of events dropped by the events processor pool", stats.UnitDimensionless) - MetricsSocketWsTimeSpentMsec = stats.Float64("nakama.socket/ws/server_elapsed_time", "Elapsed time in msecs spent in WebSocket connections", stats.UnitMilliseconds) - MetricsSocketWsOpenCount = stats.Int64("nakama.socket/ws/open_count", "Number of opened WebSocket connections", stats.UnitDimensionless) - MetricsSocketWsCloseCount = stats.Int64("nakama.socket/ws/close_count", "Number of closed WebSocket connections", stats.UnitDimensionless) - MetricsAPITimeSpentMsec = stats.Float64("nakama.api/server/server_elapsed_time", "Elapsed time in msecs spent in API functions", stats.UnitMilliseconds) - MetricsAPICount = stats.Int64("nakama.api/server/request_count", "Number of calls to API functions", stats.UnitDimensionless) - MetricsRtapiTimeSpentMsec = stats.Float64("nakama.rtapi/server/server_elapsed_time", "Elapsed time in msecs spent in realtime socket functions", stats.UnitMilliseconds) - MetricsRtapiCount = stats.Int64("nakama.rtapi/server/request_count", "Number of calls to realtime socket functions", stats.UnitDimensionless) - - // Metrics stats tag keys. - MetricsFunction, _ = tag.NewKey("function") -) - type Metrics struct { logger *zap.Logger config Config + cancelFn context.CancelFunc + + snapshotLatencyMs *atomic.Float64 + snapshotRateSec *atomic.Float64 + snapshotRecvKbSec *atomic.Float64 + snapshotSentKbSec *atomic.Float64 + + currentReqCount *atomic.Int64 + currentMsTotal *atomic.Int64 + currentRecvBytes *atomic.Int64 + currentSentBytes *atomic.Int64 + + prometheusScope tally.Scope + prometheusCloser io.Closer prometheusHTTPServer *http.Server } -func NewMetrics(logger, startupLogger *zap.Logger, config Config, metricsExporter *MetricsExporter) *Metrics { +func NewMetrics(logger, startupLogger *zap.Logger, config Config) *Metrics { + ctx, cancelFn := context.WithCancel(context.Background()) + m := &Metrics{ logger: logger, config: config, - } - if err := view.Register(&view.View{ - Name: MetricsRuntimeCount.Name(), - Description: MetricsRuntimeCount.Description(), - TagKeys: []tag.Key{}, - Measure: MetricsRuntimeCount, - Aggregation: view.Count(), - }); err != nil { - startupLogger.Fatal("Error subscribing runtime count metrics view", zap.Error(err)) - } - if err := view.Register(&view.View{ - Name: MetricsRuntimeMatchCount.Name(), - Description: MetricsRuntimeMatchCount.Description(), - TagKeys: []tag.Key{}, - Measure: MetricsRuntimeMatchCount, - Aggregation: view.LastValue(), - }); err != nil { - startupLogger.Fatal("Error subscribing runtime match count metrics view", zap.Error(err)) - } - if err := view.Register(&view.View{ - Name: MetricsRuntimeEventsDroppedCount.Name(), - Description: MetricsRuntimeEventsDroppedCount.Description(), - TagKeys: []tag.Key{}, - Measure: MetricsRuntimeEventsDroppedCount, - Aggregation: view.Count(), - }); err != nil { - startupLogger.Fatal("Error subscribing runtime events dropped count metrics view", zap.Error(err)) - } - if err := view.Register(&view.View{ - Name: MetricsSocketWsTimeSpentMsec.Name(), - Description: MetricsSocketWsTimeSpentMsec.Description(), - TagKeys: []tag.Key{}, - Measure: MetricsSocketWsTimeSpentMsec, - Aggregation: ocgrpc.DefaultMillisecondsDistribution, - }); err != nil { - startupLogger.Fatal("Error subscribing socket ws elapsed time metrics view", zap.Error(err)) - } - if err := view.Register(&view.View{ - Name: MetricsSocketWsOpenCount.Name(), - Description: MetricsSocketWsOpenCount.Description(), - TagKeys: []tag.Key{}, - Measure: MetricsSocketWsOpenCount, - Aggregation: view.Count(), - }); err != nil { - startupLogger.Fatal("Error subscribing socket ws opened count metrics view", zap.Error(err)) - } - if err := view.Register(&view.View{ - Name: MetricsSocketWsCloseCount.Name(), - Description: MetricsSocketWsCloseCount.Description(), - TagKeys: []tag.Key{}, - Measure: MetricsSocketWsCloseCount, - Aggregation: view.Count(), - }); err != nil { - startupLogger.Fatal("Error subscribing socket ws count metrics view", zap.Error(err)) - } - if err := view.Register(&view.View{ - Name: MetricsAPITimeSpentMsec.Name(), - Description: MetricsAPITimeSpentMsec.Description(), - TagKeys: []tag.Key{MetricsFunction}, - Measure: MetricsAPITimeSpentMsec, - Aggregation: ocgrpc.DefaultMillisecondsDistribution, - }); err != nil { - startupLogger.Fatal("Error subscribing api elapsed time metrics view", zap.Error(err)) - } - if err := view.Register(&view.View{ - Name: MetricsAPICount.Name(), - Description: MetricsAPICount.Description(), - TagKeys: []tag.Key{MetricsFunction}, - Measure: MetricsAPICount, - Aggregation: view.Count(), - }); err != nil { - startupLogger.Fatal("Error subscribing api request count metrics view", zap.Error(err)) - } - if err := view.Register(&view.View{ - Name: MetricsRtapiTimeSpentMsec.Name(), - Description: MetricsRtapiTimeSpentMsec.Description(), - TagKeys: []tag.Key{MetricsFunction}, - Measure: MetricsRtapiTimeSpentMsec, - Aggregation: ocgrpc.DefaultMillisecondsDistribution, - }); err != nil { - startupLogger.Fatal("Error subscribing rtapi elapsed time metrics view", zap.Error(err)) - } - if err := view.Register(&view.View{ - Name: MetricsRtapiCount.Name(), - Description: MetricsRtapiCount.Description(), - TagKeys: []tag.Key{MetricsFunction}, - Measure: MetricsRtapiCount, - Aggregation: view.Count(), - }); err != nil { - startupLogger.Fatal("Error subscribing rtapi request count metrics view", zap.Error(err)) - } + cancelFn: cancelFn, - view.SetReportingPeriod(time.Duration(config.GetMetrics().ReportingFreqSec) * time.Second) + snapshotLatencyMs: atomic.NewFloat64(0), + snapshotRateSec: atomic.NewFloat64(0), + snapshotRecvKbSec: atomic.NewFloat64(0), + snapshotSentKbSec: atomic.NewFloat64(0), - view.RegisterExporter(metricsExporter) - - if config.GetMetrics().StackdriverProjectID != "" { - m.initStackdriver(logger, startupLogger, config) + currentMsTotal: atomic.NewInt64(0), + currentReqCount: atomic.NewInt64(0), + currentRecvBytes: atomic.NewInt64(0), + currentSentBytes: atomic.NewInt64(0), } + go func() { + const snapshotFrequencySec = 5 + for { + select { + case <-ctx.Done(): + return + case <-time.After(snapshotFrequencySec * time.Second): + reqCount := float64(m.currentReqCount.Swap(0)) + totalMs := float64(m.currentMsTotal.Swap(0)) + recvBytes := float64(m.currentRecvBytes.Swap(0)) + sentBytes := float64(m.currentSentBytes.Swap(0)) + + if reqCount > 0 { + m.snapshotLatencyMs.Store(totalMs / reqCount) + } else { + m.snapshotLatencyMs.Store(0) + } + m.snapshotRateSec.Store(reqCount / snapshotFrequencySec) + m.snapshotRecvKbSec.Store((recvBytes / 1024) / snapshotFrequencySec) + m.snapshotSentKbSec.Store((sentBytes / 1024) / snapshotFrequencySec) + } + } + }() + + // Create Prometheus reporter and root scope. + reporter := prometheus.NewReporter(prometheus.Options{ + OnRegisterError: func(err error) { + logger.Error("Error registering Prometheus metric", zap.Error(err)) + }, + }) + tags := map[string]string{"node_name": config.GetName()} + if namespace := config.GetMetrics().Namespace; namespace != "" { + tags["namespace"] = namespace + } + m.prometheusScope, m.prometheusCloser = tally.NewRootScope(tally.ScopeOptions{ + Prefix: config.GetName(), + Tags: tags, + CachedReporter: reporter, + Separator: prometheus.DefaultSeparator, + }, time.Duration(config.GetMetrics().ReportingFreqSec)*time.Second) + + // Check if exposing Prometheus metrics directly is enabled. if config.GetMetrics().PrometheusPort > 0 { - m.initPrometheus(logger, startupLogger, config) + // Create a HTTP server to expose Prometheus metrics through. + CORSHeaders := handlers.AllowedHeaders([]string{"Content-Type", "User-Agent"}) + CORSOrigins := handlers.AllowedOrigins([]string{"*"}) + CORSMethods := handlers.AllowedMethods([]string{"GET", "HEAD"}) + handlerWithCORS := handlers.CORS(CORSHeaders, CORSOrigins, CORSMethods)(reporter.HTTPHandler()) + m.prometheusHTTPServer = &http.Server{ + Addr: fmt.Sprintf(":%d", config.GetMetrics().PrometheusPort), + ReadTimeout: time.Millisecond * time.Duration(int64(config.GetSocket().ReadTimeoutMs)), + WriteTimeout: time.Millisecond * time.Duration(int64(config.GetSocket().WriteTimeoutMs)), + IdleTimeout: time.Millisecond * time.Duration(int64(config.GetSocket().IdleTimeoutMs)), + Handler: handlerWithCORS, + } + + // Start Prometheus metrics server. + startupLogger.Info("Starting Prometheus server for metrics requests", zap.Int("port", config.GetMetrics().PrometheusPort)) + go func() { + if err := m.prometheusHTTPServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { + startupLogger.Fatal("Prometheus listener failed", zap.Error(err)) + } + }() } return m } -func (m *Metrics) initStackdriver(logger, startupLogger *zap.Logger, config Config) { - prefix := config.GetName() - if config.GetMetrics().Namespace != "" { - prefix += "-" + config.GetMetrics().Namespace +func (m *Metrics) Stop(logger *zap.Logger) { + if m.prometheusHTTPServer != nil { + // Stop Prometheus server if one is running. + if err := m.prometheusHTTPServer.Shutdown(context.Background()); err != nil { + logger.Error("Prometheus listener shutdown failed", zap.Error(err)) + } } - exporter, err := stackdriver.NewExporter(stackdriver.Options{ - GetMetricDisplayName: func(view *view.View) string { - return prefix + "/" + view.Name - }, - ProjectID: config.GetMetrics().StackdriverProjectID, - OnError: func(err error) { - logger.Error("Could not upload data to Stackdriver", zap.Error(err)) - }, - }) - if err != nil { - startupLogger.Fatal("Could not setup Stackdriver exporter", zap.Error(err)) + // Close the Prometheus root scope if it's open. + if err := m.prometheusCloser.Close(); err != nil { + logger.Error("Prometheus stats closer failed", zap.Error(err)) } - view.RegisterExporter(exporter) + m.cancelFn() } -func (m *Metrics) initPrometheus(logger, startupLogger *zap.Logger, config Config) { - labels := make(map[string]string, 2) - labels["node_name"] = config.GetName() +func (m *Metrics) Api(name string, elapsed time.Duration, recvBytes, sentBytes int64, isErr bool) { + name = strings.TrimPrefix(name, API_PREFIX) + + // Increment ongoing statistics for current measurement window. + m.currentMsTotal.Add(int64(elapsed / time.Millisecond)) + m.currentReqCount.Inc() + m.currentRecvBytes.Add(recvBytes) + m.currentSentBytes.Add(sentBytes) + + // Global stats. + m.prometheusScope.Counter("overall_count").Inc(1) + m.prometheusScope.Counter("overall_recv_bytes").Inc(recvBytes) + m.prometheusScope.Counter("overall_sent_bytes").Inc(sentBytes) + m.prometheusScope.Timer("overall_latency_ms").Record(elapsed / time.Millisecond) + + // Per-endpoint stats. + m.prometheusScope.Counter(name + "_count").Inc(1) + m.prometheusScope.Counter(name + "_recv_bytes").Inc(recvBytes) + m.prometheusScope.Counter(name + "_sent_bytes").Inc(sentBytes) + m.prometheusScope.Timer(name + "_latency_ms").Record(elapsed / time.Millisecond) - if config.GetMetrics().Namespace != "" { - labels["namespace"] = config.GetMetrics().Namespace + // Error stats if applicable. + if isErr { + m.prometheusScope.Counter("overall_errors").Inc(1) + m.prometheusScope.Counter(name + "_errors").Inc(1) } +} - exporter, err := ocprometheus.NewExporter(ocprometheus.Options{ - ConstLabels: labels, - OnError: func(err error) { - logger.Error("Could not upload data to Prometheus", zap.Error(err)) - }, - }) - if err != nil { - startupLogger.Fatal("Could not setup Prometheus exporter", zap.Error(err)) +func (m *Metrics) ApiBefore(name string, elapsed time.Duration, isErr bool) { + name = "before_" + strings.TrimPrefix(name, API_PREFIX) + + // Global stats. + m.prometheusScope.Counter("overall_before_count").Inc(1) + m.prometheusScope.Timer("overall_before_latency_ms").Record(elapsed / time.Millisecond) + + // Per-endpoint stats. + m.prometheusScope.Counter(name + "_count").Inc(1) + m.prometheusScope.Timer(name + "_latency_ms").Record(elapsed / time.Millisecond) + + // Error stats if applicable. + if isErr { + m.prometheusScope.Counter("overall_before_errors").Inc(1) + m.prometheusScope.Counter(name + "_errors").Inc(1) } +} + +func (m *Metrics) ApiAfter(name string, elapsed time.Duration, isErr bool) { + name = "after_" + strings.TrimPrefix(name, API_PREFIX) - view.RegisterExporter(exporter) - - router := mux.NewRouter() - router.Handle("/", exporter).Methods("GET") - CORSHeaders := handlers.AllowedHeaders([]string{"Content-Type", "User-Agent"}) - CORSOrigins := handlers.AllowedOrigins([]string{"*"}) - CORSMethods := handlers.AllowedMethods([]string{"GET", "HEAD"}) - handlerWithCORS := handlers.CORS(CORSHeaders, CORSOrigins, CORSMethods)(router) - - m.prometheusHTTPServer = &http.Server{ - Addr: fmt.Sprintf(":%d", config.GetMetrics().PrometheusPort), - ReadTimeout: time.Millisecond * time.Duration(int64(config.GetSocket().ReadTimeoutMs)), - WriteTimeout: time.Millisecond * time.Duration(int64(config.GetSocket().WriteTimeoutMs)), - IdleTimeout: time.Millisecond * time.Duration(int64(config.GetSocket().IdleTimeoutMs)), - Handler: handlerWithCORS, + // Global stats. + m.prometheusScope.Counter("overall_after_count").Inc(1) + m.prometheusScope.Timer("overall_after_latency_ms").Record(elapsed / time.Millisecond) + + // Per-endpoint stats. + m.prometheusScope.Counter(name + "_count").Inc(1) + m.prometheusScope.Timer(name + "_latency_ms").Record(elapsed / time.Millisecond) + + // Error stats if applicable. + if isErr { + m.prometheusScope.Counter("overall_after_errors").Inc(1) + m.prometheusScope.Counter(name + "_errors").Inc(1) } +} - startupLogger.Info("Starting Prometheus server for metrics requests", zap.Int("port", config.GetMetrics().PrometheusPort)) - go func() { - if err := m.prometheusHTTPServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { - startupLogger.Fatal("Prometheus listener failed", zap.Error(err)) - } - }() +// Set the absolute value of currently allocated Lua runtime VMs. +func (m *Metrics) GaugeRuntimes(value float64) { + m.prometheusScope.Gauge("lua_runtimes").Update(value) } -func (m *Metrics) Stop(logger *zap.Logger) { - if m.prometheusHTTPServer != nil { - if err := m.prometheusHTTPServer.Shutdown(context.Background()); err != nil { - logger.Error("Prometheus listener shutdown failed", zap.Error(err)) - } - } +// Set the absolute value of currently running authoritative matches. +func (m *Metrics) GaugeAuthoritativeMatches(value float64) { + m.prometheusScope.Gauge("authoritative_matches").Update(value) +} + +// Increment the number of dropped events. +func (m *Metrics) CountDroppedEvents(delta int64) { + m.prometheusScope.Counter("dropped_events").Inc(delta) +} + +// Increment the number of opened WS connections. +func (m *Metrics) CountWebsocketOpened(delta int64) { + m.prometheusScope.Counter("socket_ws_opened").Inc(delta) +} + +// Increment the number of closed WS connections. +func (m *Metrics) CountWebsocketClosed(delta int64) { + m.prometheusScope.Counter("socket_ws_closed").Inc(delta) +} + +// Set the absolute value of currently active sessions. +func (m *Metrics) GaugeSessions(value float64) { + m.prometheusScope.Gauge("sessions").Update(value) } diff --git a/server/metrics_exporter.go b/server/metrics_exporter.go deleted file mode 100644 index abfdcbc22..000000000 --- a/server/metrics_exporter.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2019 The Nakama Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package server - -import ( - "go.opencensus.io/plugin/ocgrpc" - "go.opencensus.io/stats/view" - "go.uber.org/atomic" - "go.uber.org/zap" -) - -type MetricsExporter struct { - logger *zap.Logger - - Latency *atomic.Float64 - Rate *atomic.Float64 - Input *atomic.Float64 - Output *atomic.Float64 -} - -func NewMetricsExporter(logger *zap.Logger) *MetricsExporter { - return &MetricsExporter{ - logger: logger, - - Latency: atomic.NewFloat64(0), - Rate: atomic.NewFloat64(0), - Input: atomic.NewFloat64(0), - Output: atomic.NewFloat64(0), - } -} - -func (m *MetricsExporter) ExportView(vd *view.Data) { - windowSec := float64(vd.End.Unix() - vd.Start.Unix()) - if windowSec <= 0 { - return - } - - switch vd.View { - case ocgrpc.ServerLatencyView: - var count, mean float64 - for _, row := range vd.Rows { - rdd, ok := row.Data.(*view.DistributionData) - if !ok { - m.logger.Warn("Error casting metrics view row data.", zap.String("view", ocgrpc.ServerLatencyView.Name)) - continue - } - c := float64(rdd.Count) - if c == 0 { - continue - } - count, mean = c+count, (c*rdd.Mean+count*mean)/(c+count) - } - // Average latency across all requests for all handlers. - m.Latency.Store(mean) - case ocgrpc.ServerCompletedRPCsView: - var count int64 - for _, row := range vd.Rows { - rcd, ok := row.Data.(*view.CountData) - if !ok { - m.logger.Warn("Error casting metrics view row data.", zap.String("view", ocgrpc.ServerCompletedRPCsView.Name)) - continue - } - count += rcd.Value - //for _, t := range row.Tags { - // if t.Key.Name() == ocgrpc.KeyServerStatus.Name() && t.Value != codes.OK.String() { - // // If error counts are ever needed this is how they're exposed. - // } - //} - } - m.Rate.Store(float64(count) / windowSec) - case ocgrpc.ServerReceivedBytesPerRPCView: - var total float64 - for _, row := range vd.Rows { - rdd, ok := row.Data.(*view.DistributionData) - if !ok { - m.logger.Warn("Error casting metrics view row data.", zap.String("view", ocgrpc.ServerCompletedRPCsView.Name)) - continue - } - total += rdd.Mean * float64(rdd.Count) - } - m.Input.Store(total / 1024 / windowSec) - case ocgrpc.ServerSentBytesPerRPCView: - var total float64 - for _, row := range vd.Rows { - rdd, ok := row.Data.(*view.DistributionData) - if !ok { - m.logger.Warn("Error casting metrics view row data.", zap.String("view", ocgrpc.ServerCompletedRPCsView.Name)) - continue - } - total += rdd.Mean * float64(rdd.Count) - } - m.Output.Store(total / 1024 / windowSec) - } -} diff --git a/server/metrics_grpc_handler.go b/server/metrics_grpc_handler.go new file mode 100644 index 000000000..ff8be9659 --- /dev/null +++ b/server/metrics_grpc_handler.go @@ -0,0 +1,71 @@ +// Copyright 2020 The Nakama Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package server + +import ( + "context" + "sync/atomic" + + "google.golang.org/grpc/stats" +) + +type ctxMetricsGrpcHandlerKey struct{} + +type metricsGrpcHandlerData struct { + fullMethodName string + recvBytes int64 + sentBytes int64 +} + +type MetricsGrpcHandler struct { + metrics *Metrics +} + +// TagRPC can attach some information to the given context. +// The context used for the rest lifetime of the RPC will be derived from +// the returned context. +func (m *MetricsGrpcHandler) TagRPC(ctx context.Context, info *stats.RPCTagInfo) context.Context { + return context.WithValue(ctx, ctxMetricsGrpcHandlerKey{}, &metricsGrpcHandlerData{fullMethodName: info.FullMethodName}) +} + +// HandleRPC processes the RPC stats. +func (m *MetricsGrpcHandler) HandleRPC(ctx context.Context, rs stats.RPCStats) { + data := ctx.Value(ctxMetricsGrpcHandlerKey{}).(*metricsGrpcHandlerData) + switch rs := rs.(type) { + case *stats.Begin: + // No-op. + case *stats.InPayload: + atomic.AddInt64(&data.recvBytes, int64(rs.WireLength)) + case *stats.OutPayload: + atomic.AddInt64(&data.sentBytes, int64(rs.WireLength)) + case *stats.End: + m.metrics.Api(data.fullMethodName, rs.EndTime.Sub(rs.BeginTime), data.recvBytes, data.sentBytes, rs.Error != nil) + } +} + +// TagConn can attach some information to the given context. +// The returned context will be used for stats handling. +// For conn stats handling, the context used in HandleConn for this +// connection will be derived from the context returned. +// For RPC stats handling, +// - On server side, the context used in HandleRPC for all RPCs on this +// connection will be derived from the context returned. +// - On client side, the context is not derived from the context returned. +func (m *MetricsGrpcHandler) TagConn(ctx context.Context, _ *stats.ConnTagInfo) context.Context { + return ctx +} + +// HandleConn processes the Conn stats. +func (m *MetricsGrpcHandler) HandleConn(context.Context, stats.ConnStats) {} diff --git a/server/runtime.go b/server/runtime.go index 1c2bca94e..601609c36 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -449,7 +449,7 @@ func CheckRuntime(logger *zap.Logger, config Config) error { return nil } -func NewRuntime(logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, streamManager StreamManager, router MessageRouter) (*Runtime, error) { +func NewRuntime(logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics *Metrics, streamManager StreamManager, router MessageRouter) (*Runtime, error) { runtimeConfig := config.GetRuntime() startupLogger.Info("Initialising runtime", zap.String("path", runtimeConfig.Path)) @@ -459,7 +459,7 @@ func NewRuntime(logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler * } startupLogger.Info("Initialising runtime event queue processor") - eventQueue := NewRuntimeEventQueue(logger, config) + eventQueue := NewRuntimeEventQueue(logger, config, metrics) startupLogger.Info("Runtime event queue processor started", zap.Int("size", config.GetRuntime().EventQueueSize), zap.Int("workers", config.GetRuntime().EventQueueWorkers)) goModules, goRPCFunctions, goBeforeRtFunctions, goAfterRtFunctions, goBeforeReqFunctions, goAfterReqFunctions, goMatchmakerMatchedFunction, goMatchCreateFn, goTournamentEndFunction, goTournamentResetFunction, goLeaderboardResetFunction, allEventFunctions, goSetMatchCreateFn, goMatchNamesListFn, err := NewRuntimeProviderGo(logger, startupLogger, db, jsonpbMarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, runtimeConfig.Path, paths, eventQueue) @@ -468,7 +468,7 @@ func NewRuntime(logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler * return nil, err } - luaModules, luaRPCFunctions, luaBeforeRtFunctions, luaAfterRtFunctions, luaBeforeReqFunctions, luaAfterReqFunctions, luaMatchmakerMatchedFunction, allMatchCreateFn, luaTournamentEndFunction, luaTournamentResetFunction, luaLeaderboardResetFunction, err := NewRuntimeProviderLua(logger, startupLogger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, goMatchCreateFn, runtimeConfig.Path, paths) + luaModules, luaRPCFunctions, luaBeforeRtFunctions, luaAfterRtFunctions, luaBeforeReqFunctions, luaAfterReqFunctions, luaMatchmakerMatchedFunction, allMatchCreateFn, luaTournamentEndFunction, luaTournamentResetFunction, luaLeaderboardResetFunction, err := NewRuntimeProviderLua(logger, startupLogger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, metrics, streamManager, router, goMatchCreateFn, allEventFunctions.eventFunction, runtimeConfig.Path, paths) if err != nil { startupLogger.Error("Error initialising Lua runtime provider", zap.Error(err)) return nil, err diff --git a/server/runtime_event.go b/server/runtime_event.go index fefed755d..151a91f44 100644 --- a/server/runtime_event.go +++ b/server/runtime_event.go @@ -20,7 +20,8 @@ import ( ) type RuntimeEventQueue struct { - logger *zap.Logger + logger *zap.Logger + metrics *Metrics ch chan func() @@ -28,9 +29,10 @@ type RuntimeEventQueue struct { ctxCancelFn context.CancelFunc } -func NewRuntimeEventQueue(logger *zap.Logger, config Config) *RuntimeEventQueue { +func NewRuntimeEventQueue(logger *zap.Logger, config Config, metrics *Metrics) *RuntimeEventQueue { b := &RuntimeEventQueue{ - logger: logger, + logger: logger, + metrics: metrics, ch: make(chan func(), config.GetRuntime().EventQueueSize), } @@ -59,7 +61,7 @@ func (b *RuntimeEventQueue) Queue(fn func()) { // Event queued successfully. default: // Event queue is full, drop it to avoid blocking the caller. - MetricsRuntimeEventsDroppedCount.M(1) + b.metrics.CountDroppedEvents(1) b.logger.Warn("Runtime event queue full, events may be lost") } } diff --git a/server/runtime_lua.go b/server/runtime_lua.go index b98247bc7..4cc74f028 100644 --- a/server/runtime_lua.go +++ b/server/runtime_lua.go @@ -38,7 +38,6 @@ import ( "github.com/heroiclabs/nakama-common/runtime" "github.com/heroiclabs/nakama/v2/internal/gopher-lua" "github.com/heroiclabs/nakama/v2/social" - "go.opencensus.io/stats" "go.uber.org/zap" "go.uber.org/zap/zapcore" "google.golang.org/grpc/codes" @@ -96,6 +95,7 @@ type RuntimeProviderLua struct { sessionRegistry SessionRegistry matchRegistry MatchRegistry tracker Tracker + metrics *Metrics router MessageRouter stdLibs map[string]lua.LGFunction @@ -108,7 +108,7 @@ type RuntimeProviderLua struct { statsCtx context.Context } -func NewRuntimeProviderLua(logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, streamManager StreamManager, router MessageRouter, goMatchCreateFn RuntimeMatchCreateFunction, rootPath string, paths []string) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchCreateFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, error) { +func NewRuntimeProviderLua(logger, startupLogger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, leaderboardRankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics *Metrics, streamManager StreamManager, router MessageRouter, goMatchCreateFn RuntimeMatchCreateFunction, eventFn RuntimeEventCustomFunction, rootPath string, paths []string) ([]string, map[string]RuntimeRpcFunction, map[string]RuntimeBeforeRtFunction, map[string]RuntimeAfterRtFunction, *RuntimeBeforeReqFunctions, *RuntimeAfterReqFunctions, RuntimeMatchmakerMatchedFunction, RuntimeMatchCreateFunction, RuntimeTournamentEndFunction, RuntimeTournamentResetFunction, RuntimeLeaderboardResetFunction, error) { startupLogger.Info("Initialising Lua runtime provider", zap.String("path", rootPath)) // Load Lua modules into memory by reading the file contents. No evaluation/execution at this stage. @@ -141,7 +141,7 @@ func NewRuntimeProviderLua(logger, startupLogger *zap.Logger, db *sql.DB, jsonpb if core != nil { return core, nil } - return NewRuntimeLuaMatchCore(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, stdLibs, once, localCache, goMatchCreateFn, sharedReg, sharedGlobals, id, node, stopped, name) + return NewRuntimeLuaMatchCore(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, stdLibs, once, localCache, goMatchCreateFn, eventFn, sharedReg, sharedGlobals, id, node, stopped, name) } runtimeProviderLua := &RuntimeProviderLua{ @@ -156,6 +156,7 @@ func NewRuntimeProviderLua(logger, startupLogger *zap.Logger, db *sql.DB, jsonpb sessionRegistry: sessionRegistry, matchRegistry: matchRegistry, tracker: tracker, + metrics: metrics, router: router, stdLibs: stdLibs, @@ -168,7 +169,7 @@ func NewRuntimeProviderLua(logger, startupLogger *zap.Logger, db *sql.DB, jsonpb statsCtx: context.Background(), } - r, err := newRuntimeLuaVM(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, stdLibs, moduleCache, once, localCache, allMatchCreateFn, func(execMode RuntimeExecutionMode, id string) { + r, err := newRuntimeLuaVM(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, stdLibs, moduleCache, once, localCache, allMatchCreateFn, eventFn, func(execMode RuntimeExecutionMode, id string) { switch execMode { case RuntimeExecutionModeRPC: rpcFunctions[id] = func(ctx context.Context, queryParams map[string][]string, userID, username string, vars map[string]string, expiry int64, sessionID, clientIP, clientPort, payload string) (string, error, codes.Code) { @@ -1002,7 +1003,7 @@ func NewRuntimeProviderLua(logger, startupLogger *zap.Logger, db *sql.DB, jsonpb r.Stop() runtimeProviderLua.newFn = func() *RuntimeLua { - r, err := newRuntimeLuaVM(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, stdLibs, moduleCache, once, localCache, allMatchCreateFn, nil) + r, err := newRuntimeLuaVM(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, leaderboardRankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, stdLibs, moduleCache, once, localCache, allMatchCreateFn, eventFn, nil) if err != nil { logger.Fatal("Failed to initialize Lua runtime", zap.Error(err)) } @@ -1019,7 +1020,7 @@ func NewRuntimeProviderLua(logger, startupLogger *zap.Logger, db *sql.DB, jsonpb for i := 0; i < config.GetRuntime().MinCount; i++ { runtimeProviderLua.poolCh <- runtimeProviderLua.newFn() } - stats.Record(runtimeProviderLua.statsCtx, MetricsRuntimeCount.M(int64(config.GetRuntime().MinCount))) + runtimeProviderLua.metrics.GaugeRuntimes(float64(config.GetRuntime().MinCount)) } startupLogger.Info("Allocated minimum runtime pool") @@ -1666,13 +1667,14 @@ func (rp *RuntimeProviderLua) Get(ctx context.Context) (*RuntimeLua, error) { // No further runtime allocations allowed. break } - if rp.currentCount.Inc() > rp.maxCount { + currentCount := rp.currentCount.Inc() + if currentCount > rp.maxCount { // When we've incremented see if we can still allocate or a concurrent operation has already done so up to the limit. // The current count value may go above max count value, but we will never over-allocate runtimes. // This discrepancy is allowed as it avoids a full mutex locking scenario. break } - stats.Record(rp.statsCtx, MetricsRuntimeCount.M(1)) + rp.metrics.GaugeRuntimes(float64(currentCount)) return rp.newFn(), nil } @@ -1896,7 +1898,7 @@ func checkRuntimeLuaVM(logger *zap.Logger, config Config, stdLibs map[string]lua vm.Push(lua.LString(name)) vm.Call(1, 0) } - nakamaModule := NewRuntimeLuaNakamaModule(nil, nil, nil, nil, config, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) + nakamaModule := NewRuntimeLuaNakamaModule(nil, nil, nil, nil, config, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil) vm.PreloadModule("nakama", nakamaModule.Loader) preload := vm.GetField(vm.GetField(vm.Get(lua.EnvironIndex), "package"), "preload") @@ -1917,7 +1919,7 @@ func checkRuntimeLuaVM(logger *zap.Logger, config Config, stdLibs map[string]lua return nil } -func newRuntimeLuaVM(logger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, streamManager StreamManager, router MessageRouter, stdLibs map[string]lua.LGFunction, moduleCache *RuntimeLuaModuleCache, once *sync.Once, localCache *RuntimeLuaLocalCache, matchCreateFn RuntimeMatchCreateFunction, announceCallbackFn func(RuntimeExecutionMode, string)) (*RuntimeLua, error) { +func newRuntimeLuaVM(logger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, streamManager StreamManager, router MessageRouter, stdLibs map[string]lua.LGFunction, moduleCache *RuntimeLuaModuleCache, once *sync.Once, localCache *RuntimeLuaLocalCache, matchCreateFn RuntimeMatchCreateFunction, eventFn RuntimeEventCustomFunction, announceCallbackFn func(RuntimeExecutionMode, string)) (*RuntimeLua, error) { vm := lua.NewState(lua.Options{ CallStackSize: config.GetRuntime().CallStackSize, RegistrySize: config.GetRuntime().RegistrySize, @@ -1953,7 +1955,7 @@ func newRuntimeLuaVM(logger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Mar callbacks.LeaderboardReset = fn } } - nakamaModule := NewRuntimeLuaNakamaModule(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, rankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, once, localCache, matchCreateFn, registerCallbackFn, announceCallbackFn) + nakamaModule := NewRuntimeLuaNakamaModule(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, rankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, once, localCache, matchCreateFn, eventFn, registerCallbackFn, announceCallbackFn) vm.PreloadModule("nakama", nakamaModule.Loader) r := &RuntimeLua{ logger: logger, diff --git a/server/runtime_lua_match_core.go b/server/runtime_lua_match_core.go index 9d1219c2f..9b9828bd4 100644 --- a/server/runtime_lua_match_core.go +++ b/server/runtime_lua_match_core.go @@ -57,7 +57,7 @@ type RuntimeLuaMatchCore struct { ctxCancelFn context.CancelFunc } -func NewRuntimeLuaMatchCore(logger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, streamManager StreamManager, router MessageRouter, stdLibs map[string]lua.LGFunction, once *sync.Once, localCache *RuntimeLuaLocalCache, goMatchCreateFn RuntimeMatchCreateFunction, sharedReg, sharedGlobals *lua.LTable, id uuid.UUID, node string, stopped *atomic.Bool, name string) (RuntimeMatchCore, error) { +func NewRuntimeLuaMatchCore(logger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, streamManager StreamManager, router MessageRouter, stdLibs map[string]lua.LGFunction, once *sync.Once, localCache *RuntimeLuaLocalCache, goMatchCreateFn RuntimeMatchCreateFunction, eventFn RuntimeEventCustomFunction, sharedReg, sharedGlobals *lua.LTable, id uuid.UUID, node string, stopped *atomic.Bool, name string) (RuntimeMatchCore, error) { // Set up the Lua VM that will handle this match. vm := lua.NewState(lua.Options{ CallStackSize: config.GetRuntime().CallStackSize, @@ -95,10 +95,10 @@ func NewRuntimeLuaMatchCore(logger *zap.Logger, db *sql.DB, jsonpbMarshaler *jso if core != nil { return core, nil } - return NewRuntimeLuaMatchCore(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, rankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, stdLibs, once, localCache, goMatchCreateFn, nil, nil, id, node, stopped, name) + return NewRuntimeLuaMatchCore(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, rankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, stdLibs, once, localCache, goMatchCreateFn, eventFn, nil, nil, id, node, stopped, name) } - nakamaModule := NewRuntimeLuaNakamaModule(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, rankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, once, localCache, allMatchCreateFn, nil, nil) + nakamaModule := NewRuntimeLuaNakamaModule(logger, db, jsonpbMarshaler, jsonpbUnmarshaler, config, socialClient, leaderboardCache, rankCache, leaderboardScheduler, sessionRegistry, matchRegistry, tracker, streamManager, router, once, localCache, allMatchCreateFn, eventFn, nil, nil) vm.PreloadModule("nakama", nakamaModule.Loader) } diff --git a/server/runtime_lua_nakama.go b/server/runtime_lua_nakama.go index bc81e739c..3dbd245c7 100644 --- a/server/runtime_lua_nakama.go +++ b/server/runtime_lua_nakama.go @@ -77,9 +77,10 @@ type RuntimeLuaNakamaModule struct { node string matchCreateFn RuntimeMatchCreateFunction + eventFn RuntimeEventCustomFunction } -func NewRuntimeLuaNakamaModule(logger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, streamManager StreamManager, router MessageRouter, once *sync.Once, localCache *RuntimeLuaLocalCache, matchCreateFn RuntimeMatchCreateFunction, registerCallbackFn func(RuntimeExecutionMode, string, *lua.LFunction), announceCallbackFn func(RuntimeExecutionMode, string)) *RuntimeLuaNakamaModule { +func NewRuntimeLuaNakamaModule(logger *zap.Logger, db *sql.DB, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, config Config, socialClient *social.Client, leaderboardCache LeaderboardCache, rankCache LeaderboardRankCache, leaderboardScheduler LeaderboardScheduler, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, streamManager StreamManager, router MessageRouter, once *sync.Once, localCache *RuntimeLuaLocalCache, matchCreateFn RuntimeMatchCreateFunction, eventFn RuntimeEventCustomFunction, registerCallbackFn func(RuntimeExecutionMode, string, *lua.LFunction), announceCallbackFn func(RuntimeExecutionMode, string)) *RuntimeLuaNakamaModule { return &RuntimeLuaNakamaModule{ logger: logger, db: db, @@ -105,6 +106,7 @@ func NewRuntimeLuaNakamaModule(logger *zap.Logger, db *sql.DB, jsonpbMarshaler * node: config.GetName(), matchCreateFn: matchCreateFn, + eventFn: eventFn, } } @@ -121,6 +123,7 @@ func (n *RuntimeLuaNakamaModule) Loader(l *lua.LState) int { "register_leaderboard_reset": n.registerLeaderboardReset, "run_once": n.runOnce, "get_context": n.getContext, + "event": n.event, "localcache_get": n.localcacheGet, "localcache_put": n.localcachePut, "localcache_delete": n.localcacheDelete, @@ -406,6 +409,65 @@ func (n *RuntimeLuaNakamaModule) getContext(l *lua.LState) int { return 1 } +func (n *RuntimeLuaNakamaModule) event(l *lua.LState) int { + name := l.CheckString(1) + if name == "" { + l.ArgError(1, "expects name string") + return 0 + } + + propertiesTable := l.OptTable(2, nil) + var properties map[string]string + if propertiesTable != nil { + var conversionError bool + properties = make(map[string]string, propertiesTable.Len()) + propertiesTable.ForEach(func(k lua.LValue, v lua.LValue) { + if conversionError { + return + } + + if k.Type() != lua.LTString { + l.ArgError(2, "properties keys must be strings") + conversionError = true + return + } + if v.Type() != lua.LTString { + l.ArgError(2, "properties values must be strings") + conversionError = true + return + } + + properties[k.String()] = v.String() + }) + + if conversionError { + return 0 + } + } + + var ts *timestamp.Timestamp + t := l.Get(3) + if t != lua.LNil { + if t.Type() != lua.LTNumber { + l.ArgError(3, "timestamp must be numeric UTC seconds when provided") + return 0 + } + ts = ×tamp.Timestamp{Seconds: int64(t.(lua.LNumber))} + } + + external := l.OptBool(4, false) + + if n.eventFn != nil { + n.eventFn(l.Context(), &api.Event{ + Name: name, + Properties: properties, + Timestamp: ts, + External: external, + }) + } + return 0 +} + func (n *RuntimeLuaNakamaModule) localcacheGet(l *lua.LState) int { key := l.CheckString(1) if key == "" { diff --git a/server/session_registry.go b/server/session_registry.go index e19b0f317..8c26b7070 100644 --- a/server/session_registry.go +++ b/server/session_registry.go @@ -65,12 +65,16 @@ type SessionRegistry interface { } type LocalSessionRegistry struct { + metrics *Metrics + sessions *sync.Map sessionCount *atomic.Int32 } -func NewLocalSessionRegistry() SessionRegistry { +func NewLocalSessionRegistry(metrics *Metrics) SessionRegistry { return &LocalSessionRegistry{ + metrics: metrics, + sessions: &sync.Map{}, sessionCount: atomic.NewInt32(0), } @@ -92,12 +96,14 @@ func (r *LocalSessionRegistry) Get(sessionID uuid.UUID) Session { func (r *LocalSessionRegistry) Add(session Session) { r.sessions.Store(session.ID(), session) - r.sessionCount.Inc() + count := r.sessionCount.Inc() + r.metrics.GaugeSessions(float64(count)) } func (r *LocalSessionRegistry) Remove(sessionID uuid.UUID) { r.sessions.Delete(sessionID) - r.sessionCount.Dec() + count := r.sessionCount.Dec() + r.metrics.GaugeSessions(float64(count)) } func (r *LocalSessionRegistry) Disconnect(ctx context.Context, sessionID uuid.UUID, node string) error { diff --git a/server/socket_ws.go b/server/socket_ws.go index e97391f8d..ee6ca9835 100644 --- a/server/socket_ws.go +++ b/server/socket_ws.go @@ -16,19 +16,15 @@ package server import ( "context" - "net/http" - "time" - "github.com/golang/protobuf/jsonpb" "github.com/gorilla/websocket" - "go.opencensus.io/stats" - "go.opencensus.io/trace" "go.uber.org/zap" + "net/http" ) var SocketWsStatsCtx = context.Background() -func NewSocketWsAcceptor(logger *zap.Logger, config Config, sessionRegistry SessionRegistry, matchmaker Matchmaker, tracker Tracker, runtime *Runtime, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, pipeline *Pipeline) func(http.ResponseWriter, *http.Request) { +func NewSocketWsAcceptor(logger *zap.Logger, config Config, sessionRegistry SessionRegistry, matchmaker Matchmaker, tracker Tracker, metrics *Metrics, runtime *Runtime, jsonpbMarshaler *jsonpb.Marshaler, jsonpbUnmarshaler *jsonpb.Unmarshaler, pipeline *Pipeline) func(http.ResponseWriter, *http.Request) { upgrader := &websocket.Upgrader{ ReadBufferSize: config.GetSocket().ReadBufferSizeBytes, WriteBufferSize: config.GetSocket().WriteBufferSizeBytes, @@ -80,9 +76,7 @@ func NewSocketWsAcceptor(logger *zap.Logger, config Config, sessionRegistry Sess } // Mark the start of the session. - startNanos := time.Now().UTC().UnixNano() - stats.Record(SocketWsStatsCtx, MetricsSocketWsOpenCount.M(1)) - _, span := trace.StartSpan(SocketWsStatsCtx, "nakama.session.ws") + metrics.CountWebsocketOpened(1) // Wrap the connection for application handling. session := NewSessionWS(logger, config, format, userID, username, vars, expiry, clientIP, clientPort, jsonpbMarshaler, jsonpbUnmarshaler, conn, sessionRegistry, matchmaker, tracker, pipeline, runtime) @@ -100,7 +94,6 @@ func NewSocketWsAcceptor(logger *zap.Logger, config Config, sessionRegistry Sess session.Consume() // Mark the end of the session. - span.End() - stats.Record(SocketWsStatsCtx, MetricsSocketWsTimeSpentMsec.M(float64(time.Now().UTC().UnixNano()-startNanos)/1e6), MetricsSocketWsCloseCount.M(1)) + metrics.CountWebsocketClosed(1) } } diff --git a/server/status_handler.go b/server/status_handler.go index 94d56349a..87856e97b 100644 --- a/server/status_handler.go +++ b/server/status_handler.go @@ -30,17 +30,17 @@ type LocalStatusHandler struct { sessionRegistry SessionRegistry matchRegistry MatchRegistry tracker Tracker - metricsExporter *MetricsExporter + metrics *Metrics node string } -func NewLocalStatusHandler(logger *zap.Logger, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, metricsExporter *MetricsExporter, node string) StatusHandler { +func NewLocalStatusHandler(logger *zap.Logger, sessionRegistry SessionRegistry, matchRegistry MatchRegistry, tracker Tracker, metrics *Metrics, node string) StatusHandler { return &LocalStatusHandler{ logger: logger, sessionRegistry: sessionRegistry, matchRegistry: matchRegistry, tracker: tracker, - metricsExporter: metricsExporter, + metrics: metrics, node: node, } } @@ -54,10 +54,10 @@ func (s *LocalStatusHandler) GetStatus(ctx context.Context) ([]*console.StatusLi PresenceCount: int32(s.tracker.Count()), MatchCount: int32(s.matchRegistry.Count()), GoroutineCount: int32(runtime.NumGoroutine()), - AvgLatencyMs: s.metricsExporter.Latency.Load(), - AvgRateSec: s.metricsExporter.Rate.Load(), - AvgInputKbs: s.metricsExporter.Input.Load(), - AvgOutputKbs: s.metricsExporter.Output.Load(), + AvgLatencyMs: s.metrics.snapshotLatencyMs.Load(), + AvgRateSec: s.metrics.snapshotRateSec.Load(), + AvgInputKbs: s.metrics.snapshotRecvKbSec.Load(), + AvgOutputKbs: s.metrics.snapshotSentKbSec.Load(), }, }, nil } diff --git a/vendor/cloud.google.com/go/LICENSE b/vendor/cloud.google.com/go/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/vendor/cloud.google.com/go/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/cloud.google.com/go/compute/metadata/metadata.go b/vendor/cloud.google.com/go/compute/metadata/metadata.go deleted file mode 100644 index 4ff4e2f1c..000000000 --- a/vendor/cloud.google.com/go/compute/metadata/metadata.go +++ /dev/null @@ -1,526 +0,0 @@ -// Copyright 2014 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package metadata provides access to Google Compute Engine (GCE) -// metadata and API service accounts. -// -// This package is a wrapper around the GCE metadata service, -// as documented at https://developers.google.com/compute/docs/metadata. -package metadata // import "cloud.google.com/go/compute/metadata" - -import ( - "context" - "encoding/json" - "fmt" - "io/ioutil" - "net" - "net/http" - "net/url" - "os" - "runtime" - "strings" - "sync" - "time" -) - -const ( - // metadataIP is the documented metadata server IP address. - metadataIP = "169.254.169.254" - - // metadataHostEnv is the environment variable specifying the - // GCE metadata hostname. If empty, the default value of - // metadataIP ("169.254.169.254") is used instead. - // This is variable name is not defined by any spec, as far as - // I know; it was made up for the Go package. - metadataHostEnv = "GCE_METADATA_HOST" - - userAgent = "gcloud-golang/0.1" -) - -type cachedValue struct { - k string - trim bool - mu sync.Mutex - v string -} - -var ( - projID = &cachedValue{k: "project/project-id", trim: true} - projNum = &cachedValue{k: "project/numeric-project-id", trim: true} - instID = &cachedValue{k: "instance/id", trim: true} -) - -var ( - defaultClient = &Client{hc: &http.Client{ - Transport: &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 2 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - ResponseHeaderTimeout: 2 * time.Second, - }, - }} - subscribeClient = &Client{hc: &http.Client{ - Transport: &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 2 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - }, - }} -) - -// NotDefinedError is returned when requested metadata is not defined. -// -// The underlying string is the suffix after "/computeMetadata/v1/". -// -// This error is not returned if the value is defined to be the empty -// string. -type NotDefinedError string - -func (suffix NotDefinedError) Error() string { - return fmt.Sprintf("metadata: GCE metadata %q not defined", string(suffix)) -} - -func (c *cachedValue) get(cl *Client) (v string, err error) { - defer c.mu.Unlock() - c.mu.Lock() - if c.v != "" { - return c.v, nil - } - if c.trim { - v, err = cl.getTrimmed(c.k) - } else { - v, err = cl.Get(c.k) - } - if err == nil { - c.v = v - } - return -} - -var ( - onGCEOnce sync.Once - onGCE bool -) - -// OnGCE reports whether this process is running on Google Compute Engine. -func OnGCE() bool { - onGCEOnce.Do(initOnGCE) - return onGCE -} - -func initOnGCE() { - onGCE = testOnGCE() -} - -func testOnGCE() bool { - // The user explicitly said they're on GCE, so trust them. - if os.Getenv(metadataHostEnv) != "" { - return true - } - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - resc := make(chan bool, 2) - - // Try two strategies in parallel. - // See https://github.com/googleapis/google-cloud-go/issues/194 - go func() { - req, _ := http.NewRequest("GET", "http://"+metadataIP, nil) - req.Header.Set("User-Agent", userAgent) - res, err := defaultClient.hc.Do(req.WithContext(ctx)) - if err != nil { - resc <- false - return - } - defer res.Body.Close() - resc <- res.Header.Get("Metadata-Flavor") == "Google" - }() - - go func() { - addrs, err := net.LookupHost("metadata.google.internal") - if err != nil || len(addrs) == 0 { - resc <- false - return - } - resc <- strsContains(addrs, metadataIP) - }() - - tryHarder := systemInfoSuggestsGCE() - if tryHarder { - res := <-resc - if res { - // The first strategy succeeded, so let's use it. - return true - } - // Wait for either the DNS or metadata server probe to - // contradict the other one and say we are running on - // GCE. Give it a lot of time to do so, since the system - // info already suggests we're running on a GCE BIOS. - timer := time.NewTimer(5 * time.Second) - defer timer.Stop() - select { - case res = <-resc: - return res - case <-timer.C: - // Too slow. Who knows what this system is. - return false - } - } - - // There's no hint from the system info that we're running on - // GCE, so use the first probe's result as truth, whether it's - // true or false. The goal here is to optimize for speed for - // users who are NOT running on GCE. We can't assume that - // either a DNS lookup or an HTTP request to a blackholed IP - // address is fast. Worst case this should return when the - // metaClient's Transport.ResponseHeaderTimeout or - // Transport.Dial.Timeout fires (in two seconds). - return <-resc -} - -// systemInfoSuggestsGCE reports whether the local system (without -// doing network requests) suggests that we're running on GCE. If this -// returns true, testOnGCE tries a bit harder to reach its metadata -// server. -func systemInfoSuggestsGCE() bool { - if runtime.GOOS != "linux" { - // We don't have any non-Linux clues available, at least yet. - return false - } - slurp, _ := ioutil.ReadFile("/sys/class/dmi/id/product_name") - name := strings.TrimSpace(string(slurp)) - return name == "Google" || name == "Google Compute Engine" -} - -// Subscribe calls Client.Subscribe on a client designed for subscribing (one with no -// ResponseHeaderTimeout). -func Subscribe(suffix string, fn func(v string, ok bool) error) error { - return subscribeClient.Subscribe(suffix, fn) -} - -// Get calls Client.Get on the default client. -func Get(suffix string) (string, error) { return defaultClient.Get(suffix) } - -// ProjectID returns the current instance's project ID string. -func ProjectID() (string, error) { return defaultClient.ProjectID() } - -// NumericProjectID returns the current instance's numeric project ID. -func NumericProjectID() (string, error) { return defaultClient.NumericProjectID() } - -// InternalIP returns the instance's primary internal IP address. -func InternalIP() (string, error) { return defaultClient.InternalIP() } - -// ExternalIP returns the instance's primary external (public) IP address. -func ExternalIP() (string, error) { return defaultClient.ExternalIP() } - -// Email calls Client.Email on the default client. -func Email(serviceAccount string) (string, error) { return defaultClient.Email(serviceAccount) } - -// Hostname returns the instance's hostname. This will be of the form -// ".c..internal". -func Hostname() (string, error) { return defaultClient.Hostname() } - -// InstanceTags returns the list of user-defined instance tags, -// assigned when initially creating a GCE instance. -func InstanceTags() ([]string, error) { return defaultClient.InstanceTags() } - -// InstanceID returns the current VM's numeric instance ID. -func InstanceID() (string, error) { return defaultClient.InstanceID() } - -// InstanceName returns the current VM's instance ID string. -func InstanceName() (string, error) { return defaultClient.InstanceName() } - -// Zone returns the current VM's zone, such as "us-central1-b". -func Zone() (string, error) { return defaultClient.Zone() } - -// InstanceAttributes calls Client.InstanceAttributes on the default client. -func InstanceAttributes() ([]string, error) { return defaultClient.InstanceAttributes() } - -// ProjectAttributes calls Client.ProjectAttributes on the default client. -func ProjectAttributes() ([]string, error) { return defaultClient.ProjectAttributes() } - -// InstanceAttributeValue calls Client.InstanceAttributeValue on the default client. -func InstanceAttributeValue(attr string) (string, error) { - return defaultClient.InstanceAttributeValue(attr) -} - -// ProjectAttributeValue calls Client.ProjectAttributeValue on the default client. -func ProjectAttributeValue(attr string) (string, error) { - return defaultClient.ProjectAttributeValue(attr) -} - -// Scopes calls Client.Scopes on the default client. -func Scopes(serviceAccount string) ([]string, error) { return defaultClient.Scopes(serviceAccount) } - -func strsContains(ss []string, s string) bool { - for _, v := range ss { - if v == s { - return true - } - } - return false -} - -// A Client provides metadata. -type Client struct { - hc *http.Client -} - -// NewClient returns a Client that can be used to fetch metadata. All HTTP requests -// will use the given http.Client instead of the default client. -func NewClient(c *http.Client) *Client { - return &Client{hc: c} -} - -// getETag returns a value from the metadata service as well as the associated ETag. -// This func is otherwise equivalent to Get. -func (c *Client) getETag(suffix string) (value, etag string, err error) { - // Using a fixed IP makes it very difficult to spoof the metadata service in - // a container, which is an important use-case for local testing of cloud - // deployments. To enable spoofing of the metadata service, the environment - // variable GCE_METADATA_HOST is first inspected to decide where metadata - // requests shall go. - host := os.Getenv(metadataHostEnv) - if host == "" { - // Using 169.254.169.254 instead of "metadata" here because Go - // binaries built with the "netgo" tag and without cgo won't - // know the search suffix for "metadata" is - // ".google.internal", and this IP address is documented as - // being stable anyway. - host = metadataIP - } - u := "http://" + host + "/computeMetadata/v1/" + suffix - req, _ := http.NewRequest("GET", u, nil) - req.Header.Set("Metadata-Flavor", "Google") - req.Header.Set("User-Agent", userAgent) - res, err := c.hc.Do(req) - if err != nil { - return "", "", err - } - defer res.Body.Close() - if res.StatusCode == http.StatusNotFound { - return "", "", NotDefinedError(suffix) - } - all, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", "", err - } - if res.StatusCode != 200 { - return "", "", &Error{Code: res.StatusCode, Message: string(all)} - } - return string(all), res.Header.Get("Etag"), nil -} - -// Get returns a value from the metadata service. -// The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/". -// -// If the GCE_METADATA_HOST environment variable is not defined, a default of -// 169.254.169.254 will be used instead. -// -// If the requested metadata is not defined, the returned error will -// be of type NotDefinedError. -func (c *Client) Get(suffix string) (string, error) { - val, _, err := c.getETag(suffix) - return val, err -} - -func (c *Client) getTrimmed(suffix string) (s string, err error) { - s, err = c.Get(suffix) - s = strings.TrimSpace(s) - return -} - -func (c *Client) lines(suffix string) ([]string, error) { - j, err := c.Get(suffix) - if err != nil { - return nil, err - } - s := strings.Split(strings.TrimSpace(j), "\n") - for i := range s { - s[i] = strings.TrimSpace(s[i]) - } - return s, nil -} - -// ProjectID returns the current instance's project ID string. -func (c *Client) ProjectID() (string, error) { return projID.get(c) } - -// NumericProjectID returns the current instance's numeric project ID. -func (c *Client) NumericProjectID() (string, error) { return projNum.get(c) } - -// InstanceID returns the current VM's numeric instance ID. -func (c *Client) InstanceID() (string, error) { return instID.get(c) } - -// InternalIP returns the instance's primary internal IP address. -func (c *Client) InternalIP() (string, error) { - return c.getTrimmed("instance/network-interfaces/0/ip") -} - -// Email returns the email address associated with the service account. -// The account may be empty or the string "default" to use the instance's -// main account. -func (c *Client) Email(serviceAccount string) (string, error) { - if serviceAccount == "" { - serviceAccount = "default" - } - return c.getTrimmed("instance/service-accounts/" + serviceAccount + "/email") -} - -// ExternalIP returns the instance's primary external (public) IP address. -func (c *Client) ExternalIP() (string, error) { - return c.getTrimmed("instance/network-interfaces/0/access-configs/0/external-ip") -} - -// Hostname returns the instance's hostname. This will be of the form -// ".c..internal". -func (c *Client) Hostname() (string, error) { - return c.getTrimmed("instance/hostname") -} - -// InstanceTags returns the list of user-defined instance tags, -// assigned when initially creating a GCE instance. -func (c *Client) InstanceTags() ([]string, error) { - var s []string - j, err := c.Get("instance/tags") - if err != nil { - return nil, err - } - if err := json.NewDecoder(strings.NewReader(j)).Decode(&s); err != nil { - return nil, err - } - return s, nil -} - -// InstanceName returns the current VM's instance ID string. -func (c *Client) InstanceName() (string, error) { - host, err := c.Hostname() - if err != nil { - return "", err - } - return strings.Split(host, ".")[0], nil -} - -// Zone returns the current VM's zone, such as "us-central1-b". -func (c *Client) Zone() (string, error) { - zone, err := c.getTrimmed("instance/zone") - // zone is of the form "projects//zones/". - if err != nil { - return "", err - } - return zone[strings.LastIndex(zone, "/")+1:], nil -} - -// InstanceAttributes returns the list of user-defined attributes, -// assigned when initially creating a GCE VM instance. The value of an -// attribute can be obtained with InstanceAttributeValue. -func (c *Client) InstanceAttributes() ([]string, error) { return c.lines("instance/attributes/") } - -// ProjectAttributes returns the list of user-defined attributes -// applying to the project as a whole, not just this VM. The value of -// an attribute can be obtained with ProjectAttributeValue. -func (c *Client) ProjectAttributes() ([]string, error) { return c.lines("project/attributes/") } - -// InstanceAttributeValue returns the value of the provided VM -// instance attribute. -// -// If the requested attribute is not defined, the returned error will -// be of type NotDefinedError. -// -// InstanceAttributeValue may return ("", nil) if the attribute was -// defined to be the empty string. -func (c *Client) InstanceAttributeValue(attr string) (string, error) { - return c.Get("instance/attributes/" + attr) -} - -// ProjectAttributeValue returns the value of the provided -// project attribute. -// -// If the requested attribute is not defined, the returned error will -// be of type NotDefinedError. -// -// ProjectAttributeValue may return ("", nil) if the attribute was -// defined to be the empty string. -func (c *Client) ProjectAttributeValue(attr string) (string, error) { - return c.Get("project/attributes/" + attr) -} - -// Scopes returns the service account scopes for the given account. -// The account may be empty or the string "default" to use the instance's -// main account. -func (c *Client) Scopes(serviceAccount string) ([]string, error) { - if serviceAccount == "" { - serviceAccount = "default" - } - return c.lines("instance/service-accounts/" + serviceAccount + "/scopes") -} - -// Subscribe subscribes to a value from the metadata service. -// The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/". -// The suffix may contain query parameters. -// -// Subscribe calls fn with the latest metadata value indicated by the provided -// suffix. If the metadata value is deleted, fn is called with the empty string -// and ok false. Subscribe blocks until fn returns a non-nil error or the value -// is deleted. Subscribe returns the error value returned from the last call to -// fn, which may be nil when ok == false. -func (c *Client) Subscribe(suffix string, fn func(v string, ok bool) error) error { - const failedSubscribeSleep = time.Second * 5 - - // First check to see if the metadata value exists at all. - val, lastETag, err := c.getETag(suffix) - if err != nil { - return err - } - - if err := fn(val, true); err != nil { - return err - } - - ok := true - if strings.ContainsRune(suffix, '?') { - suffix += "&wait_for_change=true&last_etag=" - } else { - suffix += "?wait_for_change=true&last_etag=" - } - for { - val, etag, err := c.getETag(suffix + url.QueryEscape(lastETag)) - if err != nil { - if _, deleted := err.(NotDefinedError); !deleted { - time.Sleep(failedSubscribeSleep) - continue // Retry on other errors. - } - ok = false - } - lastETag = etag - - if err := fn(val, ok); err != nil || !ok { - return err - } - } -} - -// Error contains an error response from the server. -type Error struct { - // Code is the HTTP response status code. - Code int - // Message is the server response message. - Message string -} - -func (e *Error) Error() string { - return fmt.Sprintf("compute: Received %d `%s`", e.Code, e.Message) -} diff --git a/vendor/cloud.google.com/go/container/apiv1/cluster_manager_client.go b/vendor/cloud.google.com/go/container/apiv1/cluster_manager_client.go deleted file mode 100644 index 22978d377..000000000 --- a/vendor/cloud.google.com/go/container/apiv1/cluster_manager_client.go +++ /dev/null @@ -1,676 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// AUTO-GENERATED CODE. DO NOT EDIT. - -package container - -import ( - "context" - "time" - - "cloud.google.com/go/internal/version" - gax "github.com/googleapis/gax-go/v2" - "google.golang.org/api/option" - "google.golang.org/api/transport" - containerpb "google.golang.org/genproto/googleapis/container/v1" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" -) - -// ClusterManagerCallOptions contains the retry settings for each method of ClusterManagerClient. -type ClusterManagerCallOptions struct { - ListClusters []gax.CallOption - GetCluster []gax.CallOption - CreateCluster []gax.CallOption - UpdateCluster []gax.CallOption - UpdateNodePool []gax.CallOption - SetNodePoolAutoscaling []gax.CallOption - SetLoggingService []gax.CallOption - SetMonitoringService []gax.CallOption - SetAddonsConfig []gax.CallOption - SetLocations []gax.CallOption - UpdateMaster []gax.CallOption - SetMasterAuth []gax.CallOption - DeleteCluster []gax.CallOption - ListOperations []gax.CallOption - GetOperation []gax.CallOption - CancelOperation []gax.CallOption - GetServerConfig []gax.CallOption - ListNodePools []gax.CallOption - GetNodePool []gax.CallOption - CreateNodePool []gax.CallOption - DeleteNodePool []gax.CallOption - RollbackNodePoolUpgrade []gax.CallOption - SetNodePoolManagement []gax.CallOption - SetLabels []gax.CallOption - SetLegacyAbac []gax.CallOption - StartIPRotation []gax.CallOption - CompleteIPRotation []gax.CallOption - SetNodePoolSize []gax.CallOption - SetNetworkPolicy []gax.CallOption - SetMaintenancePolicy []gax.CallOption -} - -func defaultClusterManagerClientOptions() []option.ClientOption { - return []option.ClientOption{ - option.WithEndpoint("container.googleapis.com:443"), - option.WithScopes(DefaultAuthScopes()...), - } -} - -func defaultClusterManagerCallOptions() *ClusterManagerCallOptions { - retry := map[[2]string][]gax.CallOption{ - {"default", "idempotent"}: { - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.DeadlineExceeded, - codes.Unavailable, - }, gax.Backoff{ - Initial: 100 * time.Millisecond, - Max: 60000 * time.Millisecond, - Multiplier: 1.3, - }) - }), - }, - } - return &ClusterManagerCallOptions{ - ListClusters: retry[[2]string{"default", "idempotent"}], - GetCluster: retry[[2]string{"default", "idempotent"}], - CreateCluster: retry[[2]string{"default", "non_idempotent"}], - UpdateCluster: retry[[2]string{"default", "non_idempotent"}], - UpdateNodePool: retry[[2]string{"default", "non_idempotent"}], - SetNodePoolAutoscaling: retry[[2]string{"default", "non_idempotent"}], - SetLoggingService: retry[[2]string{"default", "non_idempotent"}], - SetMonitoringService: retry[[2]string{"default", "non_idempotent"}], - SetAddonsConfig: retry[[2]string{"default", "non_idempotent"}], - SetLocations: retry[[2]string{"default", "non_idempotent"}], - UpdateMaster: retry[[2]string{"default", "non_idempotent"}], - SetMasterAuth: retry[[2]string{"default", "non_idempotent"}], - DeleteCluster: retry[[2]string{"default", "idempotent"}], - ListOperations: retry[[2]string{"default", "idempotent"}], - GetOperation: retry[[2]string{"default", "idempotent"}], - CancelOperation: retry[[2]string{"default", "non_idempotent"}], - GetServerConfig: retry[[2]string{"default", "idempotent"}], - ListNodePools: retry[[2]string{"default", "idempotent"}], - GetNodePool: retry[[2]string{"default", "idempotent"}], - CreateNodePool: retry[[2]string{"default", "non_idempotent"}], - DeleteNodePool: retry[[2]string{"default", "idempotent"}], - RollbackNodePoolUpgrade: retry[[2]string{"default", "non_idempotent"}], - SetNodePoolManagement: retry[[2]string{"default", "non_idempotent"}], - SetLabels: retry[[2]string{"default", "non_idempotent"}], - SetLegacyAbac: retry[[2]string{"default", "non_idempotent"}], - StartIPRotation: retry[[2]string{"default", "non_idempotent"}], - CompleteIPRotation: retry[[2]string{"default", "non_idempotent"}], - SetNodePoolSize: retry[[2]string{"default", "non_idempotent"}], - SetNetworkPolicy: retry[[2]string{"default", "non_idempotent"}], - SetMaintenancePolicy: retry[[2]string{"default", "non_idempotent"}], - } -} - -// ClusterManagerClient is a client for interacting with Google Container Engine API. -// -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -type ClusterManagerClient struct { - // The connection to the service. - conn *grpc.ClientConn - - // The gRPC API client. - clusterManagerClient containerpb.ClusterManagerClient - - // The call options for this service. - CallOptions *ClusterManagerCallOptions - - // The x-goog-* metadata to be sent with each request. - xGoogMetadata metadata.MD -} - -// NewClusterManagerClient creates a new cluster manager client. -// -// Google Container Engine Cluster Manager v1 -func NewClusterManagerClient(ctx context.Context, opts ...option.ClientOption) (*ClusterManagerClient, error) { - conn, err := transport.DialGRPC(ctx, append(defaultClusterManagerClientOptions(), opts...)...) - if err != nil { - return nil, err - } - c := &ClusterManagerClient{ - conn: conn, - CallOptions: defaultClusterManagerCallOptions(), - - clusterManagerClient: containerpb.NewClusterManagerClient(conn), - } - c.setGoogleClientInfo() - return c, nil -} - -// Connection returns the client's connection to the API service. -func (c *ClusterManagerClient) Connection() *grpc.ClientConn { - return c.conn -} - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *ClusterManagerClient) Close() error { - return c.conn.Close() -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *ClusterManagerClient) setGoogleClientInfo(keyval ...string) { - kv := append([]string{"gl-go", version.Go()}, keyval...) - kv = append(kv, "gapic", version.Repo, "gax", gax.Version, "grpc", grpc.Version) - c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) -} - -// ListClusters lists all clusters owned by a project in either the specified zone or all -// zones. -func (c *ClusterManagerClient) ListClusters(ctx context.Context, req *containerpb.ListClustersRequest, opts ...gax.CallOption) (*containerpb.ListClustersResponse, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.ListClusters[0:len(c.CallOptions.ListClusters):len(c.CallOptions.ListClusters)], opts...) - var resp *containerpb.ListClustersResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.ListClusters(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// GetCluster gets the details of a specific cluster. -func (c *ClusterManagerClient) GetCluster(ctx context.Context, req *containerpb.GetClusterRequest, opts ...gax.CallOption) (*containerpb.Cluster, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.GetCluster[0:len(c.CallOptions.GetCluster):len(c.CallOptions.GetCluster)], opts...) - var resp *containerpb.Cluster - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.GetCluster(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// CreateCluster creates a cluster, consisting of the specified number and type of Google -// Compute Engine instances. -// -// By default, the cluster is created in the project's -// default network (at /compute/docs/networks-and-firewalls#networks). -// -// One firewall is added for the cluster. After cluster creation, -// the cluster creates routes for each node to allow the containers -// on that node to communicate with all other instances in the -// cluster. -// -// Finally, an entry is added to the project's global metadata indicating -// which CIDR range is being used by the cluster. -func (c *ClusterManagerClient) CreateCluster(ctx context.Context, req *containerpb.CreateClusterRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.CreateCluster[0:len(c.CallOptions.CreateCluster):len(c.CallOptions.CreateCluster)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.CreateCluster(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// UpdateCluster updates the settings of a specific cluster. -func (c *ClusterManagerClient) UpdateCluster(ctx context.Context, req *containerpb.UpdateClusterRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.UpdateCluster[0:len(c.CallOptions.UpdateCluster):len(c.CallOptions.UpdateCluster)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.UpdateCluster(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// UpdateNodePool updates the version and/or image type of a specific node pool. -func (c *ClusterManagerClient) UpdateNodePool(ctx context.Context, req *containerpb.UpdateNodePoolRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.UpdateNodePool[0:len(c.CallOptions.UpdateNodePool):len(c.CallOptions.UpdateNodePool)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.UpdateNodePool(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetNodePoolAutoscaling sets the autoscaling settings of a specific node pool. -func (c *ClusterManagerClient) SetNodePoolAutoscaling(ctx context.Context, req *containerpb.SetNodePoolAutoscalingRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetNodePoolAutoscaling[0:len(c.CallOptions.SetNodePoolAutoscaling):len(c.CallOptions.SetNodePoolAutoscaling)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetNodePoolAutoscaling(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetLoggingService sets the logging service of a specific cluster. -func (c *ClusterManagerClient) SetLoggingService(ctx context.Context, req *containerpb.SetLoggingServiceRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetLoggingService[0:len(c.CallOptions.SetLoggingService):len(c.CallOptions.SetLoggingService)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetLoggingService(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetMonitoringService sets the monitoring service of a specific cluster. -func (c *ClusterManagerClient) SetMonitoringService(ctx context.Context, req *containerpb.SetMonitoringServiceRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetMonitoringService[0:len(c.CallOptions.SetMonitoringService):len(c.CallOptions.SetMonitoringService)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetMonitoringService(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetAddonsConfig sets the addons of a specific cluster. -func (c *ClusterManagerClient) SetAddonsConfig(ctx context.Context, req *containerpb.SetAddonsConfigRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetAddonsConfig[0:len(c.CallOptions.SetAddonsConfig):len(c.CallOptions.SetAddonsConfig)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetAddonsConfig(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetLocations sets the locations of a specific cluster. -func (c *ClusterManagerClient) SetLocations(ctx context.Context, req *containerpb.SetLocationsRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetLocations[0:len(c.CallOptions.SetLocations):len(c.CallOptions.SetLocations)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetLocations(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// UpdateMaster updates the master of a specific cluster. -func (c *ClusterManagerClient) UpdateMaster(ctx context.Context, req *containerpb.UpdateMasterRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.UpdateMaster[0:len(c.CallOptions.UpdateMaster):len(c.CallOptions.UpdateMaster)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.UpdateMaster(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetMasterAuth used to set master auth materials. Currently supports :- -// Changing the admin password of a specific cluster. -// This can be either via password generation or explicitly set the password. -func (c *ClusterManagerClient) SetMasterAuth(ctx context.Context, req *containerpb.SetMasterAuthRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetMasterAuth[0:len(c.CallOptions.SetMasterAuth):len(c.CallOptions.SetMasterAuth)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetMasterAuth(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// DeleteCluster deletes the cluster, including the Kubernetes endpoint and all worker -// nodes. -// -// Firewalls and routes that were configured during cluster creation -// are also deleted. -// -// Other Google Compute Engine resources that might be in use by the cluster -// (e.g. load balancer resources) will not be deleted if they weren't present -// at the initial create time. -func (c *ClusterManagerClient) DeleteCluster(ctx context.Context, req *containerpb.DeleteClusterRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.DeleteCluster[0:len(c.CallOptions.DeleteCluster):len(c.CallOptions.DeleteCluster)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.DeleteCluster(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// ListOperations lists all operations in a project in a specific zone or all zones. -func (c *ClusterManagerClient) ListOperations(ctx context.Context, req *containerpb.ListOperationsRequest, opts ...gax.CallOption) (*containerpb.ListOperationsResponse, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.ListOperations[0:len(c.CallOptions.ListOperations):len(c.CallOptions.ListOperations)], opts...) - var resp *containerpb.ListOperationsResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.ListOperations(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// GetOperation gets the specified operation. -func (c *ClusterManagerClient) GetOperation(ctx context.Context, req *containerpb.GetOperationRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.GetOperation[0:len(c.CallOptions.GetOperation):len(c.CallOptions.GetOperation)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.GetOperation(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// CancelOperation cancels the specified operation. -func (c *ClusterManagerClient) CancelOperation(ctx context.Context, req *containerpb.CancelOperationRequest, opts ...gax.CallOption) error { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.CancelOperation[0:len(c.CallOptions.CancelOperation):len(c.CallOptions.CancelOperation)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = c.clusterManagerClient.CancelOperation(ctx, req, settings.GRPC...) - return err - }, opts...) - return err -} - -// GetServerConfig returns configuration info about the Container Engine service. -func (c *ClusterManagerClient) GetServerConfig(ctx context.Context, req *containerpb.GetServerConfigRequest, opts ...gax.CallOption) (*containerpb.ServerConfig, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.GetServerConfig[0:len(c.CallOptions.GetServerConfig):len(c.CallOptions.GetServerConfig)], opts...) - var resp *containerpb.ServerConfig - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.GetServerConfig(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// ListNodePools lists the node pools for a cluster. -func (c *ClusterManagerClient) ListNodePools(ctx context.Context, req *containerpb.ListNodePoolsRequest, opts ...gax.CallOption) (*containerpb.ListNodePoolsResponse, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.ListNodePools[0:len(c.CallOptions.ListNodePools):len(c.CallOptions.ListNodePools)], opts...) - var resp *containerpb.ListNodePoolsResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.ListNodePools(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// GetNodePool retrieves the node pool requested. -func (c *ClusterManagerClient) GetNodePool(ctx context.Context, req *containerpb.GetNodePoolRequest, opts ...gax.CallOption) (*containerpb.NodePool, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.GetNodePool[0:len(c.CallOptions.GetNodePool):len(c.CallOptions.GetNodePool)], opts...) - var resp *containerpb.NodePool - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.GetNodePool(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// CreateNodePool creates a node pool for a cluster. -func (c *ClusterManagerClient) CreateNodePool(ctx context.Context, req *containerpb.CreateNodePoolRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.CreateNodePool[0:len(c.CallOptions.CreateNodePool):len(c.CallOptions.CreateNodePool)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.CreateNodePool(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// DeleteNodePool deletes a node pool from a cluster. -func (c *ClusterManagerClient) DeleteNodePool(ctx context.Context, req *containerpb.DeleteNodePoolRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.DeleteNodePool[0:len(c.CallOptions.DeleteNodePool):len(c.CallOptions.DeleteNodePool)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.DeleteNodePool(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// RollbackNodePoolUpgrade roll back the previously Aborted or Failed NodePool upgrade. -// This will be an no-op if the last upgrade successfully completed. -func (c *ClusterManagerClient) RollbackNodePoolUpgrade(ctx context.Context, req *containerpb.RollbackNodePoolUpgradeRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.RollbackNodePoolUpgrade[0:len(c.CallOptions.RollbackNodePoolUpgrade):len(c.CallOptions.RollbackNodePoolUpgrade)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.RollbackNodePoolUpgrade(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetNodePoolManagement sets the NodeManagement options for a node pool. -func (c *ClusterManagerClient) SetNodePoolManagement(ctx context.Context, req *containerpb.SetNodePoolManagementRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetNodePoolManagement[0:len(c.CallOptions.SetNodePoolManagement):len(c.CallOptions.SetNodePoolManagement)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetNodePoolManagement(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetLabels sets labels on a cluster. -func (c *ClusterManagerClient) SetLabels(ctx context.Context, req *containerpb.SetLabelsRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetLabels[0:len(c.CallOptions.SetLabels):len(c.CallOptions.SetLabels)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetLabels(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetLegacyAbac enables or disables the ABAC authorization mechanism on a cluster. -func (c *ClusterManagerClient) SetLegacyAbac(ctx context.Context, req *containerpb.SetLegacyAbacRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetLegacyAbac[0:len(c.CallOptions.SetLegacyAbac):len(c.CallOptions.SetLegacyAbac)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetLegacyAbac(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// StartIPRotation start master IP rotation. -func (c *ClusterManagerClient) StartIPRotation(ctx context.Context, req *containerpb.StartIPRotationRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.StartIPRotation[0:len(c.CallOptions.StartIPRotation):len(c.CallOptions.StartIPRotation)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.StartIPRotation(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// CompleteIPRotation completes master IP rotation. -func (c *ClusterManagerClient) CompleteIPRotation(ctx context.Context, req *containerpb.CompleteIPRotationRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.CompleteIPRotation[0:len(c.CallOptions.CompleteIPRotation):len(c.CallOptions.CompleteIPRotation)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.CompleteIPRotation(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetNodePoolSize sets the size of a specific node pool. -func (c *ClusterManagerClient) SetNodePoolSize(ctx context.Context, req *containerpb.SetNodePoolSizeRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetNodePoolSize[0:len(c.CallOptions.SetNodePoolSize):len(c.CallOptions.SetNodePoolSize)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetNodePoolSize(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetNetworkPolicy enables/Disables Network Policy for a cluster. -func (c *ClusterManagerClient) SetNetworkPolicy(ctx context.Context, req *containerpb.SetNetworkPolicyRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetNetworkPolicy[0:len(c.CallOptions.SetNetworkPolicy):len(c.CallOptions.SetNetworkPolicy)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetNetworkPolicy(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// SetMaintenancePolicy sets the maintenance policy for a cluster. -func (c *ClusterManagerClient) SetMaintenancePolicy(ctx context.Context, req *containerpb.SetMaintenancePolicyRequest, opts ...gax.CallOption) (*containerpb.Operation, error) { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.SetMaintenancePolicy[0:len(c.CallOptions.SetMaintenancePolicy):len(c.CallOptions.SetMaintenancePolicy)], opts...) - var resp *containerpb.Operation - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.clusterManagerClient.SetMaintenancePolicy(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} diff --git a/vendor/cloud.google.com/go/container/apiv1/doc.go b/vendor/cloud.google.com/go/container/apiv1/doc.go deleted file mode 100644 index 0f995054c..000000000 --- a/vendor/cloud.google.com/go/container/apiv1/doc.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// AUTO-GENERATED CODE. DO NOT EDIT. - -// Package container is an auto-generated package for the -// Google Container Engine API. -// -// NOTE: This package is in alpha. It is not stable, and is likely to change. -// -// The Google Kubernetes Engine API is used for building and managing -// container -// based applications, powered by the open source Kubernetes technology. -package container // import "cloud.google.com/go/container/apiv1" - -import ( - "context" - - "google.golang.org/grpc/metadata" -) - -func insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context { - out, _ := metadata.FromOutgoingContext(ctx) - out = out.Copy() - for _, md := range mds { - for k, v := range md { - out[k] = append(out[k], v...) - } - } - return metadata.NewOutgoingContext(ctx, out) -} - -// DefaultAuthScopes reports the default set of authentication scopes to use with this package. -func DefaultAuthScopes() []string { - return []string{ - "https://www.googleapis.com/auth/cloud-platform", - } -} diff --git a/vendor/cloud.google.com/go/internal/version/update_version.sh b/vendor/cloud.google.com/go/internal/version/update_version.sh deleted file mode 100644 index d7c5a3e21..000000000 --- a/vendor/cloud.google.com/go/internal/version/update_version.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -today=$(date +%Y%m%d) - -sed -i -r -e 's/const Repo = "([0-9]{8})"/const Repo = "'$today'"/' $GOFILE - diff --git a/vendor/cloud.google.com/go/internal/version/version.go b/vendor/cloud.google.com/go/internal/version/version.go deleted file mode 100644 index d291921b1..000000000 --- a/vendor/cloud.google.com/go/internal/version/version.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2016 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//go:generate ./update_version.sh - -// Package version contains version information for Google Cloud Client -// Libraries for Go, as reported in request headers. -package version - -import ( - "runtime" - "strings" - "unicode" -) - -// Repo is the current version of the client libraries in this -// repo. It should be a date in YYYYMMDD format. -const Repo = "20190802" - -// Go returns the Go runtime version. The returned string -// has no whitespace. -func Go() string { - return goVersion -} - -var goVersion = goVer(runtime.Version()) - -const develPrefix = "devel +" - -func goVer(s string) string { - if strings.HasPrefix(s, develPrefix) { - s = s[len(develPrefix):] - if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 { - s = s[:p] - } - return s - } - - if strings.HasPrefix(s, "go1") { - s = s[2:] - var prerelease string - if p := strings.IndexFunc(s, notSemverRune); p >= 0 { - s, prerelease = s[:p], s[p:] - } - if strings.HasSuffix(s, ".") { - s += "0" - } else if strings.Count(s, ".") < 2 { - s += ".0" - } - if prerelease != "" { - s += "-" + prerelease - } - return s - } - return "" -} - -func notSemverRune(r rune) bool { - return !strings.ContainsRune("0123456789.", r) -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/alert_policy_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/alert_policy_client.go deleted file mode 100644 index 836b03332..000000000 --- a/vendor/cloud.google.com/go/monitoring/apiv3/alert_policy_client.go +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by gapic-generator. DO NOT EDIT. - -package monitoring - -import ( - "context" - "fmt" - "math" - "net/url" - "time" - - "github.com/golang/protobuf/proto" - gax "github.com/googleapis/gax-go/v2" - "google.golang.org/api/iterator" - "google.golang.org/api/option" - "google.golang.org/api/transport" - monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" -) - -// AlertPolicyCallOptions contains the retry settings for each method of AlertPolicyClient. -type AlertPolicyCallOptions struct { - ListAlertPolicies []gax.CallOption - GetAlertPolicy []gax.CallOption - CreateAlertPolicy []gax.CallOption - DeleteAlertPolicy []gax.CallOption - UpdateAlertPolicy []gax.CallOption -} - -func defaultAlertPolicyClientOptions() []option.ClientOption { - return []option.ClientOption{ - option.WithEndpoint("monitoring.googleapis.com:443"), - option.WithScopes(DefaultAuthScopes()...), - option.WithGRPCDialOption(grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(math.MaxInt32))), - } -} - -func defaultAlertPolicyCallOptions() *AlertPolicyCallOptions { - retry := map[[2]string][]gax.CallOption{ - {"default", "idempotent"}: { - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.DeadlineExceeded, - codes.Unavailable, - }, gax.Backoff{ - Initial: 100 * time.Millisecond, - Max: 60000 * time.Millisecond, - Multiplier: 1.3, - }) - }), - }, - } - return &AlertPolicyCallOptions{ - ListAlertPolicies: retry[[2]string{"default", "idempotent"}], - GetAlertPolicy: retry[[2]string{"default", "idempotent"}], - CreateAlertPolicy: retry[[2]string{"default", "non_idempotent"}], - DeleteAlertPolicy: retry[[2]string{"default", "idempotent"}], - UpdateAlertPolicy: retry[[2]string{"default", "non_idempotent"}], - } -} - -// AlertPolicyClient is a client for interacting with Stackdriver Monitoring API. -// -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -type AlertPolicyClient struct { - // The connection to the service. - conn *grpc.ClientConn - - // The gRPC API client. - alertPolicyClient monitoringpb.AlertPolicyServiceClient - - // The call options for this service. - CallOptions *AlertPolicyCallOptions - - // The x-goog-* metadata to be sent with each request. - xGoogMetadata metadata.MD -} - -// NewAlertPolicyClient creates a new alert policy service client. -// -// The AlertPolicyService API is used to manage (list, create, delete, -// edit) alert policies in Stackdriver Monitoring. An alerting policy is -// a description of the conditions under which some aspect of your -// system is considered to be "unhealthy" and the ways to notify -// people or services about this state. In addition to using this API, alert -// policies can also be managed through -// Stackdriver Monitoring (at https://cloud.google.com/monitoring/docs/), -// which can be reached by clicking the "Monitoring" tab in -// Cloud Console (at https://console.cloud.google.com/). -func NewAlertPolicyClient(ctx context.Context, opts ...option.ClientOption) (*AlertPolicyClient, error) { - conn, err := transport.DialGRPC(ctx, append(defaultAlertPolicyClientOptions(), opts...)...) - if err != nil { - return nil, err - } - c := &AlertPolicyClient{ - conn: conn, - CallOptions: defaultAlertPolicyCallOptions(), - - alertPolicyClient: monitoringpb.NewAlertPolicyServiceClient(conn), - } - c.setGoogleClientInfo() - return c, nil -} - -// Connection returns the client's connection to the API service. -func (c *AlertPolicyClient) Connection() *grpc.ClientConn { - return c.conn -} - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *AlertPolicyClient) Close() error { - return c.conn.Close() -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *AlertPolicyClient) setGoogleClientInfo(keyval ...string) { - kv := append([]string{"gl-go", versionGo()}, keyval...) - kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) - c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) -} - -// ListAlertPolicies lists the existing alerting policies for the project. -func (c *AlertPolicyClient) ListAlertPolicies(ctx context.Context, req *monitoringpb.ListAlertPoliciesRequest, opts ...gax.CallOption) *AlertPolicyIterator { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.ListAlertPolicies[0:len(c.CallOptions.ListAlertPolicies):len(c.CallOptions.ListAlertPolicies)], opts...) - it := &AlertPolicyIterator{} - req = proto.Clone(req).(*monitoringpb.ListAlertPoliciesRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.AlertPolicy, string, error) { - var resp *monitoringpb.ListAlertPoliciesResponse - req.PageToken = pageToken - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.alertPolicyClient.ListAlertPolicies(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, "", err - } - return resp.AlertPolicies, resp.NextPageToken, nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.PageSize) - it.pageInfo.Token = req.PageToken - return it -} - -// GetAlertPolicy gets a single alerting policy. -func (c *AlertPolicyClient) GetAlertPolicy(ctx context.Context, req *monitoringpb.GetAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.GetAlertPolicy[0:len(c.CallOptions.GetAlertPolicy):len(c.CallOptions.GetAlertPolicy)], opts...) - var resp *monitoringpb.AlertPolicy - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.alertPolicyClient.GetAlertPolicy(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// CreateAlertPolicy creates a new alerting policy. -func (c *AlertPolicyClient) CreateAlertPolicy(ctx context.Context, req *monitoringpb.CreateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.CreateAlertPolicy[0:len(c.CallOptions.CreateAlertPolicy):len(c.CallOptions.CreateAlertPolicy)], opts...) - var resp *monitoringpb.AlertPolicy - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.alertPolicyClient.CreateAlertPolicy(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// DeleteAlertPolicy deletes an alerting policy. -func (c *AlertPolicyClient) DeleteAlertPolicy(ctx context.Context, req *monitoringpb.DeleteAlertPolicyRequest, opts ...gax.CallOption) error { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.DeleteAlertPolicy[0:len(c.CallOptions.DeleteAlertPolicy):len(c.CallOptions.DeleteAlertPolicy)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = c.alertPolicyClient.DeleteAlertPolicy(ctx, req, settings.GRPC...) - return err - }, opts...) - return err -} - -// UpdateAlertPolicy updates an alerting policy. You can either replace the entire policy with -// a new one or replace only certain fields in the current alerting policy by -// specifying the fields to be updated via updateMask. Returns the -// updated alerting policy. -func (c *AlertPolicyClient) UpdateAlertPolicy(ctx context.Context, req *monitoringpb.UpdateAlertPolicyRequest, opts ...gax.CallOption) (*monitoringpb.AlertPolicy, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "alert_policy.name", url.QueryEscape(req.GetAlertPolicy().GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.UpdateAlertPolicy[0:len(c.CallOptions.UpdateAlertPolicy):len(c.CallOptions.UpdateAlertPolicy)], opts...) - var resp *monitoringpb.AlertPolicy - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.alertPolicyClient.UpdateAlertPolicy(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// AlertPolicyIterator manages a stream of *monitoringpb.AlertPolicy. -type AlertPolicyIterator struct { - items []*monitoringpb.AlertPolicy - pageInfo *iterator.PageInfo - nextFunc func() error - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.AlertPolicy, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *AlertPolicyIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *AlertPolicyIterator) Next() (*monitoringpb.AlertPolicy, error) { - var item *monitoringpb.AlertPolicy - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *AlertPolicyIterator) bufLen() int { - return len(it.items) -} - -func (it *AlertPolicyIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/doc.go b/vendor/cloud.google.com/go/monitoring/apiv3/doc.go deleted file mode 100644 index 0c9464d71..000000000 --- a/vendor/cloud.google.com/go/monitoring/apiv3/doc.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by gapic-generator. DO NOT EDIT. - -// Package monitoring is an auto-generated package for the -// Stackdriver Monitoring API. -// -// NOTE: This package is in alpha. It is not stable, and is likely to change. -// -// Manages your Stackdriver Monitoring data and configurations. Most projects -// must be associated with a Stackdriver account, with a few exceptions as -// noted on the individual method pages. -// -// Use of Context -// -// The ctx passed to NewClient is used for authentication requests and -// for creating the underlying connection, but is not used for subsequent calls. -// Individual methods on the client use the ctx given to them. -// -// To close the open connection, use the Close() method. -// -// For information about setting deadlines, reusing contexts, and more -// please visit godoc.org/cloud.google.com/go. -package monitoring // import "cloud.google.com/go/monitoring/apiv3" - -import ( - "context" - "runtime" - "strings" - "unicode" - - "google.golang.org/grpc/metadata" -) - -func insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context { - out, _ := metadata.FromOutgoingContext(ctx) - out = out.Copy() - for _, md := range mds { - for k, v := range md { - out[k] = append(out[k], v...) - } - } - return metadata.NewOutgoingContext(ctx, out) -} - -// DefaultAuthScopes reports the default set of authentication scopes to use with this package. -func DefaultAuthScopes() []string { - return []string{ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/monitoring", - "https://www.googleapis.com/auth/monitoring.read", - "https://www.googleapis.com/auth/monitoring.write", - } -} - -// versionGo returns the Go runtime version. The returned string -// has no whitespace, suitable for reporting in header. -func versionGo() string { - const develPrefix = "devel +" - - s := runtime.Version() - if strings.HasPrefix(s, develPrefix) { - s = s[len(develPrefix):] - if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 { - s = s[:p] - } - return s - } - - notSemverRune := func(r rune) bool { - return strings.IndexRune("0123456789.", r) < 0 - } - - if strings.HasPrefix(s, "go1") { - s = s[2:] - var prerelease string - if p := strings.IndexFunc(s, notSemverRune); p >= 0 { - s, prerelease = s[:p], s[p:] - } - if strings.HasSuffix(s, ".") { - s += "0" - } else if strings.Count(s, ".") < 2 { - s += ".0" - } - if prerelease != "" { - s += "-" + prerelease - } - return s - } - return "UNKNOWN" -} - -const versionClient = "20190819" diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/group_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/group_client.go deleted file mode 100644 index eecb511e6..000000000 --- a/vendor/cloud.google.com/go/monitoring/apiv3/group_client.go +++ /dev/null @@ -1,373 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by gapic-generator. DO NOT EDIT. - -package monitoring - -import ( - "context" - "fmt" - "math" - "net/url" - "time" - - "github.com/golang/protobuf/proto" - gax "github.com/googleapis/gax-go/v2" - "google.golang.org/api/iterator" - "google.golang.org/api/option" - "google.golang.org/api/transport" - monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" - monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" -) - -// GroupCallOptions contains the retry settings for each method of GroupClient. -type GroupCallOptions struct { - ListGroups []gax.CallOption - GetGroup []gax.CallOption - CreateGroup []gax.CallOption - UpdateGroup []gax.CallOption - DeleteGroup []gax.CallOption - ListGroupMembers []gax.CallOption -} - -func defaultGroupClientOptions() []option.ClientOption { - return []option.ClientOption{ - option.WithEndpoint("monitoring.googleapis.com:443"), - option.WithScopes(DefaultAuthScopes()...), - option.WithGRPCDialOption(grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(math.MaxInt32))), - } -} - -func defaultGroupCallOptions() *GroupCallOptions { - retry := map[[2]string][]gax.CallOption{ - {"default", "idempotent"}: { - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.DeadlineExceeded, - codes.Unavailable, - }, gax.Backoff{ - Initial: 100 * time.Millisecond, - Max: 60000 * time.Millisecond, - Multiplier: 1.3, - }) - }), - }, - } - return &GroupCallOptions{ - ListGroups: retry[[2]string{"default", "idempotent"}], - GetGroup: retry[[2]string{"default", "idempotent"}], - CreateGroup: retry[[2]string{"default", "non_idempotent"}], - UpdateGroup: retry[[2]string{"default", "idempotent"}], - DeleteGroup: retry[[2]string{"default", "idempotent"}], - ListGroupMembers: retry[[2]string{"default", "idempotent"}], - } -} - -// GroupClient is a client for interacting with Stackdriver Monitoring API. -// -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -type GroupClient struct { - // The connection to the service. - conn *grpc.ClientConn - - // The gRPC API client. - groupClient monitoringpb.GroupServiceClient - - // The call options for this service. - CallOptions *GroupCallOptions - - // The x-goog-* metadata to be sent with each request. - xGoogMetadata metadata.MD -} - -// NewGroupClient creates a new group service client. -// -// The Group API lets you inspect and manage your -// groups (at #google.monitoring.v3.Group). -// -// A group is a named filter that is used to identify -// a collection of monitored resources. Groups are typically used to -// mirror the physical and/or logical topology of the environment. -// Because group membership is computed dynamically, monitored -// resources that are started in the future are automatically placed -// in matching groups. By using a group to name monitored resources in, -// for example, an alert policy, the target of that alert policy is -// updated automatically as monitored resources are added and removed -// from the infrastructure. -func NewGroupClient(ctx context.Context, opts ...option.ClientOption) (*GroupClient, error) { - conn, err := transport.DialGRPC(ctx, append(defaultGroupClientOptions(), opts...)...) - if err != nil { - return nil, err - } - c := &GroupClient{ - conn: conn, - CallOptions: defaultGroupCallOptions(), - - groupClient: monitoringpb.NewGroupServiceClient(conn), - } - c.setGoogleClientInfo() - return c, nil -} - -// Connection returns the client's connection to the API service. -func (c *GroupClient) Connection() *grpc.ClientConn { - return c.conn -} - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *GroupClient) Close() error { - return c.conn.Close() -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *GroupClient) setGoogleClientInfo(keyval ...string) { - kv := append([]string{"gl-go", versionGo()}, keyval...) - kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) - c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) -} - -// ListGroups lists the existing groups. -func (c *GroupClient) ListGroups(ctx context.Context, req *monitoringpb.ListGroupsRequest, opts ...gax.CallOption) *GroupIterator { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.ListGroups[0:len(c.CallOptions.ListGroups):len(c.CallOptions.ListGroups)], opts...) - it := &GroupIterator{} - req = proto.Clone(req).(*monitoringpb.ListGroupsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.Group, string, error) { - var resp *monitoringpb.ListGroupsResponse - req.PageToken = pageToken - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.groupClient.ListGroups(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, "", err - } - return resp.Group, resp.NextPageToken, nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.PageSize) - it.pageInfo.Token = req.PageToken - return it -} - -// GetGroup gets a single group. -func (c *GroupClient) GetGroup(ctx context.Context, req *monitoringpb.GetGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.GetGroup[0:len(c.CallOptions.GetGroup):len(c.CallOptions.GetGroup)], opts...) - var resp *monitoringpb.Group - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.groupClient.GetGroup(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// CreateGroup creates a new group. -func (c *GroupClient) CreateGroup(ctx context.Context, req *monitoringpb.CreateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.CreateGroup[0:len(c.CallOptions.CreateGroup):len(c.CallOptions.CreateGroup)], opts...) - var resp *monitoringpb.Group - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.groupClient.CreateGroup(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// UpdateGroup updates an existing group. -// You can change any group attributes except name. -func (c *GroupClient) UpdateGroup(ctx context.Context, req *monitoringpb.UpdateGroupRequest, opts ...gax.CallOption) (*monitoringpb.Group, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "group.name", url.QueryEscape(req.GetGroup().GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.UpdateGroup[0:len(c.CallOptions.UpdateGroup):len(c.CallOptions.UpdateGroup)], opts...) - var resp *monitoringpb.Group - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.groupClient.UpdateGroup(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// DeleteGroup deletes an existing group. -func (c *GroupClient) DeleteGroup(ctx context.Context, req *monitoringpb.DeleteGroupRequest, opts ...gax.CallOption) error { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.DeleteGroup[0:len(c.CallOptions.DeleteGroup):len(c.CallOptions.DeleteGroup)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = c.groupClient.DeleteGroup(ctx, req, settings.GRPC...) - return err - }, opts...) - return err -} - -// ListGroupMembers lists the monitored resources that are members of a group. -func (c *GroupClient) ListGroupMembers(ctx context.Context, req *monitoringpb.ListGroupMembersRequest, opts ...gax.CallOption) *MonitoredResourceIterator { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.ListGroupMembers[0:len(c.CallOptions.ListGroupMembers):len(c.CallOptions.ListGroupMembers)], opts...) - it := &MonitoredResourceIterator{} - req = proto.Clone(req).(*monitoringpb.ListGroupMembersRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoredrespb.MonitoredResource, string, error) { - var resp *monitoringpb.ListGroupMembersResponse - req.PageToken = pageToken - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.groupClient.ListGroupMembers(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, "", err - } - return resp.Members, resp.NextPageToken, nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.PageSize) - it.pageInfo.Token = req.PageToken - return it -} - -// GroupIterator manages a stream of *monitoringpb.Group. -type GroupIterator struct { - items []*monitoringpb.Group - pageInfo *iterator.PageInfo - nextFunc func() error - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.Group, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *GroupIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *GroupIterator) Next() (*monitoringpb.Group, error) { - var item *monitoringpb.Group - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *GroupIterator) bufLen() int { - return len(it.items) -} - -func (it *GroupIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// MonitoredResourceIterator manages a stream of *monitoredrespb.MonitoredResource. -type MonitoredResourceIterator struct { - items []*monitoredrespb.MonitoredResource - pageInfo *iterator.PageInfo - nextFunc func() error - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*monitoredrespb.MonitoredResource, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *MonitoredResourceIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *MonitoredResourceIterator) Next() (*monitoredrespb.MonitoredResource, error) { - var item *monitoredrespb.MonitoredResource - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *MonitoredResourceIterator) bufLen() int { - return len(it.items) -} - -func (it *MonitoredResourceIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/metric_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/metric_client.go deleted file mode 100644 index bce05a4ce..000000000 --- a/vendor/cloud.google.com/go/monitoring/apiv3/metric_client.go +++ /dev/null @@ -1,472 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by gapic-generator. DO NOT EDIT. - -package monitoring - -import ( - "context" - "fmt" - "math" - "net/url" - "time" - - "github.com/golang/protobuf/proto" - gax "github.com/googleapis/gax-go/v2" - "google.golang.org/api/iterator" - "google.golang.org/api/option" - "google.golang.org/api/transport" - metricpb "google.golang.org/genproto/googleapis/api/metric" - monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" - monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" -) - -// MetricCallOptions contains the retry settings for each method of MetricClient. -type MetricCallOptions struct { - ListMonitoredResourceDescriptors []gax.CallOption - GetMonitoredResourceDescriptor []gax.CallOption - ListMetricDescriptors []gax.CallOption - GetMetricDescriptor []gax.CallOption - CreateMetricDescriptor []gax.CallOption - DeleteMetricDescriptor []gax.CallOption - ListTimeSeries []gax.CallOption - CreateTimeSeries []gax.CallOption -} - -func defaultMetricClientOptions() []option.ClientOption { - return []option.ClientOption{ - option.WithEndpoint("monitoring.googleapis.com:443"), - option.WithScopes(DefaultAuthScopes()...), - option.WithGRPCDialOption(grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(math.MaxInt32))), - } -} - -func defaultMetricCallOptions() *MetricCallOptions { - retry := map[[2]string][]gax.CallOption{ - {"default", "idempotent"}: { - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.DeadlineExceeded, - codes.Unavailable, - }, gax.Backoff{ - Initial: 100 * time.Millisecond, - Max: 60000 * time.Millisecond, - Multiplier: 1.3, - }) - }), - }, - } - return &MetricCallOptions{ - ListMonitoredResourceDescriptors: retry[[2]string{"default", "idempotent"}], - GetMonitoredResourceDescriptor: retry[[2]string{"default", "idempotent"}], - ListMetricDescriptors: retry[[2]string{"default", "idempotent"}], - GetMetricDescriptor: retry[[2]string{"default", "idempotent"}], - CreateMetricDescriptor: retry[[2]string{"default", "non_idempotent"}], - DeleteMetricDescriptor: retry[[2]string{"default", "idempotent"}], - ListTimeSeries: retry[[2]string{"default", "idempotent"}], - CreateTimeSeries: retry[[2]string{"default", "non_idempotent"}], - } -} - -// MetricClient is a client for interacting with Stackdriver Monitoring API. -// -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -type MetricClient struct { - // The connection to the service. - conn *grpc.ClientConn - - // The gRPC API client. - metricClient monitoringpb.MetricServiceClient - - // The call options for this service. - CallOptions *MetricCallOptions - - // The x-goog-* metadata to be sent with each request. - xGoogMetadata metadata.MD -} - -// NewMetricClient creates a new metric service client. -// -// Manages metric descriptors, monitored resource descriptors, and -// time series data. -func NewMetricClient(ctx context.Context, opts ...option.ClientOption) (*MetricClient, error) { - conn, err := transport.DialGRPC(ctx, append(defaultMetricClientOptions(), opts...)...) - if err != nil { - return nil, err - } - c := &MetricClient{ - conn: conn, - CallOptions: defaultMetricCallOptions(), - - metricClient: monitoringpb.NewMetricServiceClient(conn), - } - c.setGoogleClientInfo() - return c, nil -} - -// Connection returns the client's connection to the API service. -func (c *MetricClient) Connection() *grpc.ClientConn { - return c.conn -} - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *MetricClient) Close() error { - return c.conn.Close() -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *MetricClient) setGoogleClientInfo(keyval ...string) { - kv := append([]string{"gl-go", versionGo()}, keyval...) - kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) - c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) -} - -// ListMonitoredResourceDescriptors lists monitored resource descriptors that match a filter. This method does -// not require a Stackdriver account. -func (c *MetricClient) ListMonitoredResourceDescriptors(ctx context.Context, req *monitoringpb.ListMonitoredResourceDescriptorsRequest, opts ...gax.CallOption) *MonitoredResourceDescriptorIterator { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.ListMonitoredResourceDescriptors[0:len(c.CallOptions.ListMonitoredResourceDescriptors):len(c.CallOptions.ListMonitoredResourceDescriptors)], opts...) - it := &MonitoredResourceDescriptorIterator{} - req = proto.Clone(req).(*monitoringpb.ListMonitoredResourceDescriptorsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoredrespb.MonitoredResourceDescriptor, string, error) { - var resp *monitoringpb.ListMonitoredResourceDescriptorsResponse - req.PageToken = pageToken - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.metricClient.ListMonitoredResourceDescriptors(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, "", err - } - return resp.ResourceDescriptors, resp.NextPageToken, nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.PageSize) - it.pageInfo.Token = req.PageToken - return it -} - -// GetMonitoredResourceDescriptor gets a single monitored resource descriptor. This method does not require a -// Stackdriver account. -func (c *MetricClient) GetMonitoredResourceDescriptor(ctx context.Context, req *monitoringpb.GetMonitoredResourceDescriptorRequest, opts ...gax.CallOption) (*monitoredrespb.MonitoredResourceDescriptor, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.GetMonitoredResourceDescriptor[0:len(c.CallOptions.GetMonitoredResourceDescriptor):len(c.CallOptions.GetMonitoredResourceDescriptor)], opts...) - var resp *monitoredrespb.MonitoredResourceDescriptor - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.metricClient.GetMonitoredResourceDescriptor(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// ListMetricDescriptors lists metric descriptors that match a filter. This method does not require -// a Stackdriver account. -func (c *MetricClient) ListMetricDescriptors(ctx context.Context, req *monitoringpb.ListMetricDescriptorsRequest, opts ...gax.CallOption) *MetricDescriptorIterator { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.ListMetricDescriptors[0:len(c.CallOptions.ListMetricDescriptors):len(c.CallOptions.ListMetricDescriptors)], opts...) - it := &MetricDescriptorIterator{} - req = proto.Clone(req).(*monitoringpb.ListMetricDescriptorsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*metricpb.MetricDescriptor, string, error) { - var resp *monitoringpb.ListMetricDescriptorsResponse - req.PageToken = pageToken - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.metricClient.ListMetricDescriptors(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, "", err - } - return resp.MetricDescriptors, resp.NextPageToken, nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.PageSize) - it.pageInfo.Token = req.PageToken - return it -} - -// GetMetricDescriptor gets a single metric descriptor. This method does not require a Stackdriver -// account. -func (c *MetricClient) GetMetricDescriptor(ctx context.Context, req *monitoringpb.GetMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.GetMetricDescriptor[0:len(c.CallOptions.GetMetricDescriptor):len(c.CallOptions.GetMetricDescriptor)], opts...) - var resp *metricpb.MetricDescriptor - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.metricClient.GetMetricDescriptor(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// CreateMetricDescriptor creates a new metric descriptor. -// User-created metric descriptors define -// custom metrics (at /monitoring/custom-metrics). -func (c *MetricClient) CreateMetricDescriptor(ctx context.Context, req *monitoringpb.CreateMetricDescriptorRequest, opts ...gax.CallOption) (*metricpb.MetricDescriptor, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.CreateMetricDescriptor[0:len(c.CallOptions.CreateMetricDescriptor):len(c.CallOptions.CreateMetricDescriptor)], opts...) - var resp *metricpb.MetricDescriptor - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.metricClient.CreateMetricDescriptor(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// DeleteMetricDescriptor deletes a metric descriptor. Only user-created -// custom metrics (at /monitoring/custom-metrics) can be deleted. -func (c *MetricClient) DeleteMetricDescriptor(ctx context.Context, req *monitoringpb.DeleteMetricDescriptorRequest, opts ...gax.CallOption) error { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.DeleteMetricDescriptor[0:len(c.CallOptions.DeleteMetricDescriptor):len(c.CallOptions.DeleteMetricDescriptor)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = c.metricClient.DeleteMetricDescriptor(ctx, req, settings.GRPC...) - return err - }, opts...) - return err -} - -// ListTimeSeries lists time series that match a filter. This method does not require a -// Stackdriver account. -func (c *MetricClient) ListTimeSeries(ctx context.Context, req *monitoringpb.ListTimeSeriesRequest, opts ...gax.CallOption) *TimeSeriesIterator { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.ListTimeSeries[0:len(c.CallOptions.ListTimeSeries):len(c.CallOptions.ListTimeSeries)], opts...) - it := &TimeSeriesIterator{} - req = proto.Clone(req).(*monitoringpb.ListTimeSeriesRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.TimeSeries, string, error) { - var resp *monitoringpb.ListTimeSeriesResponse - req.PageToken = pageToken - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.metricClient.ListTimeSeries(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, "", err - } - return resp.TimeSeries, resp.NextPageToken, nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.PageSize) - it.pageInfo.Token = req.PageToken - return it -} - -// CreateTimeSeries creates or adds data to one or more time series. -// The response is empty if all time series in the request were written. -// If any time series could not be written, a corresponding failure message is -// included in the error response. -func (c *MetricClient) CreateTimeSeries(ctx context.Context, req *monitoringpb.CreateTimeSeriesRequest, opts ...gax.CallOption) error { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.CreateTimeSeries[0:len(c.CallOptions.CreateTimeSeries):len(c.CallOptions.CreateTimeSeries)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = c.metricClient.CreateTimeSeries(ctx, req, settings.GRPC...) - return err - }, opts...) - return err -} - -// MetricDescriptorIterator manages a stream of *metricpb.MetricDescriptor. -type MetricDescriptorIterator struct { - items []*metricpb.MetricDescriptor - pageInfo *iterator.PageInfo - nextFunc func() error - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*metricpb.MetricDescriptor, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *MetricDescriptorIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *MetricDescriptorIterator) Next() (*metricpb.MetricDescriptor, error) { - var item *metricpb.MetricDescriptor - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *MetricDescriptorIterator) bufLen() int { - return len(it.items) -} - -func (it *MetricDescriptorIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// MonitoredResourceDescriptorIterator manages a stream of *monitoredrespb.MonitoredResourceDescriptor. -type MonitoredResourceDescriptorIterator struct { - items []*monitoredrespb.MonitoredResourceDescriptor - pageInfo *iterator.PageInfo - nextFunc func() error - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*monitoredrespb.MonitoredResourceDescriptor, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *MonitoredResourceDescriptorIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *MonitoredResourceDescriptorIterator) Next() (*monitoredrespb.MonitoredResourceDescriptor, error) { - var item *monitoredrespb.MonitoredResourceDescriptor - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *MonitoredResourceDescriptorIterator) bufLen() int { - return len(it.items) -} - -func (it *MonitoredResourceDescriptorIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// TimeSeriesIterator manages a stream of *monitoringpb.TimeSeries. -type TimeSeriesIterator struct { - items []*monitoringpb.TimeSeries - pageInfo *iterator.PageInfo - nextFunc func() error - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.TimeSeries, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *TimeSeriesIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *TimeSeriesIterator) Next() (*monitoringpb.TimeSeries, error) { - var item *monitoringpb.TimeSeries - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *TimeSeriesIterator) bufLen() int { - return len(it.items) -} - -func (it *TimeSeriesIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/notification_channel_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/notification_channel_client.go deleted file mode 100644 index f97444af2..000000000 --- a/vendor/cloud.google.com/go/monitoring/apiv3/notification_channel_client.go +++ /dev/null @@ -1,464 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by gapic-generator. DO NOT EDIT. - -package monitoring - -import ( - "context" - "fmt" - "math" - "net/url" - "time" - - "github.com/golang/protobuf/proto" - gax "github.com/googleapis/gax-go/v2" - "google.golang.org/api/iterator" - "google.golang.org/api/option" - "google.golang.org/api/transport" - monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" -) - -// NotificationChannelCallOptions contains the retry settings for each method of NotificationChannelClient. -type NotificationChannelCallOptions struct { - ListNotificationChannelDescriptors []gax.CallOption - GetNotificationChannelDescriptor []gax.CallOption - ListNotificationChannels []gax.CallOption - GetNotificationChannel []gax.CallOption - CreateNotificationChannel []gax.CallOption - UpdateNotificationChannel []gax.CallOption - DeleteNotificationChannel []gax.CallOption - SendNotificationChannelVerificationCode []gax.CallOption - GetNotificationChannelVerificationCode []gax.CallOption - VerifyNotificationChannel []gax.CallOption -} - -func defaultNotificationChannelClientOptions() []option.ClientOption { - return []option.ClientOption{ - option.WithEndpoint("monitoring.googleapis.com:443"), - option.WithScopes(DefaultAuthScopes()...), - option.WithGRPCDialOption(grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(math.MaxInt32))), - } -} - -func defaultNotificationChannelCallOptions() *NotificationChannelCallOptions { - retry := map[[2]string][]gax.CallOption{ - {"default", "idempotent"}: { - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.DeadlineExceeded, - codes.Unavailable, - }, gax.Backoff{ - Initial: 100 * time.Millisecond, - Max: 60000 * time.Millisecond, - Multiplier: 1.3, - }) - }), - }, - } - return &NotificationChannelCallOptions{ - ListNotificationChannelDescriptors: retry[[2]string{"default", "idempotent"}], - GetNotificationChannelDescriptor: retry[[2]string{"default", "idempotent"}], - ListNotificationChannels: retry[[2]string{"default", "idempotent"}], - GetNotificationChannel: retry[[2]string{"default", "idempotent"}], - CreateNotificationChannel: retry[[2]string{"default", "non_idempotent"}], - UpdateNotificationChannel: retry[[2]string{"default", "non_idempotent"}], - DeleteNotificationChannel: retry[[2]string{"default", "idempotent"}], - SendNotificationChannelVerificationCode: retry[[2]string{"default", "non_idempotent"}], - GetNotificationChannelVerificationCode: retry[[2]string{"default", "idempotent"}], - VerifyNotificationChannel: retry[[2]string{"default", "idempotent"}], - } -} - -// NotificationChannelClient is a client for interacting with Stackdriver Monitoring API. -// -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -type NotificationChannelClient struct { - // The connection to the service. - conn *grpc.ClientConn - - // The gRPC API client. - notificationChannelClient monitoringpb.NotificationChannelServiceClient - - // The call options for this service. - CallOptions *NotificationChannelCallOptions - - // The x-goog-* metadata to be sent with each request. - xGoogMetadata metadata.MD -} - -// NewNotificationChannelClient creates a new notification channel service client. -// -// The Notification Channel API provides access to configuration that -// controls how messages related to incidents are sent. -func NewNotificationChannelClient(ctx context.Context, opts ...option.ClientOption) (*NotificationChannelClient, error) { - conn, err := transport.DialGRPC(ctx, append(defaultNotificationChannelClientOptions(), opts...)...) - if err != nil { - return nil, err - } - c := &NotificationChannelClient{ - conn: conn, - CallOptions: defaultNotificationChannelCallOptions(), - - notificationChannelClient: monitoringpb.NewNotificationChannelServiceClient(conn), - } - c.setGoogleClientInfo() - return c, nil -} - -// Connection returns the client's connection to the API service. -func (c *NotificationChannelClient) Connection() *grpc.ClientConn { - return c.conn -} - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *NotificationChannelClient) Close() error { - return c.conn.Close() -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *NotificationChannelClient) setGoogleClientInfo(keyval ...string) { - kv := append([]string{"gl-go", versionGo()}, keyval...) - kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) - c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) -} - -// ListNotificationChannelDescriptors lists the descriptors for supported channel types. The use of descriptors -// makes it possible for new channel types to be dynamically added. -func (c *NotificationChannelClient) ListNotificationChannelDescriptors(ctx context.Context, req *monitoringpb.ListNotificationChannelDescriptorsRequest, opts ...gax.CallOption) *NotificationChannelDescriptorIterator { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.ListNotificationChannelDescriptors[0:len(c.CallOptions.ListNotificationChannelDescriptors):len(c.CallOptions.ListNotificationChannelDescriptors)], opts...) - it := &NotificationChannelDescriptorIterator{} - req = proto.Clone(req).(*monitoringpb.ListNotificationChannelDescriptorsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.NotificationChannelDescriptor, string, error) { - var resp *monitoringpb.ListNotificationChannelDescriptorsResponse - req.PageToken = pageToken - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.notificationChannelClient.ListNotificationChannelDescriptors(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, "", err - } - return resp.ChannelDescriptors, resp.NextPageToken, nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.PageSize) - it.pageInfo.Token = req.PageToken - return it -} - -// GetNotificationChannelDescriptor gets a single channel descriptor. The descriptor indicates which fields -// are expected / permitted for a notification channel of the given type. -func (c *NotificationChannelClient) GetNotificationChannelDescriptor(ctx context.Context, req *monitoringpb.GetNotificationChannelDescriptorRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannelDescriptor, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.GetNotificationChannelDescriptor[0:len(c.CallOptions.GetNotificationChannelDescriptor):len(c.CallOptions.GetNotificationChannelDescriptor)], opts...) - var resp *monitoringpb.NotificationChannelDescriptor - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.notificationChannelClient.GetNotificationChannelDescriptor(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// ListNotificationChannels lists the notification channels that have been created for the project. -func (c *NotificationChannelClient) ListNotificationChannels(ctx context.Context, req *monitoringpb.ListNotificationChannelsRequest, opts ...gax.CallOption) *NotificationChannelIterator { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.ListNotificationChannels[0:len(c.CallOptions.ListNotificationChannels):len(c.CallOptions.ListNotificationChannels)], opts...) - it := &NotificationChannelIterator{} - req = proto.Clone(req).(*monitoringpb.ListNotificationChannelsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.NotificationChannel, string, error) { - var resp *monitoringpb.ListNotificationChannelsResponse - req.PageToken = pageToken - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.notificationChannelClient.ListNotificationChannels(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, "", err - } - return resp.NotificationChannels, resp.NextPageToken, nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.PageSize) - it.pageInfo.Token = req.PageToken - return it -} - -// GetNotificationChannel gets a single notification channel. The channel includes the relevant -// configuration details with which the channel was created. However, the -// response may truncate or omit passwords, API keys, or other private key -// matter and thus the response may not be 100% identical to the information -// that was supplied in the call to the create method. -func (c *NotificationChannelClient) GetNotificationChannel(ctx context.Context, req *monitoringpb.GetNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.GetNotificationChannel[0:len(c.CallOptions.GetNotificationChannel):len(c.CallOptions.GetNotificationChannel)], opts...) - var resp *monitoringpb.NotificationChannel - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.notificationChannelClient.GetNotificationChannel(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// CreateNotificationChannel creates a new notification channel, representing a single notification -// endpoint such as an email address, SMS number, or PagerDuty service. -func (c *NotificationChannelClient) CreateNotificationChannel(ctx context.Context, req *monitoringpb.CreateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.CreateNotificationChannel[0:len(c.CallOptions.CreateNotificationChannel):len(c.CallOptions.CreateNotificationChannel)], opts...) - var resp *monitoringpb.NotificationChannel - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.notificationChannelClient.CreateNotificationChannel(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// UpdateNotificationChannel updates a notification channel. Fields not specified in the field mask -// remain unchanged. -func (c *NotificationChannelClient) UpdateNotificationChannel(ctx context.Context, req *monitoringpb.UpdateNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "notification_channel.name", url.QueryEscape(req.GetNotificationChannel().GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.UpdateNotificationChannel[0:len(c.CallOptions.UpdateNotificationChannel):len(c.CallOptions.UpdateNotificationChannel)], opts...) - var resp *monitoringpb.NotificationChannel - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.notificationChannelClient.UpdateNotificationChannel(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// DeleteNotificationChannel deletes a notification channel. -func (c *NotificationChannelClient) DeleteNotificationChannel(ctx context.Context, req *monitoringpb.DeleteNotificationChannelRequest, opts ...gax.CallOption) error { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.DeleteNotificationChannel[0:len(c.CallOptions.DeleteNotificationChannel):len(c.CallOptions.DeleteNotificationChannel)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = c.notificationChannelClient.DeleteNotificationChannel(ctx, req, settings.GRPC...) - return err - }, opts...) - return err -} - -// SendNotificationChannelVerificationCode causes a verification code to be delivered to the channel. The code -// can then be supplied in VerifyNotificationChannel to verify the channel. -func (c *NotificationChannelClient) SendNotificationChannelVerificationCode(ctx context.Context, req *monitoringpb.SendNotificationChannelVerificationCodeRequest, opts ...gax.CallOption) error { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.SendNotificationChannelVerificationCode[0:len(c.CallOptions.SendNotificationChannelVerificationCode):len(c.CallOptions.SendNotificationChannelVerificationCode)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = c.notificationChannelClient.SendNotificationChannelVerificationCode(ctx, req, settings.GRPC...) - return err - }, opts...) - return err -} - -// GetNotificationChannelVerificationCode requests a verification code for an already verified channel that can then -// be used in a call to VerifyNotificationChannel() on a different channel -// with an equivalent identity in the same or in a different project. This -// makes it possible to copy a channel between projects without requiring -// manual reverification of the channel. If the channel is not in the -// verified state, this method will fail (in other words, this may only be -// used if the SendNotificationChannelVerificationCode and -// VerifyNotificationChannel paths have already been used to put the given -// channel into the verified state). -// -// There is no guarantee that the verification codes returned by this method -// will be of a similar structure or form as the ones that are delivered -// to the channel via SendNotificationChannelVerificationCode; while -// VerifyNotificationChannel() will recognize both the codes delivered via -// SendNotificationChannelVerificationCode() and returned from -// GetNotificationChannelVerificationCode(), it is typically the case that -// the verification codes delivered via -// SendNotificationChannelVerificationCode() will be shorter and also -// have a shorter expiration (e.g. codes such as "G-123456") whereas -// GetVerificationCode() will typically return a much longer, websafe base -// 64 encoded string that has a longer expiration time. -func (c *NotificationChannelClient) GetNotificationChannelVerificationCode(ctx context.Context, req *monitoringpb.GetNotificationChannelVerificationCodeRequest, opts ...gax.CallOption) (*monitoringpb.GetNotificationChannelVerificationCodeResponse, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.GetNotificationChannelVerificationCode[0:len(c.CallOptions.GetNotificationChannelVerificationCode):len(c.CallOptions.GetNotificationChannelVerificationCode)], opts...) - var resp *monitoringpb.GetNotificationChannelVerificationCodeResponse - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.notificationChannelClient.GetNotificationChannelVerificationCode(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// VerifyNotificationChannel verifies a NotificationChannel by proving receipt of the code -// delivered to the channel as a result of calling -// SendNotificationChannelVerificationCode. -func (c *NotificationChannelClient) VerifyNotificationChannel(ctx context.Context, req *monitoringpb.VerifyNotificationChannelRequest, opts ...gax.CallOption) (*monitoringpb.NotificationChannel, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.VerifyNotificationChannel[0:len(c.CallOptions.VerifyNotificationChannel):len(c.CallOptions.VerifyNotificationChannel)], opts...) - var resp *monitoringpb.NotificationChannel - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.notificationChannelClient.VerifyNotificationChannel(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// NotificationChannelDescriptorIterator manages a stream of *monitoringpb.NotificationChannelDescriptor. -type NotificationChannelDescriptorIterator struct { - items []*monitoringpb.NotificationChannelDescriptor - pageInfo *iterator.PageInfo - nextFunc func() error - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.NotificationChannelDescriptor, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *NotificationChannelDescriptorIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *NotificationChannelDescriptorIterator) Next() (*monitoringpb.NotificationChannelDescriptor, error) { - var item *monitoringpb.NotificationChannelDescriptor - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *NotificationChannelDescriptorIterator) bufLen() int { - return len(it.items) -} - -func (it *NotificationChannelDescriptorIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// NotificationChannelIterator manages a stream of *monitoringpb.NotificationChannel. -type NotificationChannelIterator struct { - items []*monitoringpb.NotificationChannel - pageInfo *iterator.PageInfo - nextFunc func() error - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.NotificationChannel, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *NotificationChannelIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *NotificationChannelIterator) Next() (*monitoringpb.NotificationChannel, error) { - var item *monitoringpb.NotificationChannel - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *NotificationChannelIterator) bufLen() int { - return len(it.items) -} - -func (it *NotificationChannelIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/path_funcs.go b/vendor/cloud.google.com/go/monitoring/apiv3/path_funcs.go deleted file mode 100644 index b2b514ba5..000000000 --- a/vendor/cloud.google.com/go/monitoring/apiv3/path_funcs.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package monitoring - -// GroupProjectPath returns the path for the project resource. -// -// Deprecated: Use -// fmt.Sprintf("projects/%s", project) -// instead. -func GroupProjectPath(project string) string { - return "" + - "projects/" + - project + - "" -} - -// GroupGroupPath returns the path for the group resource. -// -// Deprecated: Use -// fmt.Sprintf("projects/%s/groups/%s", project, group) -// instead. -func GroupGroupPath(project, group string) string { - return "" + - "projects/" + - project + - "/groups/" + - group + - "" -} - -// MetricProjectPath returns the path for the project resource. -// -// Deprecated: Use -// fmt.Sprintf("projects/%s", project) -// instead. -func MetricProjectPath(project string) string { - return "" + - "projects/" + - project + - "" -} - -// MetricMetricDescriptorPath returns the path for the metric descriptor resource. -// -// Deprecated: Use -// fmt.Sprintf("projects/%s/metricDescriptors/%s", project, metricDescriptor) -// instead. -func MetricMetricDescriptorPath(project, metricDescriptor string) string { - return "" + - "projects/" + - project + - "/metricDescriptors/" + - metricDescriptor + - "" -} - -// MetricMonitoredResourceDescriptorPath returns the path for the monitored resource descriptor resource. -// -// Deprecated: Use -// fmt.Sprintf("projects/%s/monitoredResourceDescriptors/%s", project, monitoredResourceDescriptor) -// instead. -func MetricMonitoredResourceDescriptorPath(project, monitoredResourceDescriptor string) string { - return "" + - "projects/" + - project + - "/monitoredResourceDescriptors/" + - monitoredResourceDescriptor + - "" -} - -// UptimeCheckProjectPath returns the path for the project resource. -// -// Deprecated: Use -// fmt.Sprintf("projects/%s", project) -// instead. -func UptimeCheckProjectPath(project string) string { - return "" + - "projects/" + - project + - "" -} - -// UptimeCheckUptimeCheckConfigPath returns the path for the uptime check config resource. -// -// Deprecated: Use -// fmt.Sprintf("projects/%s/uptimeCheckConfigs/%s", project, uptimeCheckConfig) -// instead. -func UptimeCheckUptimeCheckConfigPath(project, uptimeCheckConfig string) string { - return "" + - "projects/" + - project + - "/uptimeCheckConfigs/" + - uptimeCheckConfig + - "" -} diff --git a/vendor/cloud.google.com/go/monitoring/apiv3/uptime_check_client.go b/vendor/cloud.google.com/go/monitoring/apiv3/uptime_check_client.go deleted file mode 100644 index 246262c7f..000000000 --- a/vendor/cloud.google.com/go/monitoring/apiv3/uptime_check_client.go +++ /dev/null @@ -1,372 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by gapic-generator. DO NOT EDIT. - -package monitoring - -import ( - "context" - "fmt" - "math" - "net/url" - "time" - - "github.com/golang/protobuf/proto" - gax "github.com/googleapis/gax-go/v2" - "google.golang.org/api/iterator" - "google.golang.org/api/option" - "google.golang.org/api/transport" - monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" -) - -// UptimeCheckCallOptions contains the retry settings for each method of UptimeCheckClient. -type UptimeCheckCallOptions struct { - ListUptimeCheckConfigs []gax.CallOption - GetUptimeCheckConfig []gax.CallOption - CreateUptimeCheckConfig []gax.CallOption - UpdateUptimeCheckConfig []gax.CallOption - DeleteUptimeCheckConfig []gax.CallOption - ListUptimeCheckIps []gax.CallOption -} - -func defaultUptimeCheckClientOptions() []option.ClientOption { - return []option.ClientOption{ - option.WithEndpoint("monitoring.googleapis.com:443"), - option.WithScopes(DefaultAuthScopes()...), - option.WithGRPCDialOption(grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(math.MaxInt32))), - } -} - -func defaultUptimeCheckCallOptions() *UptimeCheckCallOptions { - retry := map[[2]string][]gax.CallOption{ - {"default", "idempotent"}: { - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.DeadlineExceeded, - codes.Unavailable, - }, gax.Backoff{ - Initial: 100 * time.Millisecond, - Max: 60000 * time.Millisecond, - Multiplier: 1.3, - }) - }), - }, - } - return &UptimeCheckCallOptions{ - ListUptimeCheckConfigs: retry[[2]string{"default", "idempotent"}], - GetUptimeCheckConfig: retry[[2]string{"default", "idempotent"}], - CreateUptimeCheckConfig: retry[[2]string{"default", "non_idempotent"}], - UpdateUptimeCheckConfig: retry[[2]string{"default", "non_idempotent"}], - DeleteUptimeCheckConfig: retry[[2]string{"default", "idempotent"}], - ListUptimeCheckIps: retry[[2]string{"default", "idempotent"}], - } -} - -// UptimeCheckClient is a client for interacting with Stackdriver Monitoring API. -// -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -type UptimeCheckClient struct { - // The connection to the service. - conn *grpc.ClientConn - - // The gRPC API client. - uptimeCheckClient monitoringpb.UptimeCheckServiceClient - - // The call options for this service. - CallOptions *UptimeCheckCallOptions - - // The x-goog-* metadata to be sent with each request. - xGoogMetadata metadata.MD -} - -// NewUptimeCheckClient creates a new uptime check service client. -// -// The UptimeCheckService API is used to manage (list, create, delete, edit) -// uptime check configurations in the Stackdriver Monitoring product. An uptime -// check is a piece of configuration that determines which resources and -// services to monitor for availability. These configurations can also be -// configured interactively by navigating to the [Cloud Console] -// (http://console.cloud.google.com), selecting the appropriate project, -// clicking on "Monitoring" on the left-hand side to navigate to Stackdriver, -// and then clicking on "Uptime". -func NewUptimeCheckClient(ctx context.Context, opts ...option.ClientOption) (*UptimeCheckClient, error) { - conn, err := transport.DialGRPC(ctx, append(defaultUptimeCheckClientOptions(), opts...)...) - if err != nil { - return nil, err - } - c := &UptimeCheckClient{ - conn: conn, - CallOptions: defaultUptimeCheckCallOptions(), - - uptimeCheckClient: monitoringpb.NewUptimeCheckServiceClient(conn), - } - c.setGoogleClientInfo() - return c, nil -} - -// Connection returns the client's connection to the API service. -func (c *UptimeCheckClient) Connection() *grpc.ClientConn { - return c.conn -} - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *UptimeCheckClient) Close() error { - return c.conn.Close() -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *UptimeCheckClient) setGoogleClientInfo(keyval ...string) { - kv := append([]string{"gl-go", versionGo()}, keyval...) - kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) - c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) -} - -// ListUptimeCheckConfigs lists the existing valid uptime check configurations for the project, -// leaving out any invalid configurations. -func (c *UptimeCheckClient) ListUptimeCheckConfigs(ctx context.Context, req *monitoringpb.ListUptimeCheckConfigsRequest, opts ...gax.CallOption) *UptimeCheckConfigIterator { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.ListUptimeCheckConfigs[0:len(c.CallOptions.ListUptimeCheckConfigs):len(c.CallOptions.ListUptimeCheckConfigs)], opts...) - it := &UptimeCheckConfigIterator{} - req = proto.Clone(req).(*monitoringpb.ListUptimeCheckConfigsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.UptimeCheckConfig, string, error) { - var resp *monitoringpb.ListUptimeCheckConfigsResponse - req.PageToken = pageToken - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.uptimeCheckClient.ListUptimeCheckConfigs(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, "", err - } - return resp.UptimeCheckConfigs, resp.NextPageToken, nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.PageSize) - it.pageInfo.Token = req.PageToken - return it -} - -// GetUptimeCheckConfig gets a single uptime check configuration. -func (c *UptimeCheckClient) GetUptimeCheckConfig(ctx context.Context, req *monitoringpb.GetUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.GetUptimeCheckConfig[0:len(c.CallOptions.GetUptimeCheckConfig):len(c.CallOptions.GetUptimeCheckConfig)], opts...) - var resp *monitoringpb.UptimeCheckConfig - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.uptimeCheckClient.GetUptimeCheckConfig(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// CreateUptimeCheckConfig creates a new uptime check configuration. -func (c *UptimeCheckClient) CreateUptimeCheckConfig(ctx context.Context, req *monitoringpb.CreateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "parent", url.QueryEscape(req.GetParent()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.CreateUptimeCheckConfig[0:len(c.CallOptions.CreateUptimeCheckConfig):len(c.CallOptions.CreateUptimeCheckConfig)], opts...) - var resp *monitoringpb.UptimeCheckConfig - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.uptimeCheckClient.CreateUptimeCheckConfig(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// UpdateUptimeCheckConfig updates an uptime check configuration. You can either replace the entire -// configuration with a new one or replace only certain fields in the current -// configuration by specifying the fields to be updated via "updateMask". -// Returns the updated configuration. -func (c *UptimeCheckClient) UpdateUptimeCheckConfig(ctx context.Context, req *monitoringpb.UpdateUptimeCheckConfigRequest, opts ...gax.CallOption) (*monitoringpb.UptimeCheckConfig, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "uptime_check_config.name", url.QueryEscape(req.GetUptimeCheckConfig().GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.UpdateUptimeCheckConfig[0:len(c.CallOptions.UpdateUptimeCheckConfig):len(c.CallOptions.UpdateUptimeCheckConfig)], opts...) - var resp *monitoringpb.UptimeCheckConfig - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.uptimeCheckClient.UpdateUptimeCheckConfig(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} - -// DeleteUptimeCheckConfig deletes an uptime check configuration. Note that this method will fail -// if the uptime check configuration is referenced by an alert policy or -// other dependent configs that would be rendered invalid by the deletion. -func (c *UptimeCheckClient) DeleteUptimeCheckConfig(ctx context.Context, req *monitoringpb.DeleteUptimeCheckConfigRequest, opts ...gax.CallOption) error { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.DeleteUptimeCheckConfig[0:len(c.CallOptions.DeleteUptimeCheckConfig):len(c.CallOptions.DeleteUptimeCheckConfig)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = c.uptimeCheckClient.DeleteUptimeCheckConfig(ctx, req, settings.GRPC...) - return err - }, opts...) - return err -} - -// ListUptimeCheckIps returns the list of IPs that checkers run from -func (c *UptimeCheckClient) ListUptimeCheckIps(ctx context.Context, req *monitoringpb.ListUptimeCheckIpsRequest, opts ...gax.CallOption) *UptimeCheckIpIterator { - ctx = insertMetadata(ctx, c.xGoogMetadata) - opts = append(c.CallOptions.ListUptimeCheckIps[0:len(c.CallOptions.ListUptimeCheckIps):len(c.CallOptions.ListUptimeCheckIps)], opts...) - it := &UptimeCheckIpIterator{} - req = proto.Clone(req).(*monitoringpb.ListUptimeCheckIpsRequest) - it.InternalFetch = func(pageSize int, pageToken string) ([]*monitoringpb.UptimeCheckIp, string, error) { - var resp *monitoringpb.ListUptimeCheckIpsResponse - req.PageToken = pageToken - if pageSize > math.MaxInt32 { - req.PageSize = math.MaxInt32 - } else { - req.PageSize = int32(pageSize) - } - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.uptimeCheckClient.ListUptimeCheckIps(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, "", err - } - return resp.UptimeCheckIps, resp.NextPageToken, nil - } - fetch := func(pageSize int, pageToken string) (string, error) { - items, nextPageToken, err := it.InternalFetch(pageSize, pageToken) - if err != nil { - return "", err - } - it.items = append(it.items, items...) - return nextPageToken, nil - } - it.pageInfo, it.nextFunc = iterator.NewPageInfo(fetch, it.bufLen, it.takeBuf) - it.pageInfo.MaxSize = int(req.PageSize) - it.pageInfo.Token = req.PageToken - return it -} - -// UptimeCheckConfigIterator manages a stream of *monitoringpb.UptimeCheckConfig. -type UptimeCheckConfigIterator struct { - items []*monitoringpb.UptimeCheckConfig - pageInfo *iterator.PageInfo - nextFunc func() error - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.UptimeCheckConfig, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *UptimeCheckConfigIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *UptimeCheckConfigIterator) Next() (*monitoringpb.UptimeCheckConfig, error) { - var item *monitoringpb.UptimeCheckConfig - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *UptimeCheckConfigIterator) bufLen() int { - return len(it.items) -} - -func (it *UptimeCheckConfigIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} - -// UptimeCheckIpIterator manages a stream of *monitoringpb.UptimeCheckIp. -type UptimeCheckIpIterator struct { - items []*monitoringpb.UptimeCheckIp - pageInfo *iterator.PageInfo - nextFunc func() error - - // InternalFetch is for use by the Google Cloud Libraries only. - // It is not part of the stable interface of this package. - // - // InternalFetch returns results from a single call to the underlying RPC. - // The number of results is no greater than pageSize. - // If there are no more results, nextPageToken is empty and err is nil. - InternalFetch func(pageSize int, pageToken string) (results []*monitoringpb.UptimeCheckIp, nextPageToken string, err error) -} - -// PageInfo supports pagination. See the google.golang.org/api/iterator package for details. -func (it *UptimeCheckIpIterator) PageInfo() *iterator.PageInfo { - return it.pageInfo -} - -// Next returns the next result. Its second return value is iterator.Done if there are no more -// results. Once Next returns Done, all subsequent calls will return Done. -func (it *UptimeCheckIpIterator) Next() (*monitoringpb.UptimeCheckIp, error) { - var item *monitoringpb.UptimeCheckIp - if err := it.nextFunc(); err != nil { - return item, err - } - item = it.items[0] - it.items = it.items[1:] - return item, nil -} - -func (it *UptimeCheckIpIterator) bufLen() int { - return len(it.items) -} - -func (it *UptimeCheckIpIterator) takeBuf() interface{} { - b := it.items - it.items = nil - return b -} diff --git a/vendor/cloud.google.com/go/trace/apiv2/doc.go b/vendor/cloud.google.com/go/trace/apiv2/doc.go deleted file mode 100644 index 51d277833..000000000 --- a/vendor/cloud.google.com/go/trace/apiv2/doc.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by gapic-generator. DO NOT EDIT. - -// Package trace is an auto-generated package for the -// Stackdriver Trace API. -// -// NOTE: This package is in alpha. It is not stable, and is likely to change. -// -// Sends application trace data to Stackdriver Trace for viewing. Trace data -// is -// collected for all App Engine applications by default. Trace data from -// other -// applications can be provided using this API. -// -// Use of Context -// -// The ctx passed to NewClient is used for authentication requests and -// for creating the underlying connection, but is not used for subsequent calls. -// Individual methods on the client use the ctx given to them. -// -// To close the open connection, use the Close() method. -// -// For information about setting deadlines, reusing contexts, and more -// please visit godoc.org/cloud.google.com/go. -package trace // import "cloud.google.com/go/trace/apiv2" - -import ( - "context" - "runtime" - "strings" - "unicode" - - "google.golang.org/grpc/metadata" -) - -func insertMetadata(ctx context.Context, mds ...metadata.MD) context.Context { - out, _ := metadata.FromOutgoingContext(ctx) - out = out.Copy() - for _, md := range mds { - for k, v := range md { - out[k] = append(out[k], v...) - } - } - return metadata.NewOutgoingContext(ctx, out) -} - -// DefaultAuthScopes reports the default set of authentication scopes to use with this package. -func DefaultAuthScopes() []string { - return []string{ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/trace.append", - } -} - -// versionGo returns the Go runtime version. The returned string -// has no whitespace, suitable for reporting in header. -func versionGo() string { - const develPrefix = "devel +" - - s := runtime.Version() - if strings.HasPrefix(s, develPrefix) { - s = s[len(develPrefix):] - if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 { - s = s[:p] - } - return s - } - - notSemverRune := func(r rune) bool { - return strings.IndexRune("0123456789.", r) < 0 - } - - if strings.HasPrefix(s, "go1") { - s = s[2:] - var prerelease string - if p := strings.IndexFunc(s, notSemverRune); p >= 0 { - s, prerelease = s[:p], s[p:] - } - if strings.HasSuffix(s, ".") { - s += "0" - } else if strings.Count(s, ".") < 2 { - s += ".0" - } - if prerelease != "" { - s += "-" + prerelease - } - return s - } - return "UNKNOWN" -} - -const versionClient = "20190819" diff --git a/vendor/cloud.google.com/go/trace/apiv2/path_funcs.go b/vendor/cloud.google.com/go/trace/apiv2/path_funcs.go deleted file mode 100644 index 80b8d40b5..000000000 --- a/vendor/cloud.google.com/go/trace/apiv2/path_funcs.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package trace - -// ProjectPath returns the path for the project resource. -// -// Deprecated: Use -// fmt.Sprintf("projects/%s", project) -// instead. -func ProjectPath(project string) string { - return "" + - "projects/" + - project + - "" -} - -// SpanPath returns the path for the span resource. -// -// Deprecated: Use -// fmt.Sprintf("projects/%s/traces/%s/spans/%s", project, trace, span) -// instead. -func SpanPath(project, trace, span string) string { - return "" + - "projects/" + - project + - "/traces/" + - trace + - "/spans/" + - span + - "" -} diff --git a/vendor/cloud.google.com/go/trace/apiv2/trace_client.go b/vendor/cloud.google.com/go/trace/apiv2/trace_client.go deleted file mode 100644 index f1cd45236..000000000 --- a/vendor/cloud.google.com/go/trace/apiv2/trace_client.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Code generated by gapic-generator. DO NOT EDIT. - -package trace - -import ( - "context" - "fmt" - "math" - "net/url" - "time" - - gax "github.com/googleapis/gax-go/v2" - "google.golang.org/api/option" - "google.golang.org/api/transport" - cloudtracepb "google.golang.org/genproto/googleapis/devtools/cloudtrace/v2" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" -) - -// CallOptions contains the retry settings for each method of Client. -type CallOptions struct { - BatchWriteSpans []gax.CallOption - CreateSpan []gax.CallOption -} - -func defaultClientOptions() []option.ClientOption { - return []option.ClientOption{ - option.WithEndpoint("cloudtrace.googleapis.com:443"), - option.WithScopes(DefaultAuthScopes()...), - option.WithGRPCDialOption(grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(math.MaxInt32))), - } -} - -func defaultCallOptions() *CallOptions { - retry := map[[2]string][]gax.CallOption{ - {"default", "idempotent"}: { - gax.WithRetry(func() gax.Retryer { - return gax.OnCodes([]codes.Code{ - codes.DeadlineExceeded, - codes.Unavailable, - }, gax.Backoff{ - Initial: 100 * time.Millisecond, - Max: 1000 * time.Millisecond, - Multiplier: 1.2, - }) - }), - }, - } - return &CallOptions{ - BatchWriteSpans: retry[[2]string{"default", "non_idempotent"}], - CreateSpan: retry[[2]string{"default", "idempotent"}], - } -} - -// Client is a client for interacting with Stackdriver Trace API. -// -// Methods, except Close, may be called concurrently. However, fields must not be modified concurrently with method calls. -type Client struct { - // The connection to the service. - conn *grpc.ClientConn - - // The gRPC API client. - client cloudtracepb.TraceServiceClient - - // The call options for this service. - CallOptions *CallOptions - - // The x-goog-* metadata to be sent with each request. - xGoogMetadata metadata.MD -} - -// NewClient creates a new trace service client. -// -// This file describes an API for collecting and viewing traces and spans -// within a trace. A Trace is a collection of spans corresponding to a single -// operation or set of operations for an application. A span is an individual -// timed event which forms a node of the trace tree. A single trace may -// contain span(s) from multiple services. -func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) { - conn, err := transport.DialGRPC(ctx, append(defaultClientOptions(), opts...)...) - if err != nil { - return nil, err - } - c := &Client{ - conn: conn, - CallOptions: defaultCallOptions(), - - client: cloudtracepb.NewTraceServiceClient(conn), - } - c.setGoogleClientInfo() - return c, nil -} - -// Connection returns the client's connection to the API service. -func (c *Client) Connection() *grpc.ClientConn { - return c.conn -} - -// Close closes the connection to the API service. The user should invoke this when -// the client is no longer required. -func (c *Client) Close() error { - return c.conn.Close() -} - -// setGoogleClientInfo sets the name and version of the application in -// the `x-goog-api-client` header passed on each request. Intended for -// use by Google-written clients. -func (c *Client) setGoogleClientInfo(keyval ...string) { - kv := append([]string{"gl-go", versionGo()}, keyval...) - kv = append(kv, "gapic", versionClient, "gax", gax.Version, "grpc", grpc.Version) - c.xGoogMetadata = metadata.Pairs("x-goog-api-client", gax.XGoogHeader(kv...)) -} - -// BatchWriteSpans sends new spans to new or existing traces. You cannot update -// existing spans. -func (c *Client) BatchWriteSpans(ctx context.Context, req *cloudtracepb.BatchWriteSpansRequest, opts ...gax.CallOption) error { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.BatchWriteSpans[0:len(c.CallOptions.BatchWriteSpans):len(c.CallOptions.BatchWriteSpans)], opts...) - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - _, err = c.client.BatchWriteSpans(ctx, req, settings.GRPC...) - return err - }, opts...) - return err -} - -// CreateSpan creates a new span. -func (c *Client) CreateSpan(ctx context.Context, req *cloudtracepb.Span, opts ...gax.CallOption) (*cloudtracepb.Span, error) { - md := metadata.Pairs("x-goog-request-params", fmt.Sprintf("%s=%v", "name", url.QueryEscape(req.GetName()))) - ctx = insertMetadata(ctx, c.xGoogMetadata, md) - opts = append(c.CallOptions.CreateSpan[0:len(c.CallOptions.CreateSpan):len(c.CallOptions.CreateSpan)], opts...) - var resp *cloudtracepb.Span - err := gax.Invoke(ctx, func(ctx context.Context, settings gax.CallSettings) error { - var err error - resp, err = c.client.CreateSpan(ctx, req, settings.GRPC...) - return err - }, opts...) - if err != nil { - return nil, err - } - return resp, nil -} diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/.gitignore b/vendor/contrib.go.opencensus.io/exporter/prometheus/.gitignore deleted file mode 100644 index 85e7c1dfc..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/prometheus/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/.idea/ diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/.travis.yml b/vendor/contrib.go.opencensus.io/exporter/prometheus/.travis.yml deleted file mode 100644 index 957a893db..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/prometheus/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -language: go - -go_import_path: contrib.go.opencensus.io - -go: - - 1.11.x - -env: - global: - GO111MODULE=on - -before_script: - - make install-tools - -script: - - make travis-ci - diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/Makefile b/vendor/contrib.go.opencensus.io/exporter/prometheus/Makefile deleted file mode 100644 index 2e11d225c..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/prometheus/Makefile +++ /dev/null @@ -1,95 +0,0 @@ -# TODO: Fix this on windows. -ALL_SRC := $(shell find . -name '*.go' \ - -not -path './vendor/*' \ - -not -path '*/gen-go/*' \ - -type f | sort) -ALL_PKGS := $(shell go list $(sort $(dir $(ALL_SRC)))) - -GOTEST_OPT?=-v -race -timeout 30s -GOTEST_OPT_WITH_COVERAGE = $(GOTEST_OPT) -coverprofile=coverage.txt -covermode=atomic -GOTEST=go test -GOFMT=gofmt -GOLINT=golint -GOVET=go vet -EMBEDMD=embedmd -# TODO decide if we need to change these names. -README_FILES := $(shell find . -name '*README.md' | sort | tr '\n' ' ') - - -.DEFAULT_GOAL := fmt-lint-vet-embedmd-test - -.PHONY: fmt-lint-vet-embedmd-test -fmt-lint-vet-embedmd-test: fmt lint vet embedmd test - -# TODO enable test-with-coverage in tavis -.PHONY: travis-ci -travis-ci: fmt lint vet embedmd test test-386 - -all-pkgs: - @echo $(ALL_PKGS) | tr ' ' '\n' | sort - -all-srcs: - @echo $(ALL_SRC) | tr ' ' '\n' | sort - -.PHONY: test -test: - $(GOTEST) $(GOTEST_OPT) $(ALL_PKGS) - -.PHONY: test-386 -test-386: - GOARCH=386 $(GOTEST) -v -timeout 30s $(ALL_PKGS) - -.PHONY: test-with-coverage -test-with-coverage: - $(GOTEST) $(GOTEST_OPT_WITH_COVERAGE) $(ALL_PKGS) - -.PHONY: fmt -fmt: - @FMTOUT=`$(GOFMT) -s -l $(ALL_SRC) 2>&1`; \ - if [ "$$FMTOUT" ]; then \ - echo "$(GOFMT) FAILED => gofmt the following files:\n"; \ - echo "$$FMTOUT\n"; \ - exit 1; \ - else \ - echo "Fmt finished successfully"; \ - fi - -.PHONY: lint -lint: - @LINTOUT=`$(GOLINT) $(ALL_PKGS) 2>&1`; \ - if [ "$$LINTOUT" ]; then \ - echo "$(GOLINT) FAILED => clean the following lint errors:\n"; \ - echo "$$LINTOUT\n"; \ - exit 1; \ - else \ - echo "Lint finished successfully"; \ - fi - -.PHONY: vet -vet: - # TODO: Understand why go vet downloads "github.com/google/go-cmp v0.2.0" - @VETOUT=`$(GOVET) ./... | grep -v "go: downloading" 2>&1`; \ - if [ "$$VETOUT" ]; then \ - echo "$(GOVET) FAILED => go vet the following files:\n"; \ - echo "$$VETOUT\n"; \ - exit 1; \ - else \ - echo "Vet finished successfully"; \ - fi - -.PHONY: embedmd -embedmd: - @EMBEDMDOUT=`$(EMBEDMD) -d $(README_FILES) 2>&1`; \ - if [ "$$EMBEDMDOUT" ]; then \ - echo "$(EMBEDMD) FAILED => embedmd the following files:\n"; \ - echo "$$EMBEDMDOUT\n"; \ - exit 1; \ - else \ - echo "Embedmd finished successfully"; \ - fi - -.PHONY: install-tools -install-tools: - go get -u golang.org/x/tools/cmd/cover - go get -u golang.org/x/lint/golint - go get -u github.com/rakyll/embedmd diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/README.md b/vendor/contrib.go.opencensus.io/exporter/prometheus/README.md deleted file mode 100644 index 3a9c5d3c8..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/prometheus/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# OpenCensus Go Prometheus Exporter - -[![Build Status](https://travis-ci.org/census-ecosystem/opencensus-go-exporter-prometheus.svg?branch=master)](https://travis-ci.org/census-ecosystem/opencensus-go-exporter-prometheus) [![GoDoc][godoc-image]][godoc-url] - -Provides OpenCensus metrics export support for Prometheus. - -## Installation - -``` -$ go get -u contrib.go.opencensus.io/exporter/prometheus -``` - -[godoc-image]: https://godoc.org/contrib.go.opencensus.io/exporter/prometheus?status.svg -[godoc-url]: https://godoc.org/contrib.go.opencensus.io/exporter/prometheus diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/go.mod b/vendor/contrib.go.opencensus.io/exporter/prometheus/go.mod deleted file mode 100644 index af78dfba2..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/prometheus/go.mod +++ /dev/null @@ -1,6 +0,0 @@ -module contrib.go.opencensus.io/exporter/prometheus - -require ( - github.com/prometheus/client_golang v0.9.2 - go.opencensus.io v0.21.0 -) diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/go.sum b/vendor/contrib.go.opencensus.io/exporter/prometheus/go.sum deleted file mode 100644 index 9eba12a55..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/prometheus/go.sum +++ /dev/null @@ -1,51 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/prometheus.go b/vendor/contrib.go.opencensus.io/exporter/prometheus/prometheus.go deleted file mode 100644 index 59ce1c0a3..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/prometheus/prometheus.go +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package prometheus contains a Prometheus exporter that supports exporting -// OpenCensus views as Prometheus metrics. -package prometheus // import "contrib.go.opencensus.io/exporter/prometheus" - -import ( - "fmt" - "log" - "net/http" - "sync" - - "context" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" - "go.opencensus.io/metric/metricdata" - "go.opencensus.io/metric/metricexport" - "go.opencensus.io/stats/view" -) - -// Exporter exports stats to Prometheus, users need -// to register the exporter as an http.Handler to be -// able to export. -type Exporter struct { - opts Options - g prometheus.Gatherer - c *collector - handler http.Handler -} - -// Options contains options for configuring the exporter. -type Options struct { - Namespace string - Registry *prometheus.Registry - OnError func(err error) - ConstLabels prometheus.Labels // ConstLabels will be set as labels on all views. -} - -// NewExporter returns an exporter that exports stats to Prometheus. -func NewExporter(o Options) (*Exporter, error) { - if o.Registry == nil { - o.Registry = prometheus.NewRegistry() - } - collector := newCollector(o, o.Registry) - e := &Exporter{ - opts: o, - g: o.Registry, - c: collector, - handler: promhttp.HandlerFor(o.Registry, promhttp.HandlerOpts{}), - } - collector.ensureRegisteredOnce() - - return e, nil -} - -var _ http.Handler = (*Exporter)(nil) - -// ensureRegisteredOnce invokes reg.Register on the collector itself -// exactly once to ensure that we don't get errors such as -// cannot register the collector: descriptor Desc{fqName: *} -// already exists with the same fully-qualified name and const label values -// which is documented by Prometheus at -// https://github.com/prometheus/client_golang/blob/fcc130e101e76c5d303513d0e28f4b6d732845c7/prometheus/registry.go#L89-L101 -func (c *collector) ensureRegisteredOnce() { - c.registerOnce.Do(func() { - if err := c.reg.Register(c); err != nil { - c.opts.onError(fmt.Errorf("cannot register the collector: %v", err)) - } - }) - -} - -func (o *Options) onError(err error) { - if o.OnError != nil { - o.OnError(err) - } else { - log.Printf("Failed to export to Prometheus: %v", err) - } -} - -// ExportView exports to the Prometheus if view data has one or more rows. -// Each OpenCensus AggregationData will be converted to -// corresponding Prometheus Metric: SumData will be converted -// to Untyped Metric, CountData will be a Counter Metric, -// DistributionData will be a Histogram Metric. -// Deprecated in lieu of metricexport.Reader interface. -func (e *Exporter) ExportView(vd *view.Data) { -} - -// ServeHTTP serves the Prometheus endpoint. -func (e *Exporter) ServeHTTP(w http.ResponseWriter, r *http.Request) { - e.handler.ServeHTTP(w, r) -} - -// collector implements prometheus.Collector -type collector struct { - opts Options - mu sync.Mutex // mu guards all the fields. - - registerOnce sync.Once - - // reg helps collector register views dynamically. - reg *prometheus.Registry - - // reader reads metrics from all registered producers. - reader *metricexport.Reader -} - -func (c *collector) Describe(ch chan<- *prometheus.Desc) { - de := &descExporter{c: c, descCh: ch} - c.reader.ReadAndExport(de) -} - -// Collect fetches the statistics from OpenCensus -// and delivers them as Prometheus Metrics. -// Collect is invoked every time a prometheus.Gatherer is run -// for example when the HTTP endpoint is invoked by Prometheus. -func (c *collector) Collect(ch chan<- prometheus.Metric) { - me := &metricExporter{c: c, metricCh: ch} - c.reader.ReadAndExport(me) -} - -func newCollector(opts Options, registrar *prometheus.Registry) *collector { - return &collector{ - reg: registrar, - opts: opts, - reader: metricexport.NewReader()} -} - -func (c *collector) toDesc(metric *metricdata.Metric) *prometheus.Desc { - return prometheus.NewDesc( - metricName(c.opts.Namespace, metric), - metric.Descriptor.Description, - toPromLabels(metric.Descriptor.LabelKeys), - c.opts.ConstLabels) -} - -type metricExporter struct { - c *collector - metricCh chan<- prometheus.Metric -} - -// ExportMetrics exports to the Prometheus. -// Each OpenCensus Metric will be converted to -// corresponding Prometheus Metric: -// TypeCumulativeInt64 and TypeCumulativeFloat64 will be a Counter Metric, -// TypeCumulativeDistribution will be a Histogram Metric. -// TypeGaugeFloat64 and TypeGaugeInt64 will be a Gauge Metric -func (me *metricExporter) ExportMetrics(ctx context.Context, metrics []*metricdata.Metric) error { - for _, metric := range metrics { - desc := me.c.toDesc(metric) - for _, ts := range metric.TimeSeries { - tvs := toLabelValues(ts.LabelValues) - for _, point := range ts.Points { - metric, err := toPromMetric(desc, metric, point, tvs) - if err != nil { - me.c.opts.onError(err) - } else if metric != nil { - me.metricCh <- metric - } - } - } - } - return nil -} - -type descExporter struct { - c *collector - descCh chan<- *prometheus.Desc -} - -// ExportMetrics exports descriptor to the Prometheus. -// It is invoked when request to scrape descriptors is received. -func (me *descExporter) ExportMetrics(ctx context.Context, metrics []*metricdata.Metric) error { - for _, metric := range metrics { - desc := me.c.toDesc(metric) - me.descCh <- desc - } - return nil -} - -func toPromLabels(mls []metricdata.LabelKey) (labels []string) { - for _, ml := range mls { - labels = append(labels, sanitize(ml.Key)) - } - return labels -} - -func metricName(namespace string, m *metricdata.Metric) string { - var name string - if namespace != "" { - name = namespace + "_" - } - return name + sanitize(m.Descriptor.Name) -} - -func toPromMetric( - desc *prometheus.Desc, - metric *metricdata.Metric, - point metricdata.Point, - labelValues []string) (prometheus.Metric, error) { - switch metric.Descriptor.Type { - case metricdata.TypeCumulativeFloat64, metricdata.TypeCumulativeInt64: - pv, err := toPromValue(point) - if err != nil { - return nil, err - } - return prometheus.NewConstMetric(desc, prometheus.CounterValue, pv, labelValues...) - - case metricdata.TypeGaugeFloat64, metricdata.TypeGaugeInt64: - pv, err := toPromValue(point) - if err != nil { - return nil, err - } - return prometheus.NewConstMetric(desc, prometheus.GaugeValue, pv, labelValues...) - - case metricdata.TypeCumulativeDistribution: - switch v := point.Value.(type) { - case *metricdata.Distribution: - points := make(map[float64]uint64) - // Histograms are cumulative in Prometheus. - // Get cumulative bucket counts. - cumCount := uint64(0) - for i, b := range v.BucketOptions.Bounds { - cumCount += uint64(v.Buckets[i].Count) - points[b] = cumCount - } - return prometheus.NewConstHistogram(desc, uint64(v.Count), v.Sum, points, labelValues...) - default: - return nil, typeMismatchError(point) - } - case metricdata.TypeSummary: - // TODO: [rghetia] add support for TypeSummary. - return nil, nil - default: - return nil, fmt.Errorf("aggregation %T is not yet supported", metric.Descriptor.Type) - } -} - -func toLabelValues(labelValues []metricdata.LabelValue) (values []string) { - for _, lv := range labelValues { - if lv.Present { - values = append(values, lv.Value) - } else { - values = append(values, "") - } - } - return values -} - -func typeMismatchError(point metricdata.Point) error { - return fmt.Errorf("point type %T does not match metric type", point) - -} - -func toPromValue(point metricdata.Point) (float64, error) { - switch v := point.Value.(type) { - case float64: - return v, nil - case int64: - return float64(v), nil - default: - return 0.0, typeMismatchError(point) - } -} diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/sanitize.go b/vendor/contrib.go.opencensus.io/exporter/prometheus/sanitize.go deleted file mode 100644 index ed6d8a14d..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/prometheus/sanitize.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "strings" - "unicode" -) - -const labelKeySizeLimit = 100 - -// sanitize returns a string that is trunacated to 100 characters if it's too -// long, and replaces non-alphanumeric characters to underscores. -func sanitize(s string) string { - if len(s) == 0 { - return s - } - if len(s) > labelKeySizeLimit { - s = s[:labelKeySizeLimit] - } - s = strings.Map(sanitizeRune, s) - if unicode.IsDigit(rune(s[0])) { - s = "key_" + s - } - if s[0] == '_' { - s = "key" + s - } - return s -} - -// converts anything that is not a letter or digit to an underscore -func sanitizeRune(r rune) rune { - if unicode.IsLetter(r) || unicode.IsDigit(r) { - return r - } - // Everything else turns into an underscore - return '_' -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/.gitignore b/vendor/contrib.go.opencensus.io/exporter/stackdriver/.gitignore deleted file mode 100644 index c5a54149f..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -# GoLand IDEA -/.idea/ -*.iml - -# VS Code -.vscode - -# Coverage -coverage.txt -coverage.html diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/.travis.yml b/vendor/contrib.go.opencensus.io/exporter/stackdriver/.travis.yml deleted file mode 100644 index 7da944112..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -language: go - -go: - - 1.12.x - -go_import_path: contrib.go.opencensus.io/exporter/stackdriver - -env: - global: - GO111MODULE=on - -install: - - go mod download - - make install-tools - -script: - - make travis-ci - -after_success: - - bash <(curl -s https://codecov.io/bash) \ No newline at end of file diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/AUTHORS b/vendor/contrib.go.opencensus.io/exporter/stackdriver/AUTHORS deleted file mode 100644 index e491a9e7f..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Google Inc. diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/CONTRIBUTING.md b/vendor/contrib.go.opencensus.io/exporter/stackdriver/CONTRIBUTING.md deleted file mode 100644 index 0786fdf43..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/CONTRIBUTING.md +++ /dev/null @@ -1,24 +0,0 @@ -# How to contribute - -We'd love to accept your patches and contributions to this project. There are -just a few small guidelines you need to follow. - -## Contributor License Agreement - -Contributions to this project must be accompanied by a Contributor License -Agreement. You (or your employer) retain the copyright to your contribution, -this simply gives us permission to use and redistribute your contributions as -part of the project. Head over to to see -your current agreements on file or to sign a new one. - -You generally only need to submit a CLA once, so if you've already submitted one -(even if it was for a different project), you probably don't need to do it -again. - -## Code reviews - -All submissions, including submissions by project members, require review. We -use GitHub pull requests for this purpose. Consult [GitHub Help] for more -information on using pull requests. - -[GitHub Help]: https://help.github.com/articles/about-pull-requests/ diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/LICENSE b/vendor/contrib.go.opencensus.io/exporter/stackdriver/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/Makefile b/vendor/contrib.go.opencensus.io/exporter/stackdriver/Makefile deleted file mode 100644 index cc0818596..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/Makefile +++ /dev/null @@ -1,125 +0,0 @@ -# TODO: Fix this on windows. -ALL_SRC := $(shell find . -name '*.go' \ - -not -path '*/internal/testpb/*' \ - -not -name 'tools.go' \ - -type f | sort) -ALL_PKGS := $(shell go list $(sort $(dir $(ALL_SRC)))) - -GOTEST_OPT?=-v -race -timeout 30s -GOTEST_OPT_WITH_COVERAGE = $(GOTEST_OPT) -coverprofile=coverage.txt -covermode=atomic -GOTEST=go test -GOFMT=gofmt -GOLINT=golint -GOIMPORTS=goimports -GOVET=go vet -EMBEDMD=embedmd -STATICCHECK=staticcheck -# TODO decide if we need to change these names. -README_FILES := $(shell find . -name '*README.md' | sort | tr '\n' ' ') - -.DEFAULT_GOAL := defaul-goal - -.PHONY: defaul-goal -defaul-goal: fmt lint vet embedmd goimports staticcheck test - -# TODO: enable test-with-cover when find out why "scripts/check-test-files.sh: 4: set: Illegal option -o pipefail" -.PHONY: travis-ci -travis-ci: fmt lint vet embedmd goimports staticcheck test test-386 test-with-coverage - -all-pkgs: - @echo $(ALL_PKGS) | tr ' ' '\n' | sort - -all-srcs: - @echo $(ALL_SRC) | tr ' ' '\n' | sort - -.PHONY: test -test: - $(GOTEST) $(GOTEST_OPT) $(ALL_PKGS) - -.PHONY: test-386 -test-386: - GOARCH=386 $(GOTEST) -v -timeout 30s $(ALL_PKGS) - -.PHONY: test-with-coverage -test-with-coverage: - @echo pre-compiling tests - @time go test -i $(ALL_PKGS) - $(GOTEST) $(GOTEST_OPT_WITH_COVERAGE) $(ALL_PKGS) - go tool cover -html=coverage.txt -o coverage.html - -.PHONY: test-with-cover -test-with-cover: - @echo Verifying that all packages have test files to count in coverage - @scripts/check-test-files.sh $(subst contrib.go.opencensus.io/exporter/stackdriver,./,$(ALL_PKGS)) - @echo pre-compiling tests - @time go test -i $(ALL_PKGS) - $(GOTEST) $(GOTEST_OPT_WITH_COVERAGE) $(ALL_PKGS) - go tool cover -html=coverage.txt -o coverage.html - -.PHONY: fmt -fmt: - @FMTOUT=`$(GOFMT) -s -l $(ALL_SRC) 2>&1`; \ - if [ "$$FMTOUT" ]; then \ - echo "$(GOFMT) FAILED => gofmt the following files:\n"; \ - echo "$$FMTOUT\n"; \ - exit 1; \ - else \ - echo "Fmt finished successfully"; \ - fi - -.PHONY: lint -lint: - @LINTOUT=`$(GOLINT) $(ALL_PKGS) 2>&1`; \ - if [ "$$LINTOUT" ]; then \ - echo "$(GOLINT) FAILED => clean the following lint errors:\n"; \ - echo "$$LINTOUT\n"; \ - exit 1; \ - else \ - echo "Lint finished successfully"; \ - fi - -.PHONY: vet -vet: - # TODO: Understand why go vet downloads "github.com/google/go-cmp v0.2.0" - @VETOUT=`$(GOVET) ./... | grep -v "go: downloading" 2>&1`; \ - if [ "$$VETOUT" ]; then \ - echo "$(GOVET) FAILED => go vet the following files:\n"; \ - echo "$$VETOUT\n"; \ - exit 1; \ - else \ - echo "Vet finished successfully"; \ - fi - -.PHONY: embedmd -embedmd: - @EMBEDMDOUT=`$(EMBEDMD) -d $(README_FILES) 2>&1`; \ - if [ "$$EMBEDMDOUT" ]; then \ - echo "$(EMBEDMD) FAILED => embedmd the following files:\n"; \ - echo "$$EMBEDMDOUT\n"; \ - exit 1; \ - else \ - echo "Embedmd finished successfully"; \ - fi - -.PHONY: goimports -goimports: - @IMPORTSOUT=`$(GOIMPORTS) -d . 2>&1`; \ - if [ "$$IMPORTSOUT" ]; then \ - echo "$(GOIMPORTS) FAILED => fix the following goimports errors:\n"; \ - echo "$$IMPORTSOUT\n"; \ - exit 1; \ - else \ - echo "Goimports finished successfully"; \ - fi - -.PHONY: staticcheck -staticcheck: - $(STATICCHECK) ./... - -.PHONY: install-tools -install-tools: - GO111MODULE=on go install \ - golang.org/x/lint/golint \ - golang.org/x/tools/cmd/goimports \ - github.com/rakyll/embedmd \ - honnef.co/go/tools/cmd/staticcheck diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/README.md b/vendor/contrib.go.opencensus.io/exporter/stackdriver/README.md deleted file mode 100644 index 24a6e11f9..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# OpenCensus Go Stackdriver - -[![Build Status](https://travis-ci.org/census-ecosystem/opencensus-go-exporter-stackdriver.svg?branch=master)](https://travis-ci.org/census-ecosystem/opencensus-go-exporter-stackdriver) [![GoDoc][godoc-image]][godoc-url] - -Provides OpenCensus exporter support for Stackdriver Monitoring and Stackdriver Trace. - -## Installation - -``` -$ go get -u contrib.go.opencensus.io/exporter/stackdriver -``` - -[godoc-image]: https://godoc.org/contrib.go.opencensus.io/exporter/stackdriver?status.svg -[godoc-url]: https://godoc.org/contrib.go.opencensus.io/exporter/stackdriver diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/RESOURCE.md b/vendor/contrib.go.opencensus.io/exporter/stackdriver/RESOURCE.md deleted file mode 100644 index 9154b99ed..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/RESOURCE.md +++ /dev/null @@ -1,53 +0,0 @@ -# RESOURCES - -Stackdriver has defined [resource types](https://cloud.google.com/monitoring/api/resources) for monitoring and for each resource type there -are mandatory resource labels. OpenCensus has defined [standard resource](https://github.com/census-instrumentation/opencensus-specs/blob/master/resource/StandardResources.md) -types and labels. -This document describes the translation from OpenCensus resources to Stackdriver resources -performed by this exporter. - -## Mapping between Stackdriver and OpenCensus Resources - -### k8s_container - -**condition:** resource.type == container - -*k8s_container takes a precedence, so GKE will be mapped to k8s_container and its -associated resource labels but it will not contain any gcp_instance specific -resource labels.* - - -| Item | OpenCensus | Stackdriver | -|---------------------|--------------------|----------------| -| **resource type** | container | k8s_container | -| **resource labels** | | | -| | cloud.zone | location | -| | k8s.cluster.name | cluster_name | -| | k8s.namespace.name | namespace_name | -| | k8s.pod.name | pod_name | -| | container.name | container_name | - - -### gcp_instance -**condition:** cloud.provider == gcp - -| Item | OpenCensus | Stackdriver | -|---------------------|--------------------|----------------| -| **resource type** | cloud | gcp_instance | -| **resource labels** | | | -| | host.id | instance_id | -| | cloud.zone | zone | - - -### aws_ec2_instance -**condition:** cloud.provider == aws - -| Item | OpenCensus | Stackdriver | -|---------------------|--------------------|------------------| -| **resource type** | | | -| | cloud | aws_ec2_instance | -| **resource labels** | | | -| | host.id | instance_id | -| | cloud.region | region | -| | cloud.account.id | aws_account | - diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/go.mod b/vendor/contrib.go.opencensus.io/exporter/stackdriver/go.mod deleted file mode 100644 index 1784463ba..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/go.mod +++ /dev/null @@ -1,21 +0,0 @@ -module contrib.go.opencensus.io/exporter/stackdriver - -require ( - cloud.google.com/go v0.43.0 - github.com/aws/aws-sdk-go v1.22.1 - github.com/census-instrumentation/opencensus-proto v0.2.1 - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/gogo/protobuf v1.3.0 - github.com/golang/protobuf v1.3.2 - github.com/google/addlicense v0.0.0-20190510175307-22550fa7c1b0 // indirect - github.com/google/go-cmp v0.3.1 - github.com/hashicorp/golang-lru v0.5.3 // indirect - github.com/stretchr/testify v1.3.0 // indirect - go.opencensus.io v0.22.0 - golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 - golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 - golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa // indirect - google.golang.org/api v0.7.0 - google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64 - google.golang.org/grpc v1.22.1 -) diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/go.sum b/vendor/contrib.go.opencensus.io/exporter/stackdriver/go.sum deleted file mode 100644 index 5e08a17be..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/go.sum +++ /dev/null @@ -1,179 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.43.0 h1:banaiRPAM8kUVYneOSkhgcDsLzEvL25FinuiSZaH/2w= -cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/aws/aws-sdk-go v1.22.1 h1://WJvJi9iq/i5TWHuK3hIC23xCZYH7Qv7SIN2vZVqxY= -github.com/aws/aws-sdk-go v1.22.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gogo/protobuf v1.3.0 h1:G8O7TerXerS4F6sx9OV7/nRfJdnXgHZu/S/7F2SN+UE= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/addlicense v0.0.0-20190510175307-22550fa7c1b0 h1:ydbHzabf84uucKri5fcfiqYxGg+rYgP/zQfLLN8lyP0= -github.com/google/addlicense v0.0.0-20190510175307-22550fa7c1b0/go.mod h1:QtPG26W17m+OIQgE6gQ24gC1M6pUaMBAbFrTIDtwG/E= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/protobuf v3.9.1+incompatible h1:8oCWqzcHmpI7oK4A2LT3qpYu6SEFRFDECpCtpCWumDU= -github.com/googleapis/gax-go/v2 v2.0.4 h1:hU4mGcQI4DaAYW+IbTun+2qEZVFxK0ySjQLTbS0VQKc= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rakyll/embedmd v0.0.0-20171029212350-c8060a0752a2 h1:1jfy6i1g66ijpffgfaF/7pIFYZnSZzvo9P9DFkFmRIM= -github.com/rakyll/embedmd v0.0.0-20171029212350-c8060a0752a2/go.mod h1:7jOTMgqac46PZcF54q6l2hkLEG8op93fZu61KmxWDV4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422 h1:QzoH/1pFpZguR8NrRHLcO6jKqfv2zpuSqZLgdm7ZmjI= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09 h1:KaQtG+aDELoNmXYas3TVkGNYRuq8JQ1aa7LJt8EXVyo= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa h1:KIDDMLT1O0Nr7TSxp8xM5tJcdn8tgyAONntO829og1M= -golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0 h1:Dh6fw+p6FyRl5x/FvNswO1ji0lIGzm3KP8Y9VkS9PTE= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -google.golang.org/api v0.4.0 h1:KKgc1aqhV8wDPbDzlDtpvyjZFY3vjz85FP7p4wcQUyI= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0 h1:9sdfJOzWlkqPltHAuzT2Cp+yrBeY1KRVYgms8soxMwM= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610 h1:Ygq9/SRJX9+dU0WCIICM8RkWvDw03lvB77hrhJnpxfU= -google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64 h1:iKtrH9Y8mcbADOP0YFaEMth7OfuHY9xHOwNj4znpM1A= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1 h1:/7cs52RnTJmD43s3uxzlq2U7nqVTd/37viQwMrMNlOM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/label.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/label.go deleted file mode 100644 index 88835cc0f..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/label.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package stackdriver - -// Labels represents a set of Stackdriver Monitoring labels. -type Labels struct { - m map[string]labelValue -} - -type labelValue struct { - val, desc string -} - -// Set stores a label with the given key, value and description, -// overwriting any previous values with the given key. -func (labels *Labels) Set(key, value, description string) { - if labels.m == nil { - labels.m = make(map[string]labelValue) - } - labels.m[key] = labelValue{value, description} -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics.go deleted file mode 100644 index d9cddc751..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics.go +++ /dev/null @@ -1,486 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package stackdriver - -/* -The code in this file is responsible for converting OpenCensus Proto metrics -directly to Stackdriver Metrics. -*/ - -import ( - "context" - "fmt" - - "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes/any" - "github.com/golang/protobuf/ptypes/timestamp" - "go.opencensus.io/trace" - - distributionpb "google.golang.org/genproto/googleapis/api/distribution" - labelpb "google.golang.org/genproto/googleapis/api/label" - googlemetricpb "google.golang.org/genproto/googleapis/api/metric" - monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" - monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" - - "go.opencensus.io/metric/metricdata" - "go.opencensus.io/resource" -) - -const ( - exemplarAttachmentTypeString = "type.googleapis.com/google.protobuf.StringValue" - exemplarAttachmentTypeSpanCtx = "type.googleapis.com/google.monitoring.v3.SpanContext" - - // TODO(songy23): add support for this. - // exemplarAttachmentTypeDroppedLabels = "type.googleapis.com/google.monitoring.v3.DroppedLabels" -) - -// ExportMetrics exports OpenCensus Metrics to Stackdriver Monitoring. -func (se *statsExporter) ExportMetrics(ctx context.Context, metrics []*metricdata.Metric) error { - if len(metrics) == 0 { - return nil - } - - for _, metric := range metrics { - se.metricsBundler.Add(metric, 1) - // TODO: [rghetia] handle errors. - } - - return nil -} - -func (se *statsExporter) handleMetricsUpload(metrics []*metricdata.Metric) { - err := se.uploadMetrics(metrics) - if err != nil { - se.o.handleError(err) - } -} - -func (se *statsExporter) uploadMetrics(metrics []*metricdata.Metric) error { - ctx, cancel := newContextWithTimeout(se.o.Context, se.o.Timeout) - defer cancel() - - ctx, span := trace.StartSpan( - ctx, - "contrib.go.opencensus.io/exporter/stackdriver.uploadMetrics", - trace.WithSampler(trace.NeverSample()), - ) - defer span.End() - - for _, metric := range metrics { - // Now create the metric descriptor remotely. - if err := se.createMetricDescriptorFromMetric(ctx, metric); err != nil { - span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) - //TODO: [rghetia] record error metrics. - continue - } - } - - var allTimeSeries []*monitoringpb.TimeSeries - for _, metric := range metrics { - tsl, err := se.metricToMpbTs(ctx, metric) - if err != nil { - span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) - //TODO: [rghetia] record error metrics. - continue - } - if tsl != nil { - allTimeSeries = append(allTimeSeries, tsl...) - } - } - - // Now batch timeseries up and then export. - for start, end := 0, 0; start < len(allTimeSeries); start = end { - end = start + maxTimeSeriesPerUpload - if end > len(allTimeSeries) { - end = len(allTimeSeries) - } - batch := allTimeSeries[start:end] - ctsreql := se.combineTimeSeriesToCreateTimeSeriesRequest(batch) - for _, ctsreq := range ctsreql { - if err := createTimeSeries(ctx, se.c, ctsreq); err != nil { - span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) - // TODO(@rghetia): record error metrics - // return err - } - } - } - - return nil -} - -// metricToMpbTs converts a metric into a list of Stackdriver Monitoring v3 API TimeSeries -// but it doesn't invoke any remote API. -func (se *statsExporter) metricToMpbTs(ctx context.Context, metric *metricdata.Metric) ([]*monitoringpb.TimeSeries, error) { - if metric == nil { - return nil, errNilMetricOrMetricDescriptor - } - - resource := se.metricRscToMpbRsc(metric.Resource) - - metricName := metric.Descriptor.Name - metricType := se.metricTypeFromProto(metricName) - metricLabelKeys := metric.Descriptor.LabelKeys - metricKind, _ := metricDescriptorTypeToMetricKind(metric) - - if metricKind == googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED { - // ignore these Timeserieses. TODO [rghetia] log errors. - return nil, nil - } - - timeSeries := make([]*monitoringpb.TimeSeries, 0, len(metric.TimeSeries)) - for _, ts := range metric.TimeSeries { - sdPoints, err := se.metricTsToMpbPoint(ts, metricKind) - if err != nil { - // TODO(@rghetia): record error metrics - continue - } - - // Each TimeSeries has labelValues which MUST be correlated - // with that from the MetricDescriptor - labels, err := metricLabelsToTsLabels(se.defaultLabels, metricLabelKeys, ts.LabelValues) - if err != nil { - // TODO: (@rghetia) perhaps log this error from labels extraction, if non-nil. - continue - } - timeSeries = append(timeSeries, &monitoringpb.TimeSeries{ - Metric: &googlemetricpb.Metric{ - Type: metricType, - Labels: labels, - }, - Resource: resource, - Points: sdPoints, - }) - } - - return timeSeries, nil -} - -func metricLabelsToTsLabels(defaults map[string]labelValue, labelKeys []metricdata.LabelKey, labelValues []metricdata.LabelValue) (map[string]string, error) { - labels := make(map[string]string) - // Fill in the defaults firstly, irrespective of if the labelKeys and labelValues are mismatched. - for key, label := range defaults { - labels[sanitize(key)] = label.val - } - - // Perform this sanity check now. - if len(labelKeys) != len(labelValues) { - return labels, fmt.Errorf("length mismatch: len(labelKeys)=%d len(labelValues)=%d", len(labelKeys), len(labelValues)) - } - - for i, labelKey := range labelKeys { - labelValue := labelValues[i] - labels[sanitize(labelKey.Key)] = labelValue.Value - } - - return labels, nil -} - -// createMetricDescriptorFromMetric creates a metric descriptor from the OpenCensus metric -// and then creates it remotely using Stackdriver's API. -func (se *statsExporter) createMetricDescriptorFromMetric(ctx context.Context, metric *metricdata.Metric) error { - se.metricMu.Lock() - defer se.metricMu.Unlock() - - name := metric.Descriptor.Name - if _, created := se.metricDescriptors[name]; created { - return nil - } - - // Otherwise, we encountered a cache-miss and - // should create the metric descriptor remotely. - inMD, err := se.metricToMpbMetricDescriptor(metric) - if err != nil { - return err - } - - if builtinMetric(inMD.Type) { - se.metricDescriptors[name] = true - } else { - cmrdesc := &monitoringpb.CreateMetricDescriptorRequest{ - Name: fmt.Sprintf("projects/%s", se.o.ProjectID), - MetricDescriptor: inMD, - } - _, err = createMetricDescriptor(ctx, se.c, cmrdesc) - if err == nil { - // Now record the metric as having been created. - se.metricDescriptors[name] = true - } - } - - return err -} - -func (se *statsExporter) metricToMpbMetricDescriptor(metric *metricdata.Metric) (*googlemetricpb.MetricDescriptor, error) { - if metric == nil { - return nil, errNilMetricOrMetricDescriptor - } - - metricType := se.metricTypeFromProto(metric.Descriptor.Name) - displayName := se.displayName(metric.Descriptor.Name) - metricKind, valueType := metricDescriptorTypeToMetricKind(metric) - - sdm := &googlemetricpb.MetricDescriptor{ - Name: fmt.Sprintf("projects/%s/metricDescriptors/%s", se.o.ProjectID, metricType), - DisplayName: displayName, - Description: metric.Descriptor.Description, - Unit: string(metric.Descriptor.Unit), - Type: metricType, - MetricKind: metricKind, - ValueType: valueType, - Labels: metricLableKeysToLabels(se.defaultLabels, metric.Descriptor.LabelKeys), - } - - return sdm, nil -} - -func metricLableKeysToLabels(defaults map[string]labelValue, labelKeys []metricdata.LabelKey) []*labelpb.LabelDescriptor { - labelDescriptors := make([]*labelpb.LabelDescriptor, 0, len(defaults)+len(labelKeys)) - - // Fill in the defaults first. - for key, lbl := range defaults { - labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ - Key: sanitize(key), - Description: lbl.desc, - ValueType: labelpb.LabelDescriptor_STRING, - }) - } - - // Now fill in those from the metric. - for _, key := range labelKeys { - labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ - Key: sanitize(key.Key), - Description: key.Description, - ValueType: labelpb.LabelDescriptor_STRING, // We only use string tags - }) - } - return labelDescriptors -} - -func metricDescriptorTypeToMetricKind(m *metricdata.Metric) (googlemetricpb.MetricDescriptor_MetricKind, googlemetricpb.MetricDescriptor_ValueType) { - if m == nil { - return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED - } - - switch m.Descriptor.Type { - case metricdata.TypeCumulativeInt64: - return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_INT64 - - case metricdata.TypeCumulativeFloat64: - return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DOUBLE - - case metricdata.TypeCumulativeDistribution: - return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DISTRIBUTION - - case metricdata.TypeGaugeFloat64: - return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DOUBLE - - case metricdata.TypeGaugeInt64: - return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_INT64 - - case metricdata.TypeGaugeDistribution: - return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DISTRIBUTION - - case metricdata.TypeSummary: - // TODO: [rghetia] after upgrading to proto version3, retrun UNRECOGNIZED instead of UNSPECIFIED - return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED - - default: - // TODO: [rghetia] after upgrading to proto version3, retrun UNRECOGNIZED instead of UNSPECIFIED - return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED - } -} - -func (se *statsExporter) metricRscToMpbRsc(rs *resource.Resource) *monitoredrespb.MonitoredResource { - if rs == nil { - resource := se.o.Resource - if resource == nil { - resource = &monitoredrespb.MonitoredResource{ - Type: "global", - } - } - return resource - } - typ := rs.Type - if typ == "" { - typ = "global" - } - mrsp := &monitoredrespb.MonitoredResource{ - Type: typ, - } - if rs.Labels != nil { - mrsp.Labels = make(map[string]string, len(rs.Labels)) - for k, v := range rs.Labels { - // TODO: [rghetia] add mapping between OC Labels and SD Labels. - mrsp.Labels[k] = v - } - } - return mrsp -} - -func (se *statsExporter) metricTsToMpbPoint(ts *metricdata.TimeSeries, metricKind googlemetricpb.MetricDescriptor_MetricKind) (sptl []*monitoringpb.Point, err error) { - for _, pt := range ts.Points { - - // If we have a last value aggregation point i.e. MetricDescriptor_GAUGE - // StartTime should be nil. - startTime := timestampProto(ts.StartTime) - if metricKind == googlemetricpb.MetricDescriptor_GAUGE { - startTime = nil - } - - spt, err := metricPointToMpbPoint(startTime, &pt, se.o.ProjectID) - if err != nil { - return nil, err - } - sptl = append(sptl, spt) - } - return sptl, nil -} - -func metricPointToMpbPoint(startTime *timestamp.Timestamp, pt *metricdata.Point, projectID string) (*monitoringpb.Point, error) { - if pt == nil { - return nil, nil - } - - mptv, err := metricPointToMpbValue(pt, projectID) - if err != nil { - return nil, err - } - - mpt := &monitoringpb.Point{ - Value: mptv, - Interval: &monitoringpb.TimeInterval{ - StartTime: startTime, - EndTime: timestampProto(pt.Time), - }, - } - return mpt, nil -} - -func metricPointToMpbValue(pt *metricdata.Point, projectID string) (*monitoringpb.TypedValue, error) { - if pt == nil { - return nil, nil - } - - var err error - var tval *monitoringpb.TypedValue - switch v := pt.Value.(type) { - default: - err = fmt.Errorf("protoToMetricPoint: unknown Data type: %T", pt.Value) - - case int64: - tval = &monitoringpb.TypedValue{ - Value: &monitoringpb.TypedValue_Int64Value{ - Int64Value: v, - }, - } - - case float64: - tval = &monitoringpb.TypedValue{ - Value: &monitoringpb.TypedValue_DoubleValue{ - DoubleValue: v, - }, - } - - case *metricdata.Distribution: - dv := v - var mv *monitoringpb.TypedValue_DistributionValue - var mean float64 - if dv.Count > 0 { - mean = float64(dv.Sum) / float64(dv.Count) - } - mv = &monitoringpb.TypedValue_DistributionValue{ - DistributionValue: &distributionpb.Distribution{ - Count: dv.Count, - Mean: mean, - SumOfSquaredDeviation: dv.SumOfSquaredDeviation, - }, - } - - insertZeroBound := false - if bopts := dv.BucketOptions; bopts != nil { - insertZeroBound = shouldInsertZeroBound(bopts.Bounds...) - mv.DistributionValue.BucketOptions = &distributionpb.Distribution_BucketOptions{ - Options: &distributionpb.Distribution_BucketOptions_ExplicitBuckets{ - ExplicitBuckets: &distributionpb.Distribution_BucketOptions_Explicit{ - // The first bucket bound should be 0.0 because the Metrics first bucket is - // [0, first_bound) but Stackdriver monitoring bucket bounds begin with -infinity - // (first bucket is (-infinity, 0)) - Bounds: addZeroBoundOnCondition(insertZeroBound, bopts.Bounds...), - }, - }, - } - } - bucketCounts, exemplars := metricBucketToBucketCountsAndExemplars(dv.Buckets, projectID) - mv.DistributionValue.BucketCounts = addZeroBucketCountOnCondition(insertZeroBound, bucketCounts...) - mv.DistributionValue.Exemplars = exemplars - - tval = &monitoringpb.TypedValue{Value: mv} - } - - return tval, err -} - -func metricBucketToBucketCountsAndExemplars(buckets []metricdata.Bucket, projectID string) ([]int64, []*distributionpb.Distribution_Exemplar) { - bucketCounts := make([]int64, len(buckets)) - var exemplars []*distributionpb.Distribution_Exemplar - for i, bucket := range buckets { - bucketCounts[i] = bucket.Count - if bucket.Exemplar != nil { - exemplars = append(exemplars, metricExemplarToPbExemplar(bucket.Exemplar, projectID)) - } - } - return bucketCounts, exemplars -} - -func metricExemplarToPbExemplar(exemplar *metricdata.Exemplar, projectID string) *distributionpb.Distribution_Exemplar { - return &distributionpb.Distribution_Exemplar{ - Value: exemplar.Value, - Timestamp: timestampProto(exemplar.Timestamp), - Attachments: attachmentsToPbAttachments(exemplar.Attachments, projectID), - } -} - -func attachmentsToPbAttachments(attachments metricdata.Attachments, projectID string) []*any.Any { - var pbAttachments []*any.Any - for _, v := range attachments { - if spanCtx, succ := v.(trace.SpanContext); succ { - pbAttachments = append(pbAttachments, toPbSpanCtxAttachment(spanCtx, projectID)) - } else { - // Treat everything else as plain string for now. - // TODO(songy23): add support for dropped label attachments. - pbAttachments = append(pbAttachments, toPbStringAttachment(v)) - } - } - return pbAttachments -} - -func toPbStringAttachment(v interface{}) *any.Any { - s := fmt.Sprintf("%v", v) - return &any.Any{ - TypeUrl: exemplarAttachmentTypeString, - Value: []byte(s), - } -} - -func toPbSpanCtxAttachment(spanCtx trace.SpanContext, projectID string) *any.Any { - pbSpanCtx := monitoringpb.SpanContext{ - SpanName: fmt.Sprintf("projects/%s/traces/%s/spans/%s", projectID, spanCtx.TraceID.String(), spanCtx.SpanID.String()), - } - bytes, _ := proto.Marshal(&pbSpanCtx) - return &any.Any{ - TypeUrl: exemplarAttachmentTypeSpanCtx, - Value: bytes, - } -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_batcher.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_batcher.go deleted file mode 100644 index 921d967bb..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_batcher.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package stackdriver - -import ( - "context" - "fmt" - "strings" - - monitoring "cloud.google.com/go/monitoring/apiv3" - monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" -) - -type metricsBatcher struct { - projectName string - allReqs []*monitoringpb.CreateTimeSeriesRequest - allTss []*monitoringpb.TimeSeries - allErrs []error - // Counts all dropped TimeSeries by this exporter. - droppedTimeSeries int -} - -func newMetricsBatcher(projectID string) *metricsBatcher { - return &metricsBatcher{ - projectName: fmt.Sprintf("projects/%s", projectID), - allTss: make([]*monitoringpb.TimeSeries, 0, maxTimeSeriesPerUpload), - droppedTimeSeries: 0, - } -} - -func (mb *metricsBatcher) recordDroppedTimeseries(numTimeSeries int, err error) { - mb.droppedTimeSeries += numTimeSeries - mb.allErrs = append(mb.allErrs, err) -} - -func (mb *metricsBatcher) addTimeSeries(ts *monitoringpb.TimeSeries) { - mb.allTss = append(mb.allTss, ts) - if len(mb.allTss) == maxTimeSeriesPerUpload { - mb.allReqs = append(mb.allReqs, &monitoringpb.CreateTimeSeriesRequest{ - Name: mb.projectName, - TimeSeries: mb.allTss, - }) - mb.allTss = make([]*monitoringpb.TimeSeries, 0, maxTimeSeriesPerUpload) - } -} - -func (mb *metricsBatcher) export(ctx context.Context, mc *monitoring.MetricClient) { - // Last batch, if any. - if len(mb.allTss) > 0 { - mb.allReqs = append(mb.allReqs, &monitoringpb.CreateTimeSeriesRequest{ - Name: mb.projectName, - TimeSeries: mb.allTss, - }) - } - - // Send create time series requests to Stackdriver. - for _, req := range mb.allReqs { - if err := createTimeSeries(ctx, mc, req); err != nil { - mb.recordDroppedTimeseries(len(req.TimeSeries), err) - } - } -} - -func (mb *metricsBatcher) finalError() error { - numErrors := len(mb.allErrs) - if numErrors == 0 { - return nil - } - - if numErrors == 1 { - return mb.allErrs[0] - } - - errMsgs := make([]string, 0, numErrors) - for _, err := range mb.allErrs { - errMsgs = append(errMsgs, err.Error()) - } - return fmt.Errorf("[%s]", strings.Join(errMsgs, "; ")) -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_proto.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_proto.go deleted file mode 100644 index 10da94c62..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_proto.go +++ /dev/null @@ -1,559 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package stackdriver - -/* -The code in this file is responsible for converting OpenCensus Proto metrics -directly to Stackdriver Metrics. -*/ - -import ( - "context" - "errors" - "fmt" - "path" - "strings" - - "go.opencensus.io/resource" - - commonpb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1" - metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" - resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" - timestamppb "github.com/golang/protobuf/ptypes/timestamp" - distributionpb "google.golang.org/genproto/googleapis/api/distribution" - labelpb "google.golang.org/genproto/googleapis/api/label" - googlemetricpb "google.golang.org/genproto/googleapis/api/metric" - monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" - monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" -) - -var errNilMetricOrMetricDescriptor = errors.New("non-nil metric or metric descriptor") -var percentileLabelKey = &metricspb.LabelKey{ - Key: "percentile", - Description: "the value at a given percentile of a distribution", -} -var globalResource = &resource.Resource{Type: "global"} -var domains = []string{"googleapis.com", "kubernetes.io", "istio.io"} - -// PushMetricsProto exports OpenCensus Metrics Proto to Stackdriver Monitoring synchronously, -// without de-duping or adding proto metrics to the bundler. -func (se *statsExporter) PushMetricsProto(ctx context.Context, node *commonpb.Node, rsc *resourcepb.Resource, metrics []*metricspb.Metric) (int, error) { - if len(metrics) == 0 { - return 0, errNilMetricOrMetricDescriptor - } - - ctx, cancel := newContextWithTimeout(ctx, se.o.Timeout) - defer cancel() - - // Caches the resources seen so far - seenResources := make(map[*resourcepb.Resource]*monitoredrespb.MonitoredResource) - - mb := newMetricsBatcher(se.o.ProjectID) - for _, metric := range metrics { - if len(metric.GetTimeseries()) == 0 { - // No TimeSeries to export, skip this metric. - continue - } - mappedRsc := se.getResource(rsc, metric, seenResources) - if metric.GetMetricDescriptor().GetType() == metricspb.MetricDescriptor_SUMMARY { - summaryMtcs := se.convertSummaryMetrics(metric) - for _, summaryMtc := range summaryMtcs { - if err := se.createMetricDescriptor(ctx, summaryMtc); err != nil { - mb.recordDroppedTimeseries(len(summaryMtc.GetTimeseries()), err) - continue - } - se.protoMetricToTimeSeries(ctx, mappedRsc, summaryMtc, mb) - } - } else { - if err := se.createMetricDescriptor(ctx, metric); err != nil { - mb.recordDroppedTimeseries(len(metric.GetTimeseries()), err) - continue - } - se.protoMetricToTimeSeries(ctx, mappedRsc, metric, mb) - } - } - - mb.export(ctx, se.c) - return mb.droppedTimeSeries, mb.finalError() -} - -func (se *statsExporter) convertSummaryMetrics(summary *metricspb.Metric) []*metricspb.Metric { - var metrics []*metricspb.Metric - var percentileTss []*metricspb.TimeSeries - var countTss []*metricspb.TimeSeries - var sumTss []*metricspb.TimeSeries - - for _, ts := range summary.Timeseries { - lvs := ts.GetLabelValues() - - startTime := ts.StartTimestamp - for _, pt := range ts.GetPoints() { - ptTimestamp := pt.GetTimestamp() - summaryValue := pt.GetSummaryValue() - if summaryValue.Sum != nil { - sumTs := &metricspb.TimeSeries{ - LabelValues: lvs, - StartTimestamp: startTime, - Points: []*metricspb.Point{ - { - Value: &metricspb.Point_DoubleValue{ - DoubleValue: summaryValue.Sum.Value, - }, - Timestamp: ptTimestamp, - }, - }, - } - sumTss = append(sumTss, sumTs) - } - - if summaryValue.Count != nil { - countTs := &metricspb.TimeSeries{ - LabelValues: lvs, - StartTimestamp: startTime, - Points: []*metricspb.Point{ - { - Value: &metricspb.Point_Int64Value{ - Int64Value: summaryValue.Count.Value, - }, - Timestamp: ptTimestamp, - }, - }, - } - countTss = append(countTss, countTs) - } - - snapshot := summaryValue.GetSnapshot() - for _, percentileValue := range snapshot.GetPercentileValues() { - lvsWithPercentile := lvs[0:] - lvsWithPercentile = append(lvsWithPercentile, &metricspb.LabelValue{ - Value: fmt.Sprintf("%f", percentileValue.Percentile), - }) - percentileTs := &metricspb.TimeSeries{ - LabelValues: lvsWithPercentile, - StartTimestamp: nil, - Points: []*metricspb.Point{ - { - Value: &metricspb.Point_DoubleValue{ - DoubleValue: percentileValue.Value, - }, - Timestamp: ptTimestamp, - }, - }, - } - percentileTss = append(percentileTss, percentileTs) - } - } - - if len(sumTss) > 0 { - metric := &metricspb.Metric{ - MetricDescriptor: &metricspb.MetricDescriptor{ - Name: fmt.Sprintf("%s_summary_sum", summary.GetMetricDescriptor().GetName()), - Description: summary.GetMetricDescriptor().GetDescription(), - Type: metricspb.MetricDescriptor_CUMULATIVE_DOUBLE, - Unit: summary.GetMetricDescriptor().GetUnit(), - LabelKeys: summary.GetMetricDescriptor().GetLabelKeys(), - }, - Timeseries: sumTss, - Resource: summary.Resource, - } - metrics = append(metrics, metric) - } - if len(countTss) > 0 { - metric := &metricspb.Metric{ - MetricDescriptor: &metricspb.MetricDescriptor{ - Name: fmt.Sprintf("%s_summary_count", summary.GetMetricDescriptor().GetName()), - Description: summary.GetMetricDescriptor().GetDescription(), - Type: metricspb.MetricDescriptor_CUMULATIVE_INT64, - Unit: "1", - LabelKeys: summary.GetMetricDescriptor().GetLabelKeys(), - }, - Timeseries: countTss, - Resource: summary.Resource, - } - metrics = append(metrics, metric) - } - if len(percentileTss) > 0 { - lks := summary.GetMetricDescriptor().GetLabelKeys()[0:] - lks = append(lks, percentileLabelKey) - metric := &metricspb.Metric{ - MetricDescriptor: &metricspb.MetricDescriptor{ - Name: fmt.Sprintf("%s_summary_percentile", summary.GetMetricDescriptor().GetName()), - Description: summary.GetMetricDescriptor().GetDescription(), - Type: metricspb.MetricDescriptor_GAUGE_DOUBLE, - Unit: summary.GetMetricDescriptor().GetUnit(), - LabelKeys: lks, - }, - Timeseries: percentileTss, - Resource: summary.Resource, - } - metrics = append(metrics, metric) - } - } - return metrics -} - -func (se *statsExporter) getResource(rsc *resourcepb.Resource, metric *metricspb.Metric, seenRscs map[*resourcepb.Resource]*monitoredrespb.MonitoredResource) *monitoredrespb.MonitoredResource { - var resource = rsc - if metric.Resource != nil { - resource = metric.Resource - } - mappedRsc, ok := seenRscs[resource] - if !ok { - mappedRsc = se.o.MapResource(resourcepbToResource(resource)) - seenRscs[resource] = mappedRsc - } - return mappedRsc -} - -func resourcepbToResource(rsc *resourcepb.Resource) *resource.Resource { - if rsc == nil { - return globalResource - } - res := &resource.Resource{ - Type: rsc.Type, - Labels: make(map[string]string, len(rsc.Labels)), - } - - for k, v := range rsc.Labels { - res.Labels[k] = v - } - return res -} - -// protoMetricToTimeSeries converts a metric into a Stackdriver Monitoring v3 API CreateTimeSeriesRequest -// but it doesn't invoke any remote API. -func (se *statsExporter) protoMetricToTimeSeries(ctx context.Context, mappedRsc *monitoredrespb.MonitoredResource, metric *metricspb.Metric, mb *metricsBatcher) { - if metric == nil || metric.MetricDescriptor == nil { - mb.recordDroppedTimeseries(len(metric.GetTimeseries()), errNilMetricOrMetricDescriptor) - } - - metricName := metric.GetMetricDescriptor().GetName() - metricType := se.metricTypeFromProto(metricName) - metricLabelKeys := metric.GetMetricDescriptor().GetLabelKeys() - metricKind, valueType := protoMetricDescriptorTypeToMetricKind(metric) - labelKeys := make([]string, 0, len(metricLabelKeys)) - for _, key := range metricLabelKeys { - labelKeys = append(labelKeys, sanitize(key.GetKey())) - } - - for _, protoTimeSeries := range metric.Timeseries { - sdPoints, err := se.protoTimeSeriesToMonitoringPoints(protoTimeSeries, metricKind) - if err != nil { - mb.recordDroppedTimeseries(1, err) - continue - } - - // Each TimeSeries has labelValues which MUST be correlated - // with that from the MetricDescriptor - labels, err := labelsPerTimeSeries(se.defaultLabels, labelKeys, protoTimeSeries.GetLabelValues()) - if err != nil { - mb.recordDroppedTimeseries(1, err) - continue - } - mb.addTimeSeries(&monitoringpb.TimeSeries{ - Metric: &googlemetricpb.Metric{ - Type: metricType, - Labels: labels, - }, - MetricKind: metricKind, - ValueType: valueType, - Resource: mappedRsc, - Points: sdPoints, - }) - } -} - -func labelsPerTimeSeries(defaults map[string]labelValue, labelKeys []string, labelValues []*metricspb.LabelValue) (map[string]string, error) { - labels := make(map[string]string) - // Fill in the defaults firstly, irrespective of if the labelKeys and labelValues are mismatched. - for key, label := range defaults { - labels[key] = label.val - } - - // Perform this sanity check now. - if len(labelKeys) != len(labelValues) { - return labels, fmt.Errorf("length mismatch: len(labelKeys)=%d len(labelValues)=%d", len(labelKeys), len(labelValues)) - } - - for i, labelKey := range labelKeys { - labelValue := labelValues[i] - if !labelValue.GetHasValue() { - continue - } - labels[labelKey] = labelValue.GetValue() - } - - return labels, nil -} - -// createMetricDescriptor creates a metric descriptor from the OpenCensus proto metric -// and then creates it remotely using Stackdriver's API. -func (se *statsExporter) createMetricDescriptor(ctx context.Context, metric *metricspb.Metric) error { - se.protoMu.Lock() - defer se.protoMu.Unlock() - - name := metric.GetMetricDescriptor().GetName() - if _, created := se.protoMetricDescriptors[name]; created { - return nil - } - - // Otherwise, we encountered a cache-miss and - // should create the metric descriptor remotely. - inMD, err := se.protoToMonitoringMetricDescriptor(metric, se.defaultLabels) - if err != nil { - return err - } - - if builtinMetric(inMD.Type) { - se.protoMetricDescriptors[name] = true - } else { - cmrdesc := &monitoringpb.CreateMetricDescriptorRequest{ - Name: fmt.Sprintf("projects/%s", se.o.ProjectID), - MetricDescriptor: inMD, - } - _, err = createMetricDescriptor(ctx, se.c, cmrdesc) - if err == nil { - // Now record the metric as having been created. - se.protoMetricDescriptors[name] = true - } - } - - return err -} - -func (se *statsExporter) protoTimeSeriesToMonitoringPoints(ts *metricspb.TimeSeries, metricKind googlemetricpb.MetricDescriptor_MetricKind) (sptl []*monitoringpb.Point, err error) { - for _, pt := range ts.Points { - // If we have a last value aggregation point i.e. MetricDescriptor_GAUGE - // StartTime should be nil. - startTime := ts.StartTimestamp - if metricKind == googlemetricpb.MetricDescriptor_GAUGE { - startTime = nil - } - - spt, err := fromProtoPoint(startTime, pt) - if err != nil { - return nil, err - } - sptl = append(sptl, spt) - } - return sptl, nil -} - -func (se *statsExporter) protoToMonitoringMetricDescriptor(metric *metricspb.Metric, additionalLabels map[string]labelValue) (*googlemetricpb.MetricDescriptor, error) { - if metric == nil || metric.MetricDescriptor == nil { - return nil, errNilMetricOrMetricDescriptor - } - - md := metric.GetMetricDescriptor() - metricName := md.GetName() - unit := md.GetUnit() - description := md.GetDescription() - metricType := se.metricTypeFromProto(metricName) - displayName := se.displayName(metricName) - metricKind, valueType := protoMetricDescriptorTypeToMetricKind(metric) - - sdm := &googlemetricpb.MetricDescriptor{ - Name: fmt.Sprintf("projects/%s/metricDescriptors/%s", se.o.ProjectID, metricType), - DisplayName: displayName, - Description: description, - Unit: unit, - Type: metricType, - MetricKind: metricKind, - ValueType: valueType, - Labels: labelDescriptorsFromProto(additionalLabels, metric.GetMetricDescriptor().GetLabelKeys()), - } - - return sdm, nil -} - -func labelDescriptorsFromProto(defaults map[string]labelValue, protoLabelKeys []*metricspb.LabelKey) []*labelpb.LabelDescriptor { - labelDescriptors := make([]*labelpb.LabelDescriptor, 0, len(defaults)+len(protoLabelKeys)) - - // Fill in the defaults first. - for key, lbl := range defaults { - labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ - Key: sanitize(key), - Description: lbl.desc, - ValueType: labelpb.LabelDescriptor_STRING, - }) - } - - // Now fill in those from the metric. - for _, protoKey := range protoLabelKeys { - labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ - Key: sanitize(protoKey.GetKey()), - Description: protoKey.GetDescription(), - ValueType: labelpb.LabelDescriptor_STRING, // We only use string tags - }) - } - return labelDescriptors -} - -func (se *statsExporter) metricTypeFromProto(name string) string { - prefix := se.o.MetricPrefix - if prefix != "" { - name = prefix + name - } - if !hasDomain(name) { - // Still needed because the name may or may not have a "/" at the beginning. - name = path.Join(defaultDomain, name) - } - return name -} - -// hasDomain checks if the metric name already has a domain in it. -func hasDomain(name string) bool { - for _, domain := range domains { - if strings.Contains(name, domain) { - return true - } - } - return false -} - -func fromProtoPoint(startTime *timestamppb.Timestamp, pt *metricspb.Point) (*monitoringpb.Point, error) { - if pt == nil { - return nil, nil - } - - mptv, err := protoToMetricPoint(pt.Value) - if err != nil { - return nil, err - } - - return &monitoringpb.Point{ - Value: mptv, - Interval: &monitoringpb.TimeInterval{ - StartTime: startTime, - EndTime: pt.Timestamp, - }, - }, nil -} - -func protoToMetricPoint(value interface{}) (*monitoringpb.TypedValue, error) { - if value == nil { - return nil, nil - } - - switch v := value.(type) { - default: - // All the other types are not yet handled. - // TODO: (@odeke-em, @songy23) talk to the Stackdriver team to determine - // the use cases for: - // - // *TypedValue_BoolValue - // *TypedValue_StringValue - // - // and then file feature requests on OpenCensus-Specs and then OpenCensus-Proto, - // lest we shall error here. - // - // TODO: Add conversion from SummaryValue when - // https://github.com/census-ecosystem/opencensus-go-exporter-stackdriver/issues/66 - // has been figured out. - return nil, fmt.Errorf("protoToMetricPoint: unknown Data type: %T", value) - - case *metricspb.Point_Int64Value: - return &monitoringpb.TypedValue{ - Value: &monitoringpb.TypedValue_Int64Value{ - Int64Value: v.Int64Value, - }, - }, nil - - case *metricspb.Point_DoubleValue: - return &monitoringpb.TypedValue{ - Value: &monitoringpb.TypedValue_DoubleValue{ - DoubleValue: v.DoubleValue, - }, - }, nil - - case *metricspb.Point_DistributionValue: - dv := v.DistributionValue - var mv *monitoringpb.TypedValue_DistributionValue - if dv != nil { - var mean float64 - if dv.Count > 0 { - mean = float64(dv.Sum) / float64(dv.Count) - } - mv = &monitoringpb.TypedValue_DistributionValue{ - DistributionValue: &distributionpb.Distribution{ - Count: dv.Count, - Mean: mean, - SumOfSquaredDeviation: dv.SumOfSquaredDeviation, - }, - } - - insertZeroBound := false - if bopts := dv.BucketOptions; bopts != nil && bopts.Type != nil { - bexp, ok := bopts.Type.(*metricspb.DistributionValue_BucketOptions_Explicit_) - if ok && bexp != nil && bexp.Explicit != nil { - insertZeroBound = shouldInsertZeroBound(bexp.Explicit.Bounds...) - mv.DistributionValue.BucketOptions = &distributionpb.Distribution_BucketOptions{ - Options: &distributionpb.Distribution_BucketOptions_ExplicitBuckets{ - ExplicitBuckets: &distributionpb.Distribution_BucketOptions_Explicit{ - // The first bucket bound should be 0.0 because the Metrics first bucket is - // [0, first_bound) but Stackdriver monitoring bucket bounds begin with -infinity - // (first bucket is (-infinity, 0)) - Bounds: addZeroBoundOnCondition(insertZeroBound, bexp.Explicit.Bounds...), - }, - }, - } - } - } - mv.DistributionValue.BucketCounts = addZeroBucketCountOnCondition(insertZeroBound, bucketCounts(dv.Buckets)...) - - } - return &monitoringpb.TypedValue{Value: mv}, nil - } -} - -func bucketCounts(buckets []*metricspb.DistributionValue_Bucket) []int64 { - bucketCounts := make([]int64, len(buckets)) - for i, bucket := range buckets { - if bucket != nil { - bucketCounts[i] = bucket.Count - } - } - return bucketCounts -} - -func protoMetricDescriptorTypeToMetricKind(m *metricspb.Metric) (googlemetricpb.MetricDescriptor_MetricKind, googlemetricpb.MetricDescriptor_ValueType) { - dt := m.GetMetricDescriptor() - if dt == nil { - return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED - } - - switch dt.Type { - case metricspb.MetricDescriptor_CUMULATIVE_INT64: - return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_INT64 - - case metricspb.MetricDescriptor_CUMULATIVE_DOUBLE: - return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DOUBLE - - case metricspb.MetricDescriptor_CUMULATIVE_DISTRIBUTION: - return googlemetricpb.MetricDescriptor_CUMULATIVE, googlemetricpb.MetricDescriptor_DISTRIBUTION - - case metricspb.MetricDescriptor_GAUGE_DOUBLE: - return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DOUBLE - - case metricspb.MetricDescriptor_GAUGE_INT64: - return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_INT64 - - case metricspb.MetricDescriptor_GAUGE_DISTRIBUTION: - return googlemetricpb.MetricDescriptor_GAUGE, googlemetricpb.MetricDescriptor_DISTRIBUTION - - default: - return googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED - } -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_test_utils.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_test_utils.go deleted file mode 100644 index daf687b71..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/metrics_test_utils.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package stackdriver - -/* -Common test utilities for comparing Stackdriver metrics. -*/ - -import ( - "testing" - - "github.com/golang/protobuf/proto" - "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/cmpopts" - - googlemetricpb "google.golang.org/genproto/googleapis/api/metric" - monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" - monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" -) - -func cmpResource(got, want *monitoredrespb.MonitoredResource) string { - return cmp.Diff(got, want, cmpopts.IgnoreUnexported(monitoredrespb.MonitoredResource{})) -} - -func requireTimeSeriesRequestEqual(t *testing.T, got, want []*monitoringpb.CreateTimeSeriesRequest) { - if len(got) != len(want) { - t.Fatalf("Unexpected slice len got: %d want: %d", len(got), len(want)) - } - for i, g := range got { - w := want[i] - if !proto.Equal(g, w) { - t.Fatalf("Unexpected proto difference got: %s want: %s", proto.MarshalTextString(g), proto.MarshalTextString(w)) - } - } -} - -func cmpTSReqs(got, want []*monitoringpb.CreateTimeSeriesRequest) string { - return cmp.Diff(got, want, cmpopts.IgnoreUnexported(monitoringpb.CreateTimeSeriesRequest{}), cmpopts.IgnoreTypes(googlemetricpb.MetricDescriptor_METRIC_KIND_UNSPECIFIED, googlemetricpb.MetricDescriptor_VALUE_TYPE_UNSPECIFIED)) -} - -func cmpMD(got, want *googlemetricpb.MetricDescriptor) string { - return cmp.Diff(got, want, cmpopts.IgnoreUnexported(googlemetricpb.MetricDescriptor{})) -} - -func cmpMDReq(got, want *monitoringpb.CreateMetricDescriptorRequest) string { - return cmp.Diff(got, want, cmpopts.IgnoreUnexported(monitoringpb.CreateMetricDescriptorRequest{})) -} - -func cmpMDReqs(got, want []*monitoringpb.CreateMetricDescriptorRequest) string { - return cmp.Diff(got, want, cmpopts.IgnoreUnexported(monitoringpb.CreateMetricDescriptorRequest{})) -} - -func cmpPoint(got, want *monitoringpb.Point) string { - return cmp.Diff(got, want, cmpopts.IgnoreUnexported(monitoringpb.Point{})) -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/aws_identity_doc_utils.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/aws_identity_doc_utils.go deleted file mode 100644 index ee519a4bf..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/aws_identity_doc_utils.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package monitoredresource - -import ( - "github.com/aws/aws-sdk-go/aws/ec2metadata" - "github.com/aws/aws-sdk-go/aws/session" -) - -// awsIdentityDocument is used to store parsed AWS Identity Document. -type awsIdentityDocument struct { - // accountID is the AWS account number for the VM. - accountID string - - // instanceID is the instance id of the instance. - instanceID string - - // Region is the AWS region for the VM. - region string -} - -// retrieveAWSIdentityDocument attempts to retrieve AWS Identity Document. -// If the environment is AWS EC2 Instance then a valid document is retrieved. -// Relevant attributes from the document are stored in awsIdentityDoc. -// This is only done once. -func retrieveAWSIdentityDocument() *awsIdentityDocument { - awsIdentityDoc := awsIdentityDocument{} - sesion, err := session.NewSession() - if err != nil { - return nil - } - c := ec2metadata.New(sesion) - if !c.Available() { - return nil - } - ec2InstanceIdentifyDocument, err := c.GetInstanceIdentityDocument() - if err != nil { - return nil - } - awsIdentityDoc.region = ec2InstanceIdentifyDocument.Region - awsIdentityDoc.instanceID = ec2InstanceIdentifyDocument.InstanceID - awsIdentityDoc.accountID = ec2InstanceIdentifyDocument.AccountID - - return &awsIdentityDoc -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/gcp_metadata_config.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/gcp_metadata_config.go deleted file mode 100644 index f0d88856b..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/gcp_metadata_config.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package monitoredresource - -import ( - "context" - "fmt" - "log" - "os" - "strings" - - "cloud.google.com/go/compute/metadata" - container "cloud.google.com/go/container/apiv1" - containerpb "google.golang.org/genproto/googleapis/container/v1" -) - -// gcpMetadata represents metadata retrieved from GCP (GKE and GCE) environment. -type gcpMetadata struct { - - // projectID is the identifier of the GCP project associated with this resource, such as "my-project". - projectID string - - // instanceID is the numeric VM instance identifier assigned by Compute Engine. - instanceID string - - // clusterName is the name for the cluster the container is running in. - clusterName string - - // containerName is the name of the container. - containerName string - - // namespaceID is the identifier for the cluster namespace the container is running in - namespaceID string - - // podID is the identifier for the pod the container is running in. - podID string - - // zone is the Compute Engine zone in which the VM is running. - zone string - - monitoringV2 bool -} - -// retrieveGCPMetadata retrieves value of each Attribute from Metadata Server -// in GKE container and GCE instance environment. -// Some attributes are retrieved from the system environment. -// This is only executed detectOnce. -func retrieveGCPMetadata() *gcpMetadata { - gcpMetadata := gcpMetadata{} - var err error - gcpMetadata.instanceID, err = metadata.InstanceID() - if err != nil { - // Not a GCP environment - return &gcpMetadata - } - - gcpMetadata.projectID, err = metadata.ProjectID() - logError(err) - - gcpMetadata.zone, err = metadata.Zone() - logError(err) - - clusterName, err := metadata.InstanceAttributeValue("cluster-name") - logError(err) - gcpMetadata.clusterName = strings.TrimSpace(clusterName) - - clusterLocation, err := metadata.InstanceAttributeValue("cluster-location") - logError(err) - - // Following attributes are derived from environment variables. They are configured - // via yaml file. For details refer to: - // https://cloud.google.com/kubernetes-engine/docs/tutorials/custom-metrics-autoscaling#exporting_metrics_from_the_application - gcpMetadata.namespaceID = os.Getenv("NAMESPACE") - gcpMetadata.containerName = os.Getenv("CONTAINER_NAME") - gcpMetadata.podID = os.Getenv("HOSTNAME") - - // Monitoring API version can be obtained from cluster info.q - if gcpMetadata.clusterName != "" { - ctx := context.Background() - c, err := container.NewClusterManagerClient(ctx) - logError(err) - if c != nil { - req := &containerpb.GetClusterRequest{ - Name: fmt.Sprintf("projects/%s/locations/%s/clusters/%s", gcpMetadata.projectID, strings.TrimSpace(clusterLocation), gcpMetadata.clusterName), - } - resp, err := c.GetCluster(ctx, req) - logError(err) - if resp != nil && resp.GetMonitoringService() == "monitoring.googleapis.com/kubernetes" && - resp.GetLoggingService() == "logging.googleapis.com/kubernetes" { - gcpMetadata.monitoringV2 = true - } - } - } - - return &gcpMetadata -} - -// logError logs error only if the error is present and it is not 'not defined' -func logError(err error) { - if err != nil { - if !strings.Contains(err.Error(), "not defined") { - log.Printf("Error retrieving gcp metadata: %v", err) - } - } -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/monitored_resources.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/monitored_resources.go deleted file mode 100644 index 86e76002a..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/monitoredresource/monitored_resources.go +++ /dev/null @@ -1,232 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package monitoredresource - -import ( - "fmt" - "os" - "sync" -) - -// Interface is a type that represent monitor resource that satisfies monitoredresource.Interface -type Interface interface { - - // MonitoredResource returns the resource type and resource labels. - MonitoredResource() (resType string, labels map[string]string) -} - -// GKEContainer represents gke_container type monitored resource. -// For definition refer to -// https://cloud.google.com/monitoring/api/resources#tag_gke_container -type GKEContainer struct { - - // ProjectID is the identifier of the GCP project associated with this resource, such as "my-project". - ProjectID string - - // InstanceID is the numeric VM instance identifier assigned by Compute Engine. - InstanceID string - - // ClusterName is the name for the cluster the container is running in. - ClusterName string - - // ContainerName is the name of the container. - ContainerName string - - // NamespaceID is the identifier for the cluster namespace the container is running in - NamespaceID string - - // PodID is the identifier for the pod the container is running in. - PodID string - - // Zone is the Compute Engine zone in which the VM is running. - Zone string - - // LoggingMonitoringV2Enabled is the identifier if user enabled V2 logging and monitoring for GKE - LoggingMonitoringV2Enabled bool -} - -// MonitoredResource returns resource type and resource labels for GKEContainer -func (gke *GKEContainer) MonitoredResource() (resType string, labels map[string]string) { - labels = map[string]string{ - "project_id": gke.ProjectID, - "cluster_name": gke.ClusterName, - "container_name": gke.ContainerName, - } - var typ string - if gke.LoggingMonitoringV2Enabled { - typ = "k8s_container" - labels["pod_name"] = gke.PodID - labels["namespace_name"] = gke.NamespaceID - labels["location"] = gke.Zone - } else { - typ = "gke_container" - labels["pod_id"] = gke.PodID - labels["namespace_id"] = gke.NamespaceID - labels["zone"] = gke.Zone - labels["instance_id"] = gke.InstanceID - } - return typ, labels -} - -// GCEInstance represents gce_instance type monitored resource. -// For definition refer to -// https://cloud.google.com/monitoring/api/resources#tag_gce_instance -type GCEInstance struct { - - // ProjectID is the identifier of the GCP project associated with this resource, such as "my-project". - ProjectID string - - // InstanceID is the numeric VM instance identifier assigned by Compute Engine. - InstanceID string - - // Zone is the Compute Engine zone in which the VM is running. - Zone string -} - -// MonitoredResource returns resource type and resource labels for GCEInstance -func (gce *GCEInstance) MonitoredResource() (resType string, labels map[string]string) { - labels = map[string]string{ - "project_id": gce.ProjectID, - "instance_id": gce.InstanceID, - "zone": gce.Zone, - } - return "gce_instance", labels -} - -// AWSEC2Instance represents aws_ec2_instance type monitored resource. -// For definition refer to -// https://cloud.google.com/monitoring/api/resources#tag_aws_ec2_instance -type AWSEC2Instance struct { - - // AWSAccount is the AWS account number for the VM. - AWSAccount string - - // InstanceID is the instance id of the instance. - InstanceID string - - // Region is the AWS region for the VM. The format of this field is "aws:{region}", - // where supported values for {region} are listed at - // http://docs.aws.amazon.com/general/latest/gr/rande.html. - Region string -} - -// MonitoredResource returns resource type and resource labels for AWSEC2Instance -func (aws *AWSEC2Instance) MonitoredResource() (resType string, labels map[string]string) { - labels = map[string]string{ - "aws_account": aws.AWSAccount, - "instance_id": aws.InstanceID, - "region": aws.Region, - } - return "aws_ec2_instance", labels -} - -// Autodetect auto detects monitored resources based on -// the environment where the application is running. -// It supports detection of following resource types -// 1. gke_container: -// 2. gce_instance: -// 3. aws_ec2_instance: -// -// Returns MonitoredResInterface which implements getLabels() and getType() -// For resource definition go to https://cloud.google.com/monitoring/api/resources -func Autodetect() Interface { - return func() Interface { - detectOnce.Do(func() { - var awsIdentityDoc *awsIdentityDocument - var gcpMetadata *gcpMetadata - - // First attempts to retrieve AWS Identity Doc and GCP metadata. - // It then determines the resource type - // In GCP and AWS environment both func finishes quickly. However, - // in an environment other than those (e.g local laptop) it - // takes 2 seconds for GCP and 5-6 for AWS. - var wg sync.WaitGroup - wg.Add(2) - - go func() { - defer wg.Done() - awsIdentityDoc = retrieveAWSIdentityDocument() - }() - go func() { - defer wg.Done() - gcpMetadata = retrieveGCPMetadata() - }() - - wg.Wait() - autoDetected = detectResourceType(awsIdentityDoc, gcpMetadata) - }) - return autoDetected - }() - -} - -// createAWSEC2InstanceMonitoredResource creates a aws_ec2_instance monitored resource -// awsIdentityDoc contains AWS EC2 specific attributes. -func createAWSEC2InstanceMonitoredResource(awsIdentityDoc *awsIdentityDocument) *AWSEC2Instance { - awsInstance := AWSEC2Instance{ - AWSAccount: awsIdentityDoc.accountID, - InstanceID: awsIdentityDoc.instanceID, - Region: fmt.Sprintf("aws:%s", awsIdentityDoc.region), - } - return &awsInstance -} - -// createGCEInstanceMonitoredResource creates a gce_instance monitored resource -// gcpMetadata contains GCP (GKE or GCE) specific attributes. -func createGCEInstanceMonitoredResource(gcpMetadata *gcpMetadata) *GCEInstance { - gceInstance := GCEInstance{ - ProjectID: gcpMetadata.projectID, - InstanceID: gcpMetadata.instanceID, - Zone: gcpMetadata.zone, - } - return &gceInstance -} - -// createGKEContainerMonitoredResource creates a gke_container monitored resource -// gcpMetadata contains GCP (GKE or GCE) specific attributes. -func createGKEContainerMonitoredResource(gcpMetadata *gcpMetadata) *GKEContainer { - gkeContainer := GKEContainer{ - ProjectID: gcpMetadata.projectID, - InstanceID: gcpMetadata.instanceID, - Zone: gcpMetadata.zone, - ContainerName: gcpMetadata.containerName, - ClusterName: gcpMetadata.clusterName, - NamespaceID: gcpMetadata.namespaceID, - PodID: gcpMetadata.podID, - LoggingMonitoringV2Enabled: gcpMetadata.monitoringV2, - } - return &gkeContainer -} - -// detectOnce is used to make sure GCP and AWS metadata detect function executes only once. -var detectOnce sync.Once - -// autoDetected is the metadata detected after the first execution of Autodetect function. -var autoDetected Interface - -// detectResourceType determines the resource type. -// awsIdentityDoc contains AWS EC2 attributes. nil if it is not AWS EC2 environment -// gcpMetadata contains GCP (GKE or GCE) specific attributes. -func detectResourceType(awsIdentityDoc *awsIdentityDocument, gcpMetadata *gcpMetadata) Interface { - if os.Getenv("KUBERNETES_SERVICE_HOST") != "" && - gcpMetadata != nil && gcpMetadata.instanceID != "" { - return createGKEContainerMonitoredResource(gcpMetadata) - } else if gcpMetadata != nil && gcpMetadata.instanceID != "" { - return createGCEInstanceMonitoredResource(gcpMetadata) - } else if awsIdentityDoc != nil { - return createAWSEC2InstanceMonitoredResource(awsIdentityDoc) - } - return nil -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/resource.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/resource.go deleted file mode 100644 index e60e91376..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/resource.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package stackdriver // import "contrib.go.opencensus.io/exporter/stackdriver" - -import ( - "fmt" - - "go.opencensus.io/resource" - "go.opencensus.io/resource/resourcekeys" - monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" -) - -// Resource labels that are generally internal to the exporter. -// Consider exposing these labels and a type identifier in the future to allow -// for customization. -const ( - stackdriverLocation = "contrib.opencensus.io/exporter/stackdriver/location" - stackdriverProjectID = "contrib.opencensus.io/exporter/stackdriver/project_id" - stackdriverGenericTaskNamespace = "contrib.opencensus.io/exporter/stackdriver/generic_task/namespace" - stackdriverGenericTaskJob = "contrib.opencensus.io/exporter/stackdriver/generic_task/job" - stackdriverGenericTaskID = "contrib.opencensus.io/exporter/stackdriver/generic_task/task_id" -) - -// Mappings for the well-known OpenCensus resources to applicable Stackdriver resources. -var k8sResourceMap = map[string]string{ - "project_id": stackdriverProjectID, - "location": resourcekeys.CloudKeyZone, - "cluster_name": resourcekeys.K8SKeyClusterName, - "namespace_name": resourcekeys.K8SKeyNamespaceName, - "pod_name": resourcekeys.K8SKeyPodName, - "container_name": resourcekeys.ContainerKeyName, - "node_name": resourcekeys.HostKeyName, -} - -var gcpResourceMap = map[string]string{ - "project_id": stackdriverProjectID, - "instance_id": resourcekeys.HostKeyID, - "zone": resourcekeys.CloudKeyZone, -} - -var awsResourceMap = map[string]string{ - "project_id": stackdriverProjectID, - "instance_id": resourcekeys.HostKeyID, - "region": resourcekeys.CloudKeyRegion, - "aws_account": resourcekeys.CloudKeyAccountID, -} - -// Generic task resource. -var genericResourceMap = map[string]string{ - "project_id": stackdriverProjectID, - "location": stackdriverLocation, - "namespace": stackdriverGenericTaskNamespace, - "job": stackdriverGenericTaskJob, - "task_id": stackdriverGenericTaskID, -} - -func transformResource(match, input map[string]string) map[string]string { - output := make(map[string]string, len(input)) - for dst, src := range match { - if v, ok := input[src]; ok { - output[dst] = v - } - } - return output -} - -func defaultMapResource(res *resource.Resource) *monitoredrespb.MonitoredResource { - match := genericResourceMap - result := &monitoredrespb.MonitoredResource{ - Type: "global", - } - if res == nil || res.Labels == nil { - return result - } - - switch { - case res.Type == resourcekeys.ContainerType: - result.Type = "k8s_container" - match = k8sResourceMap - case res.Type == resourcekeys.K8SType: - result.Type = "k8s_pod" - match = k8sResourceMap - case res.Type == resourcekeys.HostType && res.Labels[resourcekeys.K8SKeyClusterName] != "": - result.Type = "k8s_node" - match = k8sResourceMap - case res.Labels[resourcekeys.CloudKeyProvider] == resourcekeys.CloudProviderGCP: - result.Type = "gce_instance" - match = gcpResourceMap - case res.Labels[resourcekeys.CloudKeyProvider] == resourcekeys.CloudProviderAWS: - result.Type = "aws_ec2_instance" - match = awsResourceMap - } - - result.Labels = transformResource(match, res.Labels) - if result.Type == "aws_ec2_instance" { - if v, ok := result.Labels["region"]; ok { - result.Labels["region"] = fmt.Sprintf("aws:%s", v) - } - } - return result -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/sanitize.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/sanitize.go deleted file mode 100644 index 184bb1d43..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/sanitize.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package stackdriver - -import ( - "strings" - "unicode" -) - -const labelKeySizeLimit = 100 - -// sanitize returns a string that is trunacated to 100 characters if it's too -// long, and replaces non-alphanumeric characters to underscores. -func sanitize(s string) string { - if len(s) == 0 { - return s - } - if len(s) > labelKeySizeLimit { - s = s[:labelKeySizeLimit] - } - s = strings.Map(sanitizeRune, s) - if unicode.IsDigit(rune(s[0])) { - s = "key_" + s - } - if s[0] == '_' { - s = "key" + s - } - return s -} - -// converts anything that is not a letter or digit to an underscore -func sanitizeRune(r rune) rune { - if unicode.IsLetter(r) || unicode.IsDigit(r) { - return r - } - // Everything else turns into an underscore - return '_' -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/stackdriver.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/stackdriver.go deleted file mode 100644 index e7d86bcd0..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/stackdriver.go +++ /dev/null @@ -1,445 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package stackdriver contains the OpenCensus exporters for -// Stackdriver Monitoring and Stackdriver Tracing. -// -// This exporter can be used to send metrics to Stackdriver Monitoring and traces -// to Stackdriver trace. -// -// The package uses Application Default Credentials to authenticate by default. -// See: https://developers.google.com/identity/protocols/application-default-credentials -// -// Alternatively, pass the authentication options in both the MonitoringClientOptions -// and the TraceClientOptions fields of Options. -// -// Stackdriver Monitoring -// -// This exporter support exporting OpenCensus views to Stackdriver Monitoring. -// Each registered view becomes a metric in Stackdriver Monitoring, with the -// tags becoming labels. -// -// The aggregation function determines the metric kind: LastValue aggregations -// generate Gauge metrics and all other aggregations generate Cumulative metrics. -// -// In order to be able to push your stats to Stackdriver Monitoring, you must: -// -// 1. Create a Cloud project: https://support.google.com/cloud/answer/6251787?hl=en -// 2. Enable billing: https://support.google.com/cloud/answer/6288653#new-billing -// 3. Enable the Stackdriver Monitoring API: https://console.cloud.google.com/apis/dashboard -// -// These steps enable the API but don't require that your app is hosted on Google Cloud Platform. -// -// Stackdriver Trace -// -// This exporter supports exporting Trace Spans to Stackdriver Trace. It also -// supports the Google "Cloud Trace" propagation format header. -package stackdriver // import "contrib.go.opencensus.io/exporter/stackdriver" - -import ( - "context" - "errors" - "fmt" - "log" - "os" - "path" - "strings" - "time" - - metadataapi "cloud.google.com/go/compute/metadata" - traceapi "cloud.google.com/go/trace/apiv2" - "contrib.go.opencensus.io/exporter/stackdriver/monitoredresource" - "go.opencensus.io/resource" - "go.opencensus.io/stats/view" - "go.opencensus.io/trace" - "golang.org/x/oauth2/google" - "google.golang.org/api/option" - monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" - - commonpb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1" - metricspb "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1" - resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" - "go.opencensus.io/metric/metricdata" -) - -// Options contains options for configuring the exporter. -type Options struct { - // ProjectID is the identifier of the Stackdriver - // project the user is uploading the stats data to. - // If not set, this will default to your "Application Default Credentials". - // For details see: https://developers.google.com/accounts/docs/application-default-credentials. - // - // It will be used in the project_id label of a Stackdriver monitored - // resource if the resource does not inherently belong to a specific - // project, e.g. on-premise resource like k8s_container or generic_task. - ProjectID string - - // Location is the identifier of the GCP or AWS cloud region/zone in which - // the data for a resource is stored. - // If not set, it will default to the location provided by the metadata server. - // - // It will be used in the location label of a Stackdriver monitored resource - // if the resource does not inherently belong to a specific project, e.g. - // on-premise resource like k8s_container or generic_task. - Location string - - // OnError is the hook to be called when there is - // an error uploading the stats or tracing data. - // If no custom hook is set, errors are logged. - // Optional. - OnError func(err error) - - // MonitoringClientOptions are additional options to be passed - // to the underlying Stackdriver Monitoring API client. - // Optional. - MonitoringClientOptions []option.ClientOption - - // TraceClientOptions are additional options to be passed - // to the underlying Stackdriver Trace API client. - // Optional. - TraceClientOptions []option.ClientOption - - // BundleDelayThreshold determines the max amount of time - // the exporter can wait before uploading view data or trace spans to - // the backend. - // Optional. - BundleDelayThreshold time.Duration - - // BundleCountThreshold determines how many view data events or trace spans - // can be buffered before batch uploading them to the backend. - // Optional. - BundleCountThreshold int - - // TraceSpansBufferMaxBytes is the maximum size (in bytes) of spans that - // will be buffered in memory before being dropped. - // - // If unset, a default of 8MB will be used. - TraceSpansBufferMaxBytes int - - // Resource sets the MonitoredResource against which all views will be - // recorded by this exporter. - // - // All Stackdriver metrics created by this exporter are custom metrics, - // so only a limited number of MonitoredResource types are supported, see: - // https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource - // - // An important consideration when setting the Resource here is that - // Stackdriver Monitoring only allows a single writer per - // TimeSeries, see: https://cloud.google.com/monitoring/api/v3/metrics-details#intro-time-series - // A TimeSeries is uniquely defined by the metric type name - // (constructed from the view name and the MetricPrefix), the Resource field, - // and the set of label key/value pairs (in OpenCensus terminology: tag). - // - // If no custom Resource is set, a default MonitoredResource - // with type global and no resource labels will be used. If you explicitly - // set this field, you may also want to set custom DefaultMonitoringLabels. - // - // Deprecated: Use MonitoredResource instead. - Resource *monitoredrespb.MonitoredResource - - // MonitoredResource sets the MonitoredResource against which all views will be - // recorded by this exporter. - // - // All Stackdriver metrics created by this exporter are custom metrics, - // so only a limited number of MonitoredResource types are supported, see: - // https://cloud.google.com/monitoring/custom-metrics/creating-metrics#which-resource - // - // An important consideration when setting the MonitoredResource here is that - // Stackdriver Monitoring only allows a single writer per - // TimeSeries, see: https://cloud.google.com/monitoring/api/v3/metrics-details#intro-time-series - // A TimeSeries is uniquely defined by the metric type name - // (constructed from the view name and the MetricPrefix), the MonitoredResource field, - // and the set of label key/value pairs (in OpenCensus terminology: tag). - // - // If no custom MonitoredResource is set AND if Resource is also not set then - // a default MonitoredResource with type global and no resource labels will be used. - // If you explicitly set this field, you may also want to set custom DefaultMonitoringLabels. - // - // This field replaces Resource field. If this is set then it will override the - // Resource field. - // Optional, but encouraged. - MonitoredResource monitoredresource.Interface - - // ResourceDetector provides a hook to discover arbitrary resource information. - // - // The translation function provided in MapResource must be able to conver the - // the resource information to a Stackdriver monitored resource. - // - // If this field is unset, resource type and tags will automatically be discovered through - // the OC_RESOURCE_TYPE and OC_RESOURCE_LABELS environment variables. - ResourceDetector resource.Detector - - // MapResource converts a OpenCensus resource to a Stackdriver monitored resource. - // - // If this field is unset, defaultMapResource will be used which encodes a set of default - // conversions from auto-detected resources to well-known Stackdriver monitored resources. - MapResource func(*resource.Resource) *monitoredrespb.MonitoredResource - - // MetricPrefix overrides the prefix of a Stackdriver metric display names. - // Optional. If unset defaults to "OpenCensus/". - // Deprecated: Provide GetMetricDisplayName to change the display name of - // the metric. - // If GetMetricDisplayName is non-nil, this option is ignored. - MetricPrefix string - - // GetMetricDisplayName allows customizing the display name for the metric - // associated with the given view. By default it will be: - // MetricPrefix + view.Name - GetMetricDisplayName func(view *view.View) string - - // GetMetricType allows customizing the metric type for the given view. - // By default, it will be: - // "custom.googleapis.com/opencensus/" + view.Name - // - // See: https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricDescriptor - GetMetricType func(view *view.View) string - - // DefaultTraceAttributes will be appended to every span that is exported to - // Stackdriver Trace. - DefaultTraceAttributes map[string]interface{} - - // DefaultMonitoringLabels are labels added to every metric created by this - // exporter in Stackdriver Monitoring. - // - // If unset, this defaults to a single label with key "opencensus_task" and - // value "go-@". This default ensures that the set of labels - // together with the default Resource (global) are unique to this - // process, as required by Stackdriver Monitoring. - // - // If you set DefaultMonitoringLabels, make sure that the Resource field - // together with these labels is unique to the - // current process. This is to ensure that there is only a single writer to - // each TimeSeries in Stackdriver. - // - // Set this to &Labels{} (a pointer to an empty Labels) to avoid getting the - // default "opencensus_task" label. You should only do this if you know that - // the Resource you set uniquely identifies this Go process. - DefaultMonitoringLabels *Labels - - // Context allows you to provide a custom context for API calls. - // - // This context will be used several times: first, to create Stackdriver - // trace and metric clients, and then every time a new batch of traces or - // stats needs to be uploaded. - // - // Do not set a timeout on this context. Instead, set the Timeout option. - // - // If unset, context.Background() will be used. - Context context.Context - - // Timeout for all API calls. If not set, defaults to 5 seconds. - Timeout time.Duration - - // ReportingInterval sets the interval between reporting metrics. - // If it is set to zero then default value is used. - ReportingInterval time.Duration -} - -const defaultTimeout = 5 * time.Second - -var defaultDomain = path.Join("custom.googleapis.com", "opencensus") - -// Exporter is a stats and trace exporter that uploads data to Stackdriver. -// -// You can create a single Exporter and register it as both a trace exporter -// (to export to Stackdriver Trace) and a stats exporter (to integrate with -// Stackdriver Monitoring). -type Exporter struct { - traceExporter *traceExporter - statsExporter *statsExporter -} - -// NewExporter creates a new Exporter that implements both stats.Exporter and -// trace.Exporter. -func NewExporter(o Options) (*Exporter, error) { - if o.ProjectID == "" { - ctx := o.Context - if ctx == nil { - ctx = context.Background() - } - creds, err := google.FindDefaultCredentials(ctx, traceapi.DefaultAuthScopes()...) - if err != nil { - return nil, fmt.Errorf("stackdriver: %v", err) - } - if creds.ProjectID == "" { - return nil, errors.New("stackdriver: no project found with application default credentials") - } - o.ProjectID = creds.ProjectID - } - if o.Location == "" { - if metadataapi.OnGCE() { - zone, err := metadataapi.Zone() - if err != nil { - // This error should be logged with a warning level. - err = fmt.Errorf("setting Stackdriver default location failed: %s", err) - if o.OnError != nil { - o.OnError(err) - } else { - log.Print(err) - } - } else { - o.Location = zone - } - } - } - - if o.MonitoredResource != nil { - o.Resource = convertMonitoredResourceToPB(o.MonitoredResource) - } - if o.MapResource == nil { - o.MapResource = defaultMapResource - } - if o.ResourceDetector != nil { - // For backwards-compatibility we still respect the deprecated resource field. - if o.Resource != nil { - return nil, errors.New("stackdriver: ResourceDetector must not be used in combination with deprecated resource fields") - } - res, err := o.ResourceDetector(o.Context) - if err != nil { - return nil, fmt.Errorf("stackdriver: detect resource: %s", err) - } - // Populate internal resource labels for defaulting project_id, location, and - // generic resource labels of applicable monitored resources. - res.Labels[stackdriverProjectID] = o.ProjectID - res.Labels[stackdriverLocation] = o.Location - res.Labels[stackdriverGenericTaskNamespace] = "default" - res.Labels[stackdriverGenericTaskJob] = path.Base(os.Args[0]) - res.Labels[stackdriverGenericTaskID] = getTaskValue() - - o.Resource = o.MapResource(res) - } - if o.MetricPrefix != "" && !strings.HasSuffix(o.MetricPrefix, "/") { - o.MetricPrefix = o.MetricPrefix + "/" - } - - se, err := newStatsExporter(o) - if err != nil { - return nil, err - } - te, err := newTraceExporter(o) - if err != nil { - return nil, err - } - return &Exporter{ - statsExporter: se, - traceExporter: te, - }, nil -} - -// ExportView exports to the Stackdriver Monitoring if view data -// has one or more rows. -// Deprecated: use ExportMetrics and StartMetricsExporter instead. -func (e *Exporter) ExportView(vd *view.Data) { - e.statsExporter.ExportView(vd) -} - -// ExportMetricsProto exports OpenCensus Metrics Proto to Stackdriver Monitoring synchronously, -// without de-duping or adding proto metrics to the bundler. -func (e *Exporter) ExportMetricsProto(ctx context.Context, node *commonpb.Node, rsc *resourcepb.Resource, metrics []*metricspb.Metric) error { - _, err := e.statsExporter.PushMetricsProto(ctx, node, rsc, metrics) - return err -} - -// PushMetricsProto simliar with ExportMetricsProto but returns the number of dropped timeseries. -func (e *Exporter) PushMetricsProto(ctx context.Context, node *commonpb.Node, rsc *resourcepb.Resource, metrics []*metricspb.Metric) (int, error) { - return e.statsExporter.PushMetricsProto(ctx, node, rsc, metrics) -} - -// ExportMetrics exports OpenCensus Metrics to Stackdriver Monitoring -func (e *Exporter) ExportMetrics(ctx context.Context, metrics []*metricdata.Metric) error { - return e.statsExporter.ExportMetrics(ctx, metrics) -} - -// StartMetricsExporter starts exporter by creating an interval reader that reads metrics -// from all registered producers at set interval and exports them. -// Use StopMetricsExporter to stop exporting metrics. -// Previously, it required registering exporter to export stats collected by opencensus. -// exporter := stackdriver.NewExporter(stackdriver.Option{}) -// view.RegisterExporter(exporter) -// Now, it requires to call StartMetricsExporter() to export stats and metrics collected by opencensus. -// exporter := stackdriver.NewExporter(stackdriver.Option{}) -// exporter.StartMetricsExporter() -// defer exporter.StopMetricsExporter() -// -// Both approach should not be used simultaenously. Otherwise it may result into unknown behavior. -// Previous approach continues to work as before but will not report newly define metrics such -// as gauges. -func (e *Exporter) StartMetricsExporter() error { - return e.statsExporter.startMetricsReader() -} - -// StopMetricsExporter stops exporter from exporting metrics. -func (e *Exporter) StopMetricsExporter() { - e.statsExporter.stopMetricsReader() -} - -// ExportSpan exports a SpanData to Stackdriver Trace. -func (e *Exporter) ExportSpan(sd *trace.SpanData) { - if len(e.traceExporter.o.DefaultTraceAttributes) > 0 { - sd = e.sdWithDefaultTraceAttributes(sd) - } - e.traceExporter.ExportSpan(sd) -} - -func (e *Exporter) sdWithDefaultTraceAttributes(sd *trace.SpanData) *trace.SpanData { - newSD := *sd - newSD.Attributes = make(map[string]interface{}) - for k, v := range e.traceExporter.o.DefaultTraceAttributes { - newSD.Attributes[k] = v - } - for k, v := range sd.Attributes { - newSD.Attributes[k] = v - } - return &newSD -} - -// Flush waits for exported data to be uploaded. -// -// This is useful if your program is ending and you do not -// want to lose recent stats or spans. -func (e *Exporter) Flush() { - e.statsExporter.Flush() - e.traceExporter.Flush() -} - -func (o Options) handleError(err error) { - if o.OnError != nil { - o.OnError(err) - return - } - log.Printf("Failed to export to Stackdriver: %v", err) -} - -func newContextWithTimeout(ctx context.Context, timeout time.Duration) (context.Context, func()) { - if ctx == nil { - ctx = context.Background() - } - if timeout <= 0 { - timeout = defaultTimeout - } - return context.WithTimeout(ctx, timeout) -} - -// convertMonitoredResourceToPB converts MonitoredResource data in to -// protocol buffer. -func convertMonitoredResourceToPB(mr monitoredresource.Interface) *monitoredrespb.MonitoredResource { - mrpb := new(monitoredrespb.MonitoredResource) - var labels map[string]string - mrpb.Type, labels = mr.MonitoredResource() - mrpb.Labels = make(map[string]string) - for k, v := range labels { - mrpb.Labels[k] = v - } - return mrpb -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/stats.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/stats.go deleted file mode 100644 index 6b05927dc..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/stats.go +++ /dev/null @@ -1,683 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package stackdriver - -import ( - "context" - "errors" - "fmt" - "os" - "path" - "sort" - "strconv" - "strings" - "sync" - "time" - - opencensus "go.opencensus.io" - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" - "go.opencensus.io/trace" - - monitoring "cloud.google.com/go/monitoring/apiv3" - "github.com/golang/protobuf/ptypes/timestamp" - "go.opencensus.io/metric/metricdata" - "go.opencensus.io/metric/metricexport" - "google.golang.org/api/option" - "google.golang.org/api/support/bundler" - distributionpb "google.golang.org/genproto/googleapis/api/distribution" - labelpb "google.golang.org/genproto/googleapis/api/label" - "google.golang.org/genproto/googleapis/api/metric" - googlemetricpb "google.golang.org/genproto/googleapis/api/metric" - metricpb "google.golang.org/genproto/googleapis/api/metric" - monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" - monitoringpb "google.golang.org/genproto/googleapis/monitoring/v3" -) - -const ( - maxTimeSeriesPerUpload = 200 - opencensusTaskKey = "opencensus_task" - opencensusTaskDescription = "Opencensus task identifier" - defaultDisplayNamePrefix = "OpenCensus" - version = "0.10.0" -) - -var userAgent = fmt.Sprintf("opencensus-go %s; stackdriver-exporter %s", opencensus.Version(), version) - -// statsExporter exports stats to the Stackdriver Monitoring. -type statsExporter struct { - o Options - - viewDataBundler *bundler.Bundler - metricsBundler *bundler.Bundler - - createdViewsMu sync.Mutex - createdViews map[string]*metricpb.MetricDescriptor // Views already created remotely - - protoMu sync.Mutex - protoMetricDescriptors map[string]bool // Saves the metric descriptors that were already created remotely - - metricMu sync.Mutex - metricDescriptors map[string]bool // Saves the metric descriptors that were already created remotely - - c *monitoring.MetricClient - defaultLabels map[string]labelValue - ir *metricexport.IntervalReader - - initReaderOnce sync.Once -} - -var ( - errBlankProjectID = errors.New("expecting a non-blank ProjectID") -) - -// newStatsExporter returns an exporter that uploads stats data to Stackdriver Monitoring. -// Only one Stackdriver exporter should be created per ProjectID per process, any subsequent -// invocations of NewExporter with the same ProjectID will return an error. -func newStatsExporter(o Options) (*statsExporter, error) { - if strings.TrimSpace(o.ProjectID) == "" { - return nil, errBlankProjectID - } - - opts := append(o.MonitoringClientOptions, option.WithUserAgent(userAgent)) - ctx := o.Context - if ctx == nil { - ctx = context.Background() - } - client, err := monitoring.NewMetricClient(ctx, opts...) - if err != nil { - return nil, err - } - e := &statsExporter{ - c: client, - o: o, - createdViews: make(map[string]*metricpb.MetricDescriptor), - protoMetricDescriptors: make(map[string]bool), - metricDescriptors: make(map[string]bool), - } - - var defaultLablesNotSanitized map[string]labelValue - if o.DefaultMonitoringLabels != nil { - defaultLablesNotSanitized = o.DefaultMonitoringLabels.m - } else { - defaultLablesNotSanitized = map[string]labelValue{ - opencensusTaskKey: {val: getTaskValue(), desc: opencensusTaskDescription}, - } - } - - e.defaultLabels = make(map[string]labelValue) - // Fill in the defaults firstly, irrespective of if the labelKeys and labelValues are mismatched. - for key, label := range defaultLablesNotSanitized { - e.defaultLabels[sanitize(key)] = label - } - - e.viewDataBundler = bundler.NewBundler((*view.Data)(nil), func(bundle interface{}) { - vds := bundle.([]*view.Data) - e.handleUpload(vds...) - }) - e.metricsBundler = bundler.NewBundler((*metricdata.Metric)(nil), func(bundle interface{}) { - metrics := bundle.([]*metricdata.Metric) - e.handleMetricsUpload(metrics) - }) - if delayThreshold := e.o.BundleDelayThreshold; delayThreshold > 0 { - e.viewDataBundler.DelayThreshold = delayThreshold - e.metricsBundler.DelayThreshold = delayThreshold - } - if countThreshold := e.o.BundleCountThreshold; countThreshold > 0 { - e.viewDataBundler.BundleCountThreshold = countThreshold - e.metricsBundler.BundleCountThreshold = countThreshold - } - return e, nil -} - -func (e *statsExporter) startMetricsReader() error { - e.initReaderOnce.Do(func() { - e.ir, _ = metricexport.NewIntervalReader(metricexport.NewReader(), e) - }) - e.ir.ReportingInterval = e.o.ReportingInterval - return e.ir.Start() -} - -func (e *statsExporter) stopMetricsReader() { - if e.ir != nil { - e.ir.Stop() - } -} - -func (e *statsExporter) getMonitoredResource(v *view.View, tags []tag.Tag) ([]tag.Tag, *monitoredrespb.MonitoredResource) { - resource := e.o.Resource - if resource == nil { - resource = &monitoredrespb.MonitoredResource{ - Type: "global", - } - } - return tags, resource -} - -// ExportView exports to the Stackdriver Monitoring if view data -// has one or more rows. -func (e *statsExporter) ExportView(vd *view.Data) { - if len(vd.Rows) == 0 { - return - } - err := e.viewDataBundler.Add(vd, 1) - switch err { - case nil: - return - case bundler.ErrOverflow: - e.o.handleError(errors.New("failed to upload: buffer full")) - default: - e.o.handleError(err) - } -} - -// getTaskValue returns a task label value in the format of -// "go-@". -func getTaskValue() string { - hostname, err := os.Hostname() - if err != nil { - hostname = "localhost" - } - return "go-" + strconv.Itoa(os.Getpid()) + "@" + hostname -} - -// handleUpload handles uploading a slice -// of Data, as well as error handling. -func (e *statsExporter) handleUpload(vds ...*view.Data) { - if err := e.uploadStats(vds); err != nil { - e.o.handleError(err) - } -} - -// Flush waits for exported view data and metrics to be uploaded. -// -// This is useful if your program is ending and you do not -// want to lose data that hasn't yet been exported. -func (e *statsExporter) Flush() { - e.viewDataBundler.Flush() - e.metricsBundler.Flush() -} - -func (e *statsExporter) uploadStats(vds []*view.Data) error { - ctx, cancel := newContextWithTimeout(e.o.Context, e.o.Timeout) - defer cancel() - ctx, span := trace.StartSpan( - ctx, - "contrib.go.opencensus.io/exporter/stackdriver.uploadStats", - trace.WithSampler(trace.NeverSample()), - ) - defer span.End() - - for _, vd := range vds { - if err := e.createMeasure(ctx, vd.View); err != nil { - span.SetStatus(trace.Status{Code: 2, Message: err.Error()}) - return err - } - } - for _, req := range e.makeReq(vds, maxTimeSeriesPerUpload) { - if err := createTimeSeries(ctx, e.c, req); err != nil { - span.SetStatus(trace.Status{Code: 2, Message: err.Error()}) - // TODO(jbd): Don't fail fast here, batch errors? - return err - } - } - return nil -} - -func (e *statsExporter) makeReq(vds []*view.Data, limit int) []*monitoringpb.CreateTimeSeriesRequest { - var reqs []*monitoringpb.CreateTimeSeriesRequest - - var allTimeSeries []*monitoringpb.TimeSeries - for _, vd := range vds { - for _, row := range vd.Rows { - tags, resource := e.getMonitoredResource(vd.View, append([]tag.Tag(nil), row.Tags...)) - ts := &monitoringpb.TimeSeries{ - Metric: &metricpb.Metric{ - Type: e.metricType(vd.View), - Labels: newLabels(e.defaultLabels, tags), - }, - Resource: resource, - Points: []*monitoringpb.Point{newPoint(vd.View, row, vd.Start, vd.End)}, - } - allTimeSeries = append(allTimeSeries, ts) - } - } - - var timeSeries []*monitoringpb.TimeSeries - for _, ts := range allTimeSeries { - timeSeries = append(timeSeries, ts) - if len(timeSeries) == limit { - ctsreql := e.combineTimeSeriesToCreateTimeSeriesRequest(timeSeries) - reqs = append(reqs, ctsreql...) - timeSeries = timeSeries[:0] - } - } - - if len(timeSeries) > 0 { - ctsreql := e.combineTimeSeriesToCreateTimeSeriesRequest(timeSeries) - reqs = append(reqs, ctsreql...) - } - return reqs -} - -func (e *statsExporter) viewToMetricDescriptor(ctx context.Context, v *view.View) (*metricpb.MetricDescriptor, error) { - m := v.Measure - agg := v.Aggregation - viewName := v.Name - - metricType := e.metricType(v) - var valueType metricpb.MetricDescriptor_ValueType - unit := m.Unit() - // Default metric Kind - metricKind := metricpb.MetricDescriptor_CUMULATIVE - - switch agg.Type { - case view.AggTypeCount: - valueType = metricpb.MetricDescriptor_INT64 - // If the aggregation type is count, which counts the number of recorded measurements, the unit must be "1", - // because this view does not apply to the recorded values. - unit = stats.UnitDimensionless - case view.AggTypeSum: - switch m.(type) { - case *stats.Int64Measure: - valueType = metricpb.MetricDescriptor_INT64 - case *stats.Float64Measure: - valueType = metricpb.MetricDescriptor_DOUBLE - } - case view.AggTypeDistribution: - valueType = metricpb.MetricDescriptor_DISTRIBUTION - case view.AggTypeLastValue: - metricKind = metricpb.MetricDescriptor_GAUGE - switch m.(type) { - case *stats.Int64Measure: - valueType = metricpb.MetricDescriptor_INT64 - case *stats.Float64Measure: - valueType = metricpb.MetricDescriptor_DOUBLE - } - default: - return nil, fmt.Errorf("unsupported aggregation type: %s", agg.Type.String()) - } - - var displayName string - if e.o.GetMetricDisplayName == nil { - displayName = e.displayName(viewName) - } else { - displayName = e.o.GetMetricDisplayName(v) - } - - res := &metricpb.MetricDescriptor{ - Name: fmt.Sprintf("projects/%s/metricDescriptors/%s", e.o.ProjectID, metricType), - DisplayName: displayName, - Description: v.Description, - Unit: unit, - Type: metricType, - MetricKind: metricKind, - ValueType: valueType, - Labels: newLabelDescriptors(e.defaultLabels, v.TagKeys), - } - return res, nil -} - -// createMeasure creates a MetricDescriptor for the given view data in Stackdriver Monitoring. -// An error will be returned if there is already a metric descriptor created with the same name -// but it has a different aggregation or keys. -func (e *statsExporter) createMeasure(ctx context.Context, v *view.View) error { - e.createdViewsMu.Lock() - defer e.createdViewsMu.Unlock() - - viewName := v.Name - - if md, ok := e.createdViews[viewName]; ok { - // [TODO:rghetia] Temporary fix for https://github.com/census-ecosystem/opencensus-go-exporter-stackdriver/issues/76#issuecomment-459459091 - if builtinMetric(md.Type) { - return nil - } - return e.equalMeasureAggTagKeys(md, v.Measure, v.Aggregation, v.TagKeys) - } - - inMD, err := e.viewToMetricDescriptor(ctx, v) - if err != nil { - return err - } - - var dmd *metric.MetricDescriptor - if builtinMetric(inMD.Type) { - gmrdesc := &monitoringpb.GetMetricDescriptorRequest{ - Name: inMD.Name, - } - dmd, err = getMetricDescriptor(ctx, e.c, gmrdesc) - } else { - cmrdesc := &monitoringpb.CreateMetricDescriptorRequest{ - Name: fmt.Sprintf("projects/%s", e.o.ProjectID), - MetricDescriptor: inMD, - } - dmd, err = createMetricDescriptor(ctx, e.c, cmrdesc) - } - if err != nil { - return err - } - - // Now cache the metric descriptor - e.createdViews[viewName] = dmd - return err -} - -func (e *statsExporter) displayName(suffix string) string { - displayNamePrefix := defaultDisplayNamePrefix - if e.o.MetricPrefix != "" { - displayNamePrefix = e.o.MetricPrefix - } - return path.Join(displayNamePrefix, suffix) -} - -func (e *statsExporter) combineTimeSeriesToCreateTimeSeriesRequest(ts []*monitoringpb.TimeSeries) (ctsreql []*monitoringpb.CreateTimeSeriesRequest) { - if len(ts) == 0 { - return nil - } - - // Since there are scenarios in which Metrics with the same Type - // can be bunched in the same TimeSeries, we have to ensure that - // we create a unique CreateTimeSeriesRequest with entirely unique Metrics - // per TimeSeries, lest we'll encounter: - // - // err: rpc error: code = InvalidArgument desc = One or more TimeSeries could not be written: - // Field timeSeries[2] had an invalid value: Duplicate TimeSeries encountered. - // Only one point can be written per TimeSeries per request.: timeSeries[2] - // - // This scenario happens when we are using the OpenCensus Agent in which multiple metrics - // are streamed by various client applications. - // See https://github.com/census-ecosystem/opencensus-go-exporter-stackdriver/issues/73 - uniqueTimeSeries := make([]*monitoringpb.TimeSeries, 0, len(ts)) - nonUniqueTimeSeries := make([]*monitoringpb.TimeSeries, 0, len(ts)) - seenMetrics := make(map[string]struct{}) - - for _, tti := range ts { - key := metricSignature(tti.Metric) - if _, alreadySeen := seenMetrics[key]; !alreadySeen { - uniqueTimeSeries = append(uniqueTimeSeries, tti) - seenMetrics[key] = struct{}{} - } else { - nonUniqueTimeSeries = append(nonUniqueTimeSeries, tti) - } - } - - // UniqueTimeSeries can be bunched up together - // While for each nonUniqueTimeSeries, we have - // to make a unique CreateTimeSeriesRequest. - ctsreql = append(ctsreql, &monitoringpb.CreateTimeSeriesRequest{ - Name: fmt.Sprintf("projects/%s", e.o.ProjectID), - TimeSeries: uniqueTimeSeries, - }) - - // Now recursively also combine the non-unique TimeSeries - // that were singly added to nonUniqueTimeSeries. - // The reason is that we need optimal combinations - // for optimal combinations because: - // * "a/b/c" - // * "a/b/c" - // * "x/y/z" - // * "a/b/c" - // * "x/y/z" - // * "p/y/z" - // * "d/y/z" - // - // should produce: - // CreateTimeSeries(uniqueTimeSeries) :: ["a/b/c", "x/y/z", "p/y/z", "d/y/z"] - // CreateTimeSeries(nonUniqueTimeSeries) :: ["a/b/c"] - // CreateTimeSeries(nonUniqueTimeSeries) :: ["a/b/c", "x/y/z"] - nonUniqueRequests := e.combineTimeSeriesToCreateTimeSeriesRequest(nonUniqueTimeSeries) - ctsreql = append(ctsreql, nonUniqueRequests...) - - return ctsreql -} - -// metricSignature creates a unique signature consisting of a -// metric's type and its lexicographically sorted label values -// See https://github.com/census-ecosystem/opencensus-go-exporter-stackdriver/issues/120 -func metricSignature(metric *googlemetricpb.Metric) string { - labels := metric.GetLabels() - labelValues := make([]string, 0, len(labels)) - - for _, labelValue := range labels { - labelValues = append(labelValues, labelValue) - } - sort.Strings(labelValues) - return fmt.Sprintf("%s:%s", metric.GetType(), strings.Join(labelValues, ",")) -} - -func newPoint(v *view.View, row *view.Row, start, end time.Time) *monitoringpb.Point { - switch v.Aggregation.Type { - case view.AggTypeLastValue: - return newGaugePoint(v, row, end) - default: - return newCumulativePoint(v, row, start, end) - } -} - -func newCumulativePoint(v *view.View, row *view.Row, start, end time.Time) *monitoringpb.Point { - return &monitoringpb.Point{ - Interval: &monitoringpb.TimeInterval{ - StartTime: ×tamp.Timestamp{ - Seconds: start.Unix(), - Nanos: int32(start.Nanosecond()), - }, - EndTime: ×tamp.Timestamp{ - Seconds: end.Unix(), - Nanos: int32(end.Nanosecond()), - }, - }, - Value: newTypedValue(v, row), - } -} - -func newGaugePoint(v *view.View, row *view.Row, end time.Time) *monitoringpb.Point { - gaugeTime := ×tamp.Timestamp{ - Seconds: end.Unix(), - Nanos: int32(end.Nanosecond()), - } - return &monitoringpb.Point{ - Interval: &monitoringpb.TimeInterval{ - EndTime: gaugeTime, - }, - Value: newTypedValue(v, row), - } -} - -func newTypedValue(vd *view.View, r *view.Row) *monitoringpb.TypedValue { - switch v := r.Data.(type) { - case *view.CountData: - return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_Int64Value{ - Int64Value: v.Value, - }} - case *view.SumData: - switch vd.Measure.(type) { - case *stats.Int64Measure: - return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_Int64Value{ - Int64Value: int64(v.Value), - }} - case *stats.Float64Measure: - return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_DoubleValue{ - DoubleValue: v.Value, - }} - } - case *view.DistributionData: - insertZeroBound := shouldInsertZeroBound(vd.Aggregation.Buckets...) - return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_DistributionValue{ - DistributionValue: &distributionpb.Distribution{ - Count: v.Count, - Mean: v.Mean, - SumOfSquaredDeviation: v.SumOfSquaredDev, - // TODO(songya): uncomment this once Stackdriver supports min/max. - // Range: &distributionpb.Distribution_Range{ - // Min: v.Min, - // Max: v.Max, - // }, - BucketOptions: &distributionpb.Distribution_BucketOptions{ - Options: &distributionpb.Distribution_BucketOptions_ExplicitBuckets{ - ExplicitBuckets: &distributionpb.Distribution_BucketOptions_Explicit{ - Bounds: addZeroBoundOnCondition(insertZeroBound, vd.Aggregation.Buckets...), - }, - }, - }, - BucketCounts: addZeroBucketCountOnCondition(insertZeroBound, v.CountPerBucket...), - }, - }} - case *view.LastValueData: - switch vd.Measure.(type) { - case *stats.Int64Measure: - return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_Int64Value{ - Int64Value: int64(v.Value), - }} - case *stats.Float64Measure: - return &monitoringpb.TypedValue{Value: &monitoringpb.TypedValue_DoubleValue{ - DoubleValue: v.Value, - }} - } - } - return nil -} - -func shouldInsertZeroBound(bounds ...float64) bool { - if len(bounds) > 0 && bounds[0] != 0.0 { - return true - } - return false -} - -func addZeroBucketCountOnCondition(insert bool, counts ...int64) []int64 { - if insert { - return append([]int64{0}, counts...) - } - return counts -} - -func addZeroBoundOnCondition(insert bool, bounds ...float64) []float64 { - if insert { - return append([]float64{0.0}, bounds...) - } - return bounds -} - -func (e *statsExporter) metricType(v *view.View) string { - if formatter := e.o.GetMetricType; formatter != nil { - return formatter(v) - } - return path.Join("custom.googleapis.com", "opencensus", v.Name) -} - -func newLabels(defaults map[string]labelValue, tags []tag.Tag) map[string]string { - labels := make(map[string]string) - for k, lbl := range defaults { - labels[sanitize(k)] = lbl.val - } - for _, tag := range tags { - labels[sanitize(tag.Key.Name())] = tag.Value - } - return labels -} - -func newLabelDescriptors(defaults map[string]labelValue, keys []tag.Key) []*labelpb.LabelDescriptor { - labelDescriptors := make([]*labelpb.LabelDescriptor, 0, len(keys)+len(defaults)) - for key, lbl := range defaults { - labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ - Key: sanitize(key), - Description: lbl.desc, - ValueType: labelpb.LabelDescriptor_STRING, - }) - } - for _, key := range keys { - labelDescriptors = append(labelDescriptors, &labelpb.LabelDescriptor{ - Key: sanitize(key.Name()), - ValueType: labelpb.LabelDescriptor_STRING, // We only use string tags - }) - } - return labelDescriptors -} - -func (e *statsExporter) equalMeasureAggTagKeys(md *metricpb.MetricDescriptor, m stats.Measure, agg *view.Aggregation, keys []tag.Key) error { - var aggTypeMatch bool - switch md.ValueType { - case metricpb.MetricDescriptor_INT64: - if _, ok := m.(*stats.Int64Measure); !(ok || agg.Type == view.AggTypeCount) { - return fmt.Errorf("stackdriver metric descriptor was not created as int64") - } - aggTypeMatch = agg.Type == view.AggTypeCount || agg.Type == view.AggTypeSum || agg.Type == view.AggTypeLastValue - case metricpb.MetricDescriptor_DOUBLE: - if _, ok := m.(*stats.Float64Measure); !ok { - return fmt.Errorf("stackdriver metric descriptor was not created as double") - } - aggTypeMatch = agg.Type == view.AggTypeSum || agg.Type == view.AggTypeLastValue - case metricpb.MetricDescriptor_DISTRIBUTION: - aggTypeMatch = agg.Type == view.AggTypeDistribution - } - - if !aggTypeMatch { - return fmt.Errorf("stackdriver metric descriptor was not created with aggregation type %T", agg.Type) - } - - labels := make(map[string]struct{}, len(keys)+len(e.defaultLabels)) - for _, k := range keys { - labels[sanitize(k.Name())] = struct{}{} - } - for k := range e.defaultLabels { - labels[sanitize(k)] = struct{}{} - } - - for _, k := range md.Labels { - if _, ok := labels[k.Key]; !ok { - return fmt.Errorf("stackdriver metric descriptor %q was not created with label %q", md.Type, k) - } - delete(labels, k.Key) - } - - if len(labels) > 0 { - extra := make([]string, 0, len(labels)) - for k := range labels { - extra = append(extra, k) - } - return fmt.Errorf("stackdriver metric descriptor %q contains unexpected labels: %s", md.Type, strings.Join(extra, ", ")) - } - - return nil -} - -var createMetricDescriptor = func(ctx context.Context, c *monitoring.MetricClient, mdr *monitoringpb.CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error) { - return c.CreateMetricDescriptor(ctx, mdr) -} - -var getMetricDescriptor = func(ctx context.Context, c *monitoring.MetricClient, mdr *monitoringpb.GetMetricDescriptorRequest) (*metric.MetricDescriptor, error) { - return c.GetMetricDescriptor(ctx, mdr) -} - -var createTimeSeries = func(ctx context.Context, c *monitoring.MetricClient, ts *monitoringpb.CreateTimeSeriesRequest) error { - return c.CreateTimeSeries(ctx, ts) -} - -var knownExternalMetricPrefixes = []string{ - "custom.googleapis.com/", - "external.googleapis.com/", -} - -// builtinMetric returns true if a MetricType is a heuristically known -// built-in Stackdriver metric -func builtinMetric(metricType string) bool { - for _, knownExternalMetric := range knownExternalMetricPrefixes { - if strings.HasPrefix(metricType, knownExternalMetric) { - return false - } - } - return true -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace.go deleted file mode 100644 index ee6535eef..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace.go +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package stackdriver - -import ( - "context" - "fmt" - "log" - "sync" - "time" - - tracingclient "cloud.google.com/go/trace/apiv2" - "github.com/golang/protobuf/proto" - "go.opencensus.io/trace" - "google.golang.org/api/support/bundler" - tracepb "google.golang.org/genproto/googleapis/devtools/cloudtrace/v2" -) - -// traceExporter is an implementation of trace.Exporter that uploads spans to -// Stackdriver. -// -type traceExporter struct { - o Options - projectID string - bundler *bundler.Bundler - // uploadFn defaults to uploadSpans; it can be replaced for tests. - uploadFn func(spans []*tracepb.Span) - overflowLogger - client *tracingclient.Client -} - -var _ trace.Exporter = (*traceExporter)(nil) - -func newTraceExporter(o Options) (*traceExporter, error) { - ctx := o.Context - if ctx == nil { - ctx = context.Background() - } - client, err := tracingclient.NewClient(ctx, o.TraceClientOptions...) - if err != nil { - return nil, fmt.Errorf("stackdriver: couldn't initialize trace client: %v", err) - } - return newTraceExporterWithClient(o, client), nil -} - -const defaultBufferedByteLimit = 8 * 1024 * 1024 - -func newTraceExporterWithClient(o Options, c *tracingclient.Client) *traceExporter { - e := &traceExporter{ - projectID: o.ProjectID, - client: c, - o: o, - } - b := bundler.NewBundler((*tracepb.Span)(nil), func(bundle interface{}) { - e.uploadFn(bundle.([]*tracepb.Span)) - }) - if o.BundleDelayThreshold > 0 { - b.DelayThreshold = o.BundleDelayThreshold - } else { - b.DelayThreshold = 2 * time.Second - } - if o.BundleCountThreshold > 0 { - b.BundleCountThreshold = o.BundleCountThreshold - } else { - b.BundleCountThreshold = 50 - } - // The measured "bytes" are not really bytes, see exportReceiver. - b.BundleByteThreshold = b.BundleCountThreshold * 200 - b.BundleByteLimit = b.BundleCountThreshold * 1000 - if o.TraceSpansBufferMaxBytes > 0 { - b.BufferedByteLimit = o.TraceSpansBufferMaxBytes - } else { - b.BufferedByteLimit = defaultBufferedByteLimit - } - - e.bundler = b - e.uploadFn = e.uploadSpans - return e -} - -// ExportSpan exports a SpanData to Stackdriver Trace. -func (e *traceExporter) ExportSpan(s *trace.SpanData) { - protoSpan := protoFromSpanData(s, e.projectID, e.o.Resource) - protoSize := proto.Size(protoSpan) - err := e.bundler.Add(protoSpan, protoSize) - switch err { - case nil: - return - case bundler.ErrOversizedItem: - case bundler.ErrOverflow: - e.overflowLogger.log() - default: - e.o.handleError(err) - } -} - -// Flush waits for exported trace spans to be uploaded. -// -// This is useful if your program is ending and you do not want to lose recent -// spans. -func (e *traceExporter) Flush() { - e.bundler.Flush() -} - -// uploadSpans uploads a set of spans to Stackdriver. -func (e *traceExporter) uploadSpans(spans []*tracepb.Span) { - req := tracepb.BatchWriteSpansRequest{ - Name: "projects/" + e.projectID, - Spans: spans, - } - // Create a never-sampled span to prevent traces associated with exporter. - ctx, cancel := newContextWithTimeout(e.o.Context, e.o.Timeout) - defer cancel() - ctx, span := trace.StartSpan( - ctx, - "contrib.go.opencensus.io/exporter/stackdriver.uploadSpans", - trace.WithSampler(trace.NeverSample()), - ) - defer span.End() - span.AddAttributes(trace.Int64Attribute("num_spans", int64(len(spans)))) - - err := e.client.BatchWriteSpans(ctx, &req) - if err != nil { - span.SetStatus(trace.Status{Code: 2, Message: err.Error()}) - e.o.handleError(err) - } -} - -// overflowLogger ensures that at most one overflow error log message is -// written every 5 seconds. -type overflowLogger struct { - mu sync.Mutex - pause bool - accum int -} - -func (o *overflowLogger) delay() { - o.pause = true - time.AfterFunc(5*time.Second, func() { - o.mu.Lock() - defer o.mu.Unlock() - switch { - case o.accum == 0: - o.pause = false - case o.accum == 1: - log.Println("OpenCensus Stackdriver exporter: failed to upload span: buffer full") - o.accum = 0 - o.delay() - default: - log.Printf("OpenCensus Stackdriver exporter: failed to upload %d spans: buffer full", o.accum) - o.accum = 0 - o.delay() - } - }) -} - -func (o *overflowLogger) log() { - o.mu.Lock() - defer o.mu.Unlock() - if !o.pause { - log.Println("OpenCensus Stackdriver exporter: failed to upload span: buffer full") - o.delay() - } else { - o.accum++ - } -} diff --git a/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace_proto.go b/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace_proto.go deleted file mode 100644 index 422a98026..000000000 --- a/vendor/contrib.go.opencensus.io/exporter/stackdriver/trace_proto.go +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package stackdriver - -import ( - "fmt" - "math" - "strconv" - "time" - "unicode/utf8" - - timestamppb "github.com/golang/protobuf/ptypes/timestamp" - wrapperspb "github.com/golang/protobuf/ptypes/wrappers" - "go.opencensus.io/plugin/ochttp" - "go.opencensus.io/trace" - monitoredrespb "google.golang.org/genproto/googleapis/api/monitoredres" - tracepb "google.golang.org/genproto/googleapis/devtools/cloudtrace/v2" - statuspb "google.golang.org/genproto/googleapis/rpc/status" -) - -const ( - maxAnnotationEventsPerSpan = 32 - maxMessageEventsPerSpan = 128 - maxAttributeStringValue = 256 - agentLabel = "g.co/agent" - - labelHTTPHost = `/http/host` - labelHTTPMethod = `/http/method` - labelHTTPStatusCode = `/http/status_code` - labelHTTPPath = `/http/path` - labelHTTPUserAgent = `/http/user_agent` -) - -// proto returns a protocol buffer representation of a SpanData. -func protoFromSpanData(s *trace.SpanData, projectID string, mr *monitoredrespb.MonitoredResource) *tracepb.Span { - if s == nil { - return nil - } - - traceIDString := s.SpanContext.TraceID.String() - spanIDString := s.SpanContext.SpanID.String() - - name := s.Name - switch s.SpanKind { - case trace.SpanKindClient: - name = "Sent." + name - case trace.SpanKindServer: - name = "Recv." + name - } - - sp := &tracepb.Span{ - Name: "projects/" + projectID + "/traces/" + traceIDString + "/spans/" + spanIDString, - SpanId: spanIDString, - DisplayName: trunc(name, 128), - StartTime: timestampProto(s.StartTime), - EndTime: timestampProto(s.EndTime), - SameProcessAsParentSpan: &wrapperspb.BoolValue{Value: !s.HasRemoteParent}, - } - if p := s.ParentSpanID; p != (trace.SpanID{}) { - sp.ParentSpanId = p.String() - } - if s.Status.Code != 0 || s.Status.Message != "" { - sp.Status = &statuspb.Status{Code: s.Status.Code, Message: s.Status.Message} - } - - var annotations, droppedAnnotationsCount, messageEvents, droppedMessageEventsCount int - copyAttributes(&sp.Attributes, s.Attributes) - - // Copy MonitoredResources as span Attributes - sp.Attributes = copyMonitoredResourceAttributes(sp.Attributes, mr) - - as := s.Annotations - for i, a := range as { - if annotations >= maxAnnotationEventsPerSpan { - droppedAnnotationsCount = len(as) - i - break - } - annotation := &tracepb.Span_TimeEvent_Annotation{Description: trunc(a.Message, maxAttributeStringValue)} - copyAttributes(&annotation.Attributes, a.Attributes) - event := &tracepb.Span_TimeEvent{ - Time: timestampProto(a.Time), - Value: &tracepb.Span_TimeEvent_Annotation_{Annotation: annotation}, - } - annotations++ - if sp.TimeEvents == nil { - sp.TimeEvents = &tracepb.Span_TimeEvents{} - } - sp.TimeEvents.TimeEvent = append(sp.TimeEvents.TimeEvent, event) - } - - if sp.Attributes == nil { - sp.Attributes = &tracepb.Span_Attributes{ - AttributeMap: make(map[string]*tracepb.AttributeValue), - } - } - - // Only set the agent label if it is not already set. That enables the - // OpenCensus agent/collector to set the agent label based on the library that - // sent the span to the agent. - if _, hasAgent := sp.Attributes.AttributeMap[agentLabel]; !hasAgent { - sp.Attributes.AttributeMap[agentLabel] = &tracepb.AttributeValue{ - Value: &tracepb.AttributeValue_StringValue{ - StringValue: trunc(userAgent, maxAttributeStringValue), - }, - } - } - - es := s.MessageEvents - for i, e := range es { - if messageEvents >= maxMessageEventsPerSpan { - droppedMessageEventsCount = len(es) - i - break - } - messageEvents++ - if sp.TimeEvents == nil { - sp.TimeEvents = &tracepb.Span_TimeEvents{} - } - sp.TimeEvents.TimeEvent = append(sp.TimeEvents.TimeEvent, &tracepb.Span_TimeEvent{ - Time: timestampProto(e.Time), - Value: &tracepb.Span_TimeEvent_MessageEvent_{ - MessageEvent: &tracepb.Span_TimeEvent_MessageEvent{ - Type: tracepb.Span_TimeEvent_MessageEvent_Type(e.EventType), - Id: e.MessageID, - UncompressedSizeBytes: e.UncompressedByteSize, - CompressedSizeBytes: e.CompressedByteSize, - }, - }, - }) - } - - if droppedAnnotationsCount != 0 || droppedMessageEventsCount != 0 { - if sp.TimeEvents == nil { - sp.TimeEvents = &tracepb.Span_TimeEvents{} - } - sp.TimeEvents.DroppedAnnotationsCount = clip32(droppedAnnotationsCount) - sp.TimeEvents.DroppedMessageEventsCount = clip32(droppedMessageEventsCount) - } - - if len(s.Links) > 0 { - sp.Links = &tracepb.Span_Links{} - sp.Links.Link = make([]*tracepb.Span_Link, 0, len(s.Links)) - for _, l := range s.Links { - link := &tracepb.Span_Link{ - TraceId: l.TraceID.String(), - SpanId: l.SpanID.String(), - Type: tracepb.Span_Link_Type(l.Type), - } - copyAttributes(&link.Attributes, l.Attributes) - sp.Links.Link = append(sp.Links.Link, link) - } - } - return sp -} - -// timestampProto creates a timestamp proto for a time.Time. -func timestampProto(t time.Time) *timestamppb.Timestamp { - return ×tamppb.Timestamp{ - Seconds: t.Unix(), - Nanos: int32(t.Nanosecond()), - } -} - -// copyMonitoredResourceAttributes copies proto monitoredResource to proto map field (Span_Attributes) -// it creates the map if it is nil. -func copyMonitoredResourceAttributes(out *tracepb.Span_Attributes, mr *monitoredrespb.MonitoredResource) *tracepb.Span_Attributes { - if mr == nil { - return out - } - if out == nil { - out = &tracepb.Span_Attributes{} - } - if out.AttributeMap == nil { - out.AttributeMap = make(map[string]*tracepb.AttributeValue) - } - for k, v := range mr.Labels { - av := attributeValue(v) - out.AttributeMap[fmt.Sprintf("g.co/r/%s/%s", mr.Type, k)] = av - } - return out -} - -// copyAttributes copies a map of attributes to a proto map field. -// It creates the map if it is nil. -func copyAttributes(out **tracepb.Span_Attributes, in map[string]interface{}) { - if len(in) == 0 { - return - } - if *out == nil { - *out = &tracepb.Span_Attributes{} - } - if (*out).AttributeMap == nil { - (*out).AttributeMap = make(map[string]*tracepb.AttributeValue) - } - var dropped int32 - for key, value := range in { - av := attributeValue(value) - if av == nil { - continue - } - switch key { - case ochttp.PathAttribute: - (*out).AttributeMap[labelHTTPPath] = av - case ochttp.HostAttribute: - (*out).AttributeMap[labelHTTPHost] = av - case ochttp.MethodAttribute: - (*out).AttributeMap[labelHTTPMethod] = av - case ochttp.UserAgentAttribute: - (*out).AttributeMap[labelHTTPUserAgent] = av - case ochttp.StatusCodeAttribute: - (*out).AttributeMap[labelHTTPStatusCode] = av - default: - if len(key) > 128 { - dropped++ - continue - } - (*out).AttributeMap[key] = av - } - } - (*out).DroppedAttributesCount = dropped -} - -func attributeValue(v interface{}) *tracepb.AttributeValue { - switch value := v.(type) { - case bool: - return &tracepb.AttributeValue{ - Value: &tracepb.AttributeValue_BoolValue{BoolValue: value}, - } - case int64: - return &tracepb.AttributeValue{ - Value: &tracepb.AttributeValue_IntValue{IntValue: value}, - } - case float64: - // TODO: set double value if Stackdriver Trace support it in the future. - return &tracepb.AttributeValue{ - Value: &tracepb.AttributeValue_StringValue{ - StringValue: trunc(strconv.FormatFloat(value, 'f', -1, 64), - maxAttributeStringValue)}, - } - case string: - return &tracepb.AttributeValue{ - Value: &tracepb.AttributeValue_StringValue{StringValue: trunc(value, maxAttributeStringValue)}, - } - } - return nil -} - -// trunc returns a TruncatableString truncated to the given limit. -func trunc(s string, limit int) *tracepb.TruncatableString { - if len(s) > limit { - b := []byte(s[:limit]) - for { - r, size := utf8.DecodeLastRune(b) - if r == utf8.RuneError && size == 1 { - b = b[:len(b)-1] - } else { - break - } - } - return &tracepb.TruncatableString{ - Value: string(b), - TruncatedByteCount: clip32(len(s) - len(b)), - } - } - return &tracepb.TruncatableString{ - Value: s, - TruncatedByteCount: 0, - } -} - -// clip32 clips an int to the range of an int32. -func clip32(x int) int32 { - if x < math.MinInt32 { - return math.MinInt32 - } - if x > math.MaxInt32 { - return math.MaxInt32 - } - return int32(x) -} diff --git a/vendor/github.com/aws/aws-sdk-go/LICENSE.txt b/vendor/github.com/aws/aws-sdk-go/LICENSE.txt deleted file mode 100644 index d64569567..000000000 --- a/vendor/github.com/aws/aws-sdk-go/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/aws/aws-sdk-go/NOTICE.txt b/vendor/github.com/aws/aws-sdk-go/NOTICE.txt deleted file mode 100644 index 899129ecc..000000000 --- a/vendor/github.com/aws/aws-sdk-go/NOTICE.txt +++ /dev/null @@ -1,3 +0,0 @@ -AWS SDK for Go -Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. -Copyright 2014-2015 Stripe, Inc. diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go b/vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go deleted file mode 100644 index 99849c0e1..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/awserr/error.go +++ /dev/null @@ -1,164 +0,0 @@ -// Package awserr represents API error interface accessors for the SDK. -package awserr - -// An Error wraps lower level errors with code, message and an original error. -// The underlying concrete error type may also satisfy other interfaces which -// can be to used to obtain more specific information about the error. -// -// Calling Error() or String() will always include the full information about -// an error based on its underlying type. -// -// Example: -// -// output, err := s3manage.Upload(svc, input, opts) -// if err != nil { -// if awsErr, ok := err.(awserr.Error); ok { -// // Get error details -// log.Println("Error:", awsErr.Code(), awsErr.Message()) -// -// // Prints out full error message, including original error if there was one. -// log.Println("Error:", awsErr.Error()) -// -// // Get original error -// if origErr := awsErr.OrigErr(); origErr != nil { -// // operate on original error. -// } -// } else { -// fmt.Println(err.Error()) -// } -// } -// -type Error interface { - // Satisfy the generic error interface. - error - - // Returns the short phrase depicting the classification of the error. - Code() string - - // Returns the error details message. - Message() string - - // Returns the original error if one was set. Nil is returned if not set. - OrigErr() error -} - -// BatchError is a batch of errors which also wraps lower level errors with -// code, message, and original errors. Calling Error() will include all errors -// that occurred in the batch. -// -// Deprecated: Replaced with BatchedErrors. Only defined for backwards -// compatibility. -type BatchError interface { - // Satisfy the generic error interface. - error - - // Returns the short phrase depicting the classification of the error. - Code() string - - // Returns the error details message. - Message() string - - // Returns the original error if one was set. Nil is returned if not set. - OrigErrs() []error -} - -// BatchedErrors is a batch of errors which also wraps lower level errors with -// code, message, and original errors. Calling Error() will include all errors -// that occurred in the batch. -// -// Replaces BatchError -type BatchedErrors interface { - // Satisfy the base Error interface. - Error - - // Returns the original error if one was set. Nil is returned if not set. - OrigErrs() []error -} - -// New returns an Error object described by the code, message, and origErr. -// -// If origErr satisfies the Error interface it will not be wrapped within a new -// Error object and will instead be returned. -func New(code, message string, origErr error) Error { - var errs []error - if origErr != nil { - errs = append(errs, origErr) - } - return newBaseError(code, message, errs) -} - -// NewBatchError returns an BatchedErrors with a collection of errors as an -// array of errors. -func NewBatchError(code, message string, errs []error) BatchedErrors { - return newBaseError(code, message, errs) -} - -// A RequestFailure is an interface to extract request failure information from -// an Error such as the request ID of the failed request returned by a service. -// RequestFailures may not always have a requestID value if the request failed -// prior to reaching the service such as a connection error. -// -// Example: -// -// output, err := s3manage.Upload(svc, input, opts) -// if err != nil { -// if reqerr, ok := err.(RequestFailure); ok { -// log.Println("Request failed", reqerr.Code(), reqerr.Message(), reqerr.RequestID()) -// } else { -// log.Println("Error:", err.Error()) -// } -// } -// -// Combined with awserr.Error: -// -// output, err := s3manage.Upload(svc, input, opts) -// if err != nil { -// if awsErr, ok := err.(awserr.Error); ok { -// // Generic AWS Error with Code, Message, and original error (if any) -// fmt.Println(awsErr.Code(), awsErr.Message(), awsErr.OrigErr()) -// -// if reqErr, ok := err.(awserr.RequestFailure); ok { -// // A service error occurred -// fmt.Println(reqErr.StatusCode(), reqErr.RequestID()) -// } -// } else { -// fmt.Println(err.Error()) -// } -// } -// -type RequestFailure interface { - Error - - // The status code of the HTTP response. - StatusCode() int - - // The request ID returned by the service for a request failure. This will - // be empty if no request ID is available such as the request failed due - // to a connection error. - RequestID() string -} - -// NewRequestFailure returns a wrapped error with additional information for -// request status code, and service requestID. -// -// Should be used to wrap all request which involve service requests. Even if -// the request failed without a service response, but had an HTTP status code -// that may be meaningful. -func NewRequestFailure(err Error, statusCode int, reqID string) RequestFailure { - return newRequestError(err, statusCode, reqID) -} - -// UnmarshalError provides the interface for the SDK failing to unmarshal data. -type UnmarshalError interface { - awsError - Bytes() []byte -} - -// NewUnmarshalError returns an initialized UnmarshalError error wrapper adding -// the bytes that fail to unmarshal to the error. -func NewUnmarshalError(err error, msg string, bytes []byte) UnmarshalError { - return &unmarshalError{ - awsError: New("UnmarshalError", msg, err), - bytes: bytes, - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go b/vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go deleted file mode 100644 index 9cf7eaf40..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/awserr/types.go +++ /dev/null @@ -1,221 +0,0 @@ -package awserr - -import ( - "encoding/hex" - "fmt" -) - -// SprintError returns a string of the formatted error code. -// -// Both extra and origErr are optional. If they are included their lines -// will be added, but if they are not included their lines will be ignored. -func SprintError(code, message, extra string, origErr error) string { - msg := fmt.Sprintf("%s: %s", code, message) - if extra != "" { - msg = fmt.Sprintf("%s\n\t%s", msg, extra) - } - if origErr != nil { - msg = fmt.Sprintf("%s\ncaused by: %s", msg, origErr.Error()) - } - return msg -} - -// A baseError wraps the code and message which defines an error. It also -// can be used to wrap an original error object. -// -// Should be used as the root for errors satisfying the awserr.Error. Also -// for any error which does not fit into a specific error wrapper type. -type baseError struct { - // Classification of error - code string - - // Detailed information about error - message string - - // Optional original error this error is based off of. Allows building - // chained errors. - errs []error -} - -// newBaseError returns an error object for the code, message, and errors. -// -// code is a short no whitespace phrase depicting the classification of -// the error that is being created. -// -// message is the free flow string containing detailed information about the -// error. -// -// origErrs is the error objects which will be nested under the new errors to -// be returned. -func newBaseError(code, message string, origErrs []error) *baseError { - b := &baseError{ - code: code, - message: message, - errs: origErrs, - } - - return b -} - -// Error returns the string representation of the error. -// -// See ErrorWithExtra for formatting. -// -// Satisfies the error interface. -func (b baseError) Error() string { - size := len(b.errs) - if size > 0 { - return SprintError(b.code, b.message, "", errorList(b.errs)) - } - - return SprintError(b.code, b.message, "", nil) -} - -// String returns the string representation of the error. -// Alias for Error to satisfy the stringer interface. -func (b baseError) String() string { - return b.Error() -} - -// Code returns the short phrase depicting the classification of the error. -func (b baseError) Code() string { - return b.code -} - -// Message returns the error details message. -func (b baseError) Message() string { - return b.message -} - -// OrigErr returns the original error if one was set. Nil is returned if no -// error was set. This only returns the first element in the list. If the full -// list is needed, use BatchedErrors. -func (b baseError) OrigErr() error { - switch len(b.errs) { - case 0: - return nil - case 1: - return b.errs[0] - default: - if err, ok := b.errs[0].(Error); ok { - return NewBatchError(err.Code(), err.Message(), b.errs[1:]) - } - return NewBatchError("BatchedErrors", - "multiple errors occurred", b.errs) - } -} - -// OrigErrs returns the original errors if one was set. An empty slice is -// returned if no error was set. -func (b baseError) OrigErrs() []error { - return b.errs -} - -// So that the Error interface type can be included as an anonymous field -// in the requestError struct and not conflict with the error.Error() method. -type awsError Error - -// A requestError wraps a request or service error. -// -// Composed of baseError for code, message, and original error. -type requestError struct { - awsError - statusCode int - requestID string - bytes []byte -} - -// newRequestError returns a wrapped error with additional information for -// request status code, and service requestID. -// -// Should be used to wrap all request which involve service requests. Even if -// the request failed without a service response, but had an HTTP status code -// that may be meaningful. -// -// Also wraps original errors via the baseError. -func newRequestError(err Error, statusCode int, requestID string) *requestError { - return &requestError{ - awsError: err, - statusCode: statusCode, - requestID: requestID, - } -} - -// Error returns the string representation of the error. -// Satisfies the error interface. -func (r requestError) Error() string { - extra := fmt.Sprintf("status code: %d, request id: %s", - r.statusCode, r.requestID) - return SprintError(r.Code(), r.Message(), extra, r.OrigErr()) -} - -// String returns the string representation of the error. -// Alias for Error to satisfy the stringer interface. -func (r requestError) String() string { - return r.Error() -} - -// StatusCode returns the wrapped status code for the error -func (r requestError) StatusCode() int { - return r.statusCode -} - -// RequestID returns the wrapped requestID -func (r requestError) RequestID() string { - return r.requestID -} - -// OrigErrs returns the original errors if one was set. An empty slice is -// returned if no error was set. -func (r requestError) OrigErrs() []error { - if b, ok := r.awsError.(BatchedErrors); ok { - return b.OrigErrs() - } - return []error{r.OrigErr()} -} - -type unmarshalError struct { - awsError - bytes []byte -} - -// Error returns the string representation of the error. -// Satisfies the error interface. -func (e unmarshalError) Error() string { - extra := hex.Dump(e.bytes) - return SprintError(e.Code(), e.Message(), extra, e.OrigErr()) -} - -// String returns the string representation of the error. -// Alias for Error to satisfy the stringer interface. -func (e unmarshalError) String() string { - return e.Error() -} - -// Bytes returns the bytes that failed to unmarshal. -func (e unmarshalError) Bytes() []byte { - return e.bytes -} - -// An error list that satisfies the golang interface -type errorList []error - -// Error returns the string representation of the error. -// -// Satisfies the error interface. -func (e errorList) Error() string { - msg := "" - // How do we want to handle the array size being zero - if size := len(e); size > 0 { - for i := 0; i < size; i++ { - msg += e[i].Error() - // We check the next index to see if it is within the slice. - // If it is, then we append a newline. We do this, because unit tests - // could be broken with the additional '\n' - if i+1 < size { - msg += "\n" - } - } - } - return msg -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/copy.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/copy.go deleted file mode 100644 index 1a3d106d5..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/copy.go +++ /dev/null @@ -1,108 +0,0 @@ -package awsutil - -import ( - "io" - "reflect" - "time" -) - -// Copy deeply copies a src structure to dst. Useful for copying request and -// response structures. -// -// Can copy between structs of different type, but will only copy fields which -// are assignable, and exist in both structs. Fields which are not assignable, -// or do not exist in both structs are ignored. -func Copy(dst, src interface{}) { - dstval := reflect.ValueOf(dst) - if !dstval.IsValid() { - panic("Copy dst cannot be nil") - } - - rcopy(dstval, reflect.ValueOf(src), true) -} - -// CopyOf returns a copy of src while also allocating the memory for dst. -// src must be a pointer type or this operation will fail. -func CopyOf(src interface{}) (dst interface{}) { - dsti := reflect.New(reflect.TypeOf(src).Elem()) - dst = dsti.Interface() - rcopy(dsti, reflect.ValueOf(src), true) - return -} - -// rcopy performs a recursive copy of values from the source to destination. -// -// root is used to skip certain aspects of the copy which are not valid -// for the root node of a object. -func rcopy(dst, src reflect.Value, root bool) { - if !src.IsValid() { - return - } - - switch src.Kind() { - case reflect.Ptr: - if _, ok := src.Interface().(io.Reader); ok { - if dst.Kind() == reflect.Ptr && dst.Elem().CanSet() { - dst.Elem().Set(src) - } else if dst.CanSet() { - dst.Set(src) - } - } else { - e := src.Type().Elem() - if dst.CanSet() && !src.IsNil() { - if _, ok := src.Interface().(*time.Time); !ok { - dst.Set(reflect.New(e)) - } else { - tempValue := reflect.New(e) - tempValue.Elem().Set(src.Elem()) - // Sets time.Time's unexported values - dst.Set(tempValue) - } - } - if src.Elem().IsValid() { - // Keep the current root state since the depth hasn't changed - rcopy(dst.Elem(), src.Elem(), root) - } - } - case reflect.Struct: - t := dst.Type() - for i := 0; i < t.NumField(); i++ { - name := t.Field(i).Name - srcVal := src.FieldByName(name) - dstVal := dst.FieldByName(name) - if srcVal.IsValid() && dstVal.CanSet() { - rcopy(dstVal, srcVal, false) - } - } - case reflect.Slice: - if src.IsNil() { - break - } - - s := reflect.MakeSlice(src.Type(), src.Len(), src.Cap()) - dst.Set(s) - for i := 0; i < src.Len(); i++ { - rcopy(dst.Index(i), src.Index(i), false) - } - case reflect.Map: - if src.IsNil() { - break - } - - s := reflect.MakeMap(src.Type()) - dst.Set(s) - for _, k := range src.MapKeys() { - v := src.MapIndex(k) - v2 := reflect.New(v.Type()).Elem() - rcopy(v2, v, false) - dst.SetMapIndex(k, v2) - } - default: - // Assign the value if possible. If its not assignable, the value would - // need to be converted and the impact of that may be unexpected, or is - // not compatible with the dst type. - if src.Type().AssignableTo(dst.Type()) { - dst.Set(src) - } - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go deleted file mode 100644 index 142a7a01c..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/equal.go +++ /dev/null @@ -1,27 +0,0 @@ -package awsutil - -import ( - "reflect" -) - -// DeepEqual returns if the two values are deeply equal like reflect.DeepEqual. -// In addition to this, this method will also dereference the input values if -// possible so the DeepEqual performed will not fail if one parameter is a -// pointer and the other is not. -// -// DeepEqual will not perform indirection of nested values of the input parameters. -func DeepEqual(a, b interface{}) bool { - ra := reflect.Indirect(reflect.ValueOf(a)) - rb := reflect.Indirect(reflect.ValueOf(b)) - - if raValid, rbValid := ra.IsValid(), rb.IsValid(); !raValid && !rbValid { - // If the elements are both nil, and of the same type they are equal - // If they are of different types they are not equal - return reflect.TypeOf(a) == reflect.TypeOf(b) - } else if raValid != rbValid { - // Both values must be valid to be equal - return false - } - - return reflect.DeepEqual(ra.Interface(), rb.Interface()) -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go deleted file mode 100644 index 285e54d67..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/path_value.go +++ /dev/null @@ -1,221 +0,0 @@ -package awsutil - -import ( - "reflect" - "regexp" - "strconv" - "strings" - - "github.com/jmespath/go-jmespath" -) - -var indexRe = regexp.MustCompile(`(.+)\[(-?\d+)?\]$`) - -// rValuesAtPath returns a slice of values found in value v. The values -// in v are explored recursively so all nested values are collected. -func rValuesAtPath(v interface{}, path string, createPath, caseSensitive, nilTerm bool) []reflect.Value { - pathparts := strings.Split(path, "||") - if len(pathparts) > 1 { - for _, pathpart := range pathparts { - vals := rValuesAtPath(v, pathpart, createPath, caseSensitive, nilTerm) - if len(vals) > 0 { - return vals - } - } - return nil - } - - values := []reflect.Value{reflect.Indirect(reflect.ValueOf(v))} - components := strings.Split(path, ".") - for len(values) > 0 && len(components) > 0 { - var index *int64 - var indexStar bool - c := strings.TrimSpace(components[0]) - if c == "" { // no actual component, illegal syntax - return nil - } else if caseSensitive && c != "*" && strings.ToLower(c[0:1]) == c[0:1] { - // TODO normalize case for user - return nil // don't support unexported fields - } - - // parse this component - if m := indexRe.FindStringSubmatch(c); m != nil { - c = m[1] - if m[2] == "" { - index = nil - indexStar = true - } else { - i, _ := strconv.ParseInt(m[2], 10, 32) - index = &i - indexStar = false - } - } - - nextvals := []reflect.Value{} - for _, value := range values { - // pull component name out of struct member - if value.Kind() != reflect.Struct { - continue - } - - if c == "*" { // pull all members - for i := 0; i < value.NumField(); i++ { - if f := reflect.Indirect(value.Field(i)); f.IsValid() { - nextvals = append(nextvals, f) - } - } - continue - } - - value = value.FieldByNameFunc(func(name string) bool { - if c == name { - return true - } else if !caseSensitive && strings.ToLower(name) == strings.ToLower(c) { - return true - } - return false - }) - - if nilTerm && value.Kind() == reflect.Ptr && len(components[1:]) == 0 { - if !value.IsNil() { - value.Set(reflect.Zero(value.Type())) - } - return []reflect.Value{value} - } - - if createPath && value.Kind() == reflect.Ptr && value.IsNil() { - // TODO if the value is the terminus it should not be created - // if the value to be set to its position is nil. - value.Set(reflect.New(value.Type().Elem())) - value = value.Elem() - } else { - value = reflect.Indirect(value) - } - - if value.Kind() == reflect.Slice || value.Kind() == reflect.Map { - if !createPath && value.IsNil() { - value = reflect.ValueOf(nil) - } - } - - if value.IsValid() { - nextvals = append(nextvals, value) - } - } - values = nextvals - - if indexStar || index != nil { - nextvals = []reflect.Value{} - for _, valItem := range values { - value := reflect.Indirect(valItem) - if value.Kind() != reflect.Slice { - continue - } - - if indexStar { // grab all indices - for i := 0; i < value.Len(); i++ { - idx := reflect.Indirect(value.Index(i)) - if idx.IsValid() { - nextvals = append(nextvals, idx) - } - } - continue - } - - // pull out index - i := int(*index) - if i >= value.Len() { // check out of bounds - if createPath { - // TODO resize slice - } else { - continue - } - } else if i < 0 { // support negative indexing - i = value.Len() + i - } - value = reflect.Indirect(value.Index(i)) - - if value.Kind() == reflect.Slice || value.Kind() == reflect.Map { - if !createPath && value.IsNil() { - value = reflect.ValueOf(nil) - } - } - - if value.IsValid() { - nextvals = append(nextvals, value) - } - } - values = nextvals - } - - components = components[1:] - } - return values -} - -// ValuesAtPath returns a list of values at the case insensitive lexical -// path inside of a structure. -func ValuesAtPath(i interface{}, path string) ([]interface{}, error) { - result, err := jmespath.Search(path, i) - if err != nil { - return nil, err - } - - v := reflect.ValueOf(result) - if !v.IsValid() || (v.Kind() == reflect.Ptr && v.IsNil()) { - return nil, nil - } - if s, ok := result.([]interface{}); ok { - return s, err - } - if v.Kind() == reflect.Map && v.Len() == 0 { - return nil, nil - } - if v.Kind() == reflect.Slice { - out := make([]interface{}, v.Len()) - for i := 0; i < v.Len(); i++ { - out[i] = v.Index(i).Interface() - } - return out, nil - } - - return []interface{}{result}, nil -} - -// SetValueAtPath sets a value at the case insensitive lexical path inside -// of a structure. -func SetValueAtPath(i interface{}, path string, v interface{}) { - rvals := rValuesAtPath(i, path, true, false, v == nil) - for _, rval := range rvals { - if rval.Kind() == reflect.Ptr && rval.IsNil() { - continue - } - setValue(rval, v) - } -} - -func setValue(dstVal reflect.Value, src interface{}) { - if dstVal.Kind() == reflect.Ptr { - dstVal = reflect.Indirect(dstVal) - } - srcVal := reflect.ValueOf(src) - - if !srcVal.IsValid() { // src is literal nil - if dstVal.CanAddr() { - // Convert to pointer so that pointer's value can be nil'ed - // dstVal = dstVal.Addr() - } - dstVal.Set(reflect.Zero(dstVal.Type())) - - } else if srcVal.Kind() == reflect.Ptr { - if srcVal.IsNil() { - srcVal = reflect.Zero(dstVal.Type()) - } else { - srcVal = reflect.ValueOf(src).Elem() - } - dstVal.Set(srcVal) - } else { - dstVal.Set(srcVal) - } - -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/prettify.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/prettify.go deleted file mode 100644 index 710eb432f..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/prettify.go +++ /dev/null @@ -1,113 +0,0 @@ -package awsutil - -import ( - "bytes" - "fmt" - "io" - "reflect" - "strings" -) - -// Prettify returns the string representation of a value. -func Prettify(i interface{}) string { - var buf bytes.Buffer - prettify(reflect.ValueOf(i), 0, &buf) - return buf.String() -} - -// prettify will recursively walk value v to build a textual -// representation of the value. -func prettify(v reflect.Value, indent int, buf *bytes.Buffer) { - for v.Kind() == reflect.Ptr { - v = v.Elem() - } - - switch v.Kind() { - case reflect.Struct: - strtype := v.Type().String() - if strtype == "time.Time" { - fmt.Fprintf(buf, "%s", v.Interface()) - break - } else if strings.HasPrefix(strtype, "io.") { - buf.WriteString("") - break - } - - buf.WriteString("{\n") - - names := []string{} - for i := 0; i < v.Type().NumField(); i++ { - name := v.Type().Field(i).Name - f := v.Field(i) - if name[0:1] == strings.ToLower(name[0:1]) { - continue // ignore unexported fields - } - if (f.Kind() == reflect.Ptr || f.Kind() == reflect.Slice || f.Kind() == reflect.Map) && f.IsNil() { - continue // ignore unset fields - } - names = append(names, name) - } - - for i, n := range names { - val := v.FieldByName(n) - buf.WriteString(strings.Repeat(" ", indent+2)) - buf.WriteString(n + ": ") - prettify(val, indent+2, buf) - - if i < len(names)-1 { - buf.WriteString(",\n") - } - } - - buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") - case reflect.Slice: - strtype := v.Type().String() - if strtype == "[]uint8" { - fmt.Fprintf(buf, " len %d", v.Len()) - break - } - - nl, id, id2 := "", "", "" - if v.Len() > 3 { - nl, id, id2 = "\n", strings.Repeat(" ", indent), strings.Repeat(" ", indent+2) - } - buf.WriteString("[" + nl) - for i := 0; i < v.Len(); i++ { - buf.WriteString(id2) - prettify(v.Index(i), indent+2, buf) - - if i < v.Len()-1 { - buf.WriteString("," + nl) - } - } - - buf.WriteString(nl + id + "]") - case reflect.Map: - buf.WriteString("{\n") - - for i, k := range v.MapKeys() { - buf.WriteString(strings.Repeat(" ", indent+2)) - buf.WriteString(k.String() + ": ") - prettify(v.MapIndex(k), indent+2, buf) - - if i < v.Len()-1 { - buf.WriteString(",\n") - } - } - - buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") - default: - if !v.IsValid() { - fmt.Fprint(buf, "") - return - } - format := "%v" - switch v.Interface().(type) { - case string: - format = "%q" - case io.ReadSeeker, io.Reader: - format = "buffer(%p)" - } - fmt.Fprintf(buf, format, v.Interface()) - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go b/vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go deleted file mode 100644 index 645df2450..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/awsutil/string_value.go +++ /dev/null @@ -1,88 +0,0 @@ -package awsutil - -import ( - "bytes" - "fmt" - "reflect" - "strings" -) - -// StringValue returns the string representation of a value. -func StringValue(i interface{}) string { - var buf bytes.Buffer - stringValue(reflect.ValueOf(i), 0, &buf) - return buf.String() -} - -func stringValue(v reflect.Value, indent int, buf *bytes.Buffer) { - for v.Kind() == reflect.Ptr { - v = v.Elem() - } - - switch v.Kind() { - case reflect.Struct: - buf.WriteString("{\n") - - for i := 0; i < v.Type().NumField(); i++ { - ft := v.Type().Field(i) - fv := v.Field(i) - - if ft.Name[0:1] == strings.ToLower(ft.Name[0:1]) { - continue // ignore unexported fields - } - if (fv.Kind() == reflect.Ptr || fv.Kind() == reflect.Slice) && fv.IsNil() { - continue // ignore unset fields - } - - buf.WriteString(strings.Repeat(" ", indent+2)) - buf.WriteString(ft.Name + ": ") - - if tag := ft.Tag.Get("sensitive"); tag == "true" { - buf.WriteString("") - } else { - stringValue(fv, indent+2, buf) - } - - buf.WriteString(",\n") - } - - buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") - case reflect.Slice: - nl, id, id2 := "", "", "" - if v.Len() > 3 { - nl, id, id2 = "\n", strings.Repeat(" ", indent), strings.Repeat(" ", indent+2) - } - buf.WriteString("[" + nl) - for i := 0; i < v.Len(); i++ { - buf.WriteString(id2) - stringValue(v.Index(i), indent+2, buf) - - if i < v.Len()-1 { - buf.WriteString("," + nl) - } - } - - buf.WriteString(nl + id + "]") - case reflect.Map: - buf.WriteString("{\n") - - for i, k := range v.MapKeys() { - buf.WriteString(strings.Repeat(" ", indent+2)) - buf.WriteString(k.String() + ": ") - stringValue(v.MapIndex(k), indent+2, buf) - - if i < v.Len()-1 { - buf.WriteString(",\n") - } - } - - buf.WriteString("\n" + strings.Repeat(" ", indent) + "}") - default: - format := "%v" - switch v.Interface().(type) { - case string: - format = "%q" - } - fmt.Fprintf(buf, format, v.Interface()) - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/client.go b/vendor/github.com/aws/aws-sdk-go/aws/client/client.go deleted file mode 100644 index 709605384..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/client/client.go +++ /dev/null @@ -1,96 +0,0 @@ -package client - -import ( - "fmt" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/client/metadata" - "github.com/aws/aws-sdk-go/aws/request" -) - -// A Config provides configuration to a service client instance. -type Config struct { - Config *aws.Config - Handlers request.Handlers - Endpoint string - SigningRegion string - SigningName string - - // States that the signing name did not come from a modeled source but - // was derived based on other data. Used by service client constructors - // to determine if the signin name can be overridden based on metadata the - // service has. - SigningNameDerived bool -} - -// ConfigProvider provides a generic way for a service client to receive -// the ClientConfig without circular dependencies. -type ConfigProvider interface { - ClientConfig(serviceName string, cfgs ...*aws.Config) Config -} - -// ConfigNoResolveEndpointProvider same as ConfigProvider except it will not -// resolve the endpoint automatically. The service client's endpoint must be -// provided via the aws.Config.Endpoint field. -type ConfigNoResolveEndpointProvider interface { - ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) Config -} - -// A Client implements the base client request and response handling -// used by all service clients. -type Client struct { - request.Retryer - metadata.ClientInfo - - Config aws.Config - Handlers request.Handlers -} - -// New will return a pointer to a new initialized service client. -func New(cfg aws.Config, info metadata.ClientInfo, handlers request.Handlers, options ...func(*Client)) *Client { - svc := &Client{ - Config: cfg, - ClientInfo: info, - Handlers: handlers.Copy(), - } - - switch retryer, ok := cfg.Retryer.(request.Retryer); { - case ok: - svc.Retryer = retryer - case cfg.Retryer != nil && cfg.Logger != nil: - s := fmt.Sprintf("WARNING: %T does not implement request.Retryer; using DefaultRetryer instead", cfg.Retryer) - cfg.Logger.Log(s) - fallthrough - default: - maxRetries := aws.IntValue(cfg.MaxRetries) - if cfg.MaxRetries == nil || maxRetries == aws.UseServiceDefaultRetries { - maxRetries = 3 - } - svc.Retryer = DefaultRetryer{NumMaxRetries: maxRetries} - } - - svc.AddDebugHandlers() - - for _, option := range options { - option(svc) - } - - return svc -} - -// NewRequest returns a new Request pointer for the service API -// operation and parameters. -func (c *Client) NewRequest(operation *request.Operation, params interface{}, data interface{}) *request.Request { - return request.New(c.Config, c.ClientInfo, c.Handlers, c.Retryer, operation, params, data) -} - -// AddDebugHandlers injects debug logging handlers into the service to log request -// debug information. -func (c *Client) AddDebugHandlers() { - if !c.Config.LogLevel.AtLeast(aws.LogDebug) { - return - } - - c.Handlers.Send.PushFrontNamed(LogHTTPRequestHandler) - c.Handlers.Send.PushBackNamed(LogHTTPResponseHandler) -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go b/vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go deleted file mode 100644 index 0680e838c..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go +++ /dev/null @@ -1,106 +0,0 @@ -package client - -import ( - "strconv" - "time" - - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/internal/sdkrand" -) - -// DefaultRetryer implements basic retry logic using exponential backoff for -// most services. If you want to implement custom retry logic, implement the -// request.Retryer interface or create a structure type that composes this -// struct and override the specific methods. For example, to override only -// the MaxRetries method: -// -// type retryer struct { -// client.DefaultRetryer -// } -// -// // This implementation always has 100 max retries -// func (d retryer) MaxRetries() int { return 100 } -type DefaultRetryer struct { - NumMaxRetries int -} - -// MaxRetries returns the number of maximum returns the service will use to make -// an individual API request. -func (d DefaultRetryer) MaxRetries() int { - return d.NumMaxRetries -} - -// RetryRules returns the delay duration before retrying this request again -func (d DefaultRetryer) RetryRules(r *request.Request) time.Duration { - // Set the upper limit of delay in retrying at ~five minutes - var minTime int64 = 30 - var initialDelay time.Duration - - isThrottle := r.IsErrorThrottle() - if isThrottle { - if delay, ok := getRetryAfterDelay(r); ok { - initialDelay = delay - } - - minTime = 500 - } - - retryCount := r.RetryCount - if isThrottle && retryCount > 8 { - retryCount = 8 - } else if retryCount > 12 { - retryCount = 12 - } - - delay := (1 << uint(retryCount)) * (sdkrand.SeededRand.Int63n(minTime) + minTime) - return (time.Duration(delay) * time.Millisecond) + initialDelay - -} - -// ShouldRetry returns true if the request should be retried. -func (d DefaultRetryer) ShouldRetry(r *request.Request) bool { - // If one of the other handlers already set the retry state - // we don't want to override it based on the service's state - if r.Retryable != nil { - return *r.Retryable - } - - if r.HTTPResponse.StatusCode >= 500 && r.HTTPResponse.StatusCode != 501 { - return true - } - - return r.IsErrorRetryable() || r.IsErrorThrottle() -} - -// This will look in the Retry-After header, RFC 7231, for how long -// it will wait before attempting another request -func getRetryAfterDelay(r *request.Request) (time.Duration, bool) { - if !canUseRetryAfterHeader(r) { - return 0, false - } - - delayStr := r.HTTPResponse.Header.Get("Retry-After") - if len(delayStr) == 0 { - return 0, false - } - - delay, err := strconv.Atoi(delayStr) - if err != nil { - return 0, false - } - - return time.Duration(delay) * time.Second, true -} - -// Will look at the status code to see if the retry header pertains to -// the status code. -func canUseRetryAfterHeader(r *request.Request) bool { - switch r.HTTPResponse.StatusCode { - case 429: - case 503: - default: - return false - } - - return true -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/logger.go b/vendor/github.com/aws/aws-sdk-go/aws/client/logger.go deleted file mode 100644 index 8958c32d4..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/client/logger.go +++ /dev/null @@ -1,194 +0,0 @@ -package client - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/http/httputil" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/request" -) - -const logReqMsg = `DEBUG: Request %s/%s Details: ----[ REQUEST POST-SIGN ]----------------------------- -%s ------------------------------------------------------` - -const logReqErrMsg = `DEBUG ERROR: Request %s/%s: ----[ REQUEST DUMP ERROR ]----------------------------- -%s -------------------------------------------------------` - -type logWriter struct { - // Logger is what we will use to log the payload of a response. - Logger aws.Logger - // buf stores the contents of what has been read - buf *bytes.Buffer -} - -func (logger *logWriter) Write(b []byte) (int, error) { - return logger.buf.Write(b) -} - -type teeReaderCloser struct { - // io.Reader will be a tee reader that is used during logging. - // This structure will read from a body and write the contents to a logger. - io.Reader - // Source is used just to close when we are done reading. - Source io.ReadCloser -} - -func (reader *teeReaderCloser) Close() error { - return reader.Source.Close() -} - -// LogHTTPRequestHandler is a SDK request handler to log the HTTP request sent -// to a service. Will include the HTTP request body if the LogLevel of the -// request matches LogDebugWithHTTPBody. -var LogHTTPRequestHandler = request.NamedHandler{ - Name: "awssdk.client.LogRequest", - Fn: logRequest, -} - -func logRequest(r *request.Request) { - logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody) - bodySeekable := aws.IsReaderSeekable(r.Body) - - b, err := httputil.DumpRequestOut(r.HTTPRequest, logBody) - if err != nil { - r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg, - r.ClientInfo.ServiceName, r.Operation.Name, err)) - return - } - - if logBody { - if !bodySeekable { - r.SetReaderBody(aws.ReadSeekCloser(r.HTTPRequest.Body)) - } - // Reset the request body because dumpRequest will re-wrap the - // r.HTTPRequest's Body as a NoOpCloser and will not be reset after - // read by the HTTP client reader. - if err := r.Error; err != nil { - r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg, - r.ClientInfo.ServiceName, r.Operation.Name, err)) - return - } - } - - r.Config.Logger.Log(fmt.Sprintf(logReqMsg, - r.ClientInfo.ServiceName, r.Operation.Name, string(b))) -} - -// LogHTTPRequestHeaderHandler is a SDK request handler to log the HTTP request sent -// to a service. Will only log the HTTP request's headers. The request payload -// will not be read. -var LogHTTPRequestHeaderHandler = request.NamedHandler{ - Name: "awssdk.client.LogRequestHeader", - Fn: logRequestHeader, -} - -func logRequestHeader(r *request.Request) { - b, err := httputil.DumpRequestOut(r.HTTPRequest, false) - if err != nil { - r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg, - r.ClientInfo.ServiceName, r.Operation.Name, err)) - return - } - - r.Config.Logger.Log(fmt.Sprintf(logReqMsg, - r.ClientInfo.ServiceName, r.Operation.Name, string(b))) -} - -const logRespMsg = `DEBUG: Response %s/%s Details: ----[ RESPONSE ]-------------------------------------- -%s ------------------------------------------------------` - -const logRespErrMsg = `DEBUG ERROR: Response %s/%s: ----[ RESPONSE DUMP ERROR ]----------------------------- -%s ------------------------------------------------------` - -// LogHTTPResponseHandler is a SDK request handler to log the HTTP response -// received from a service. Will include the HTTP response body if the LogLevel -// of the request matches LogDebugWithHTTPBody. -var LogHTTPResponseHandler = request.NamedHandler{ - Name: "awssdk.client.LogResponse", - Fn: logResponse, -} - -func logResponse(r *request.Request) { - lw := &logWriter{r.Config.Logger, bytes.NewBuffer(nil)} - - if r.HTTPResponse == nil { - lw.Logger.Log(fmt.Sprintf(logRespErrMsg, - r.ClientInfo.ServiceName, r.Operation.Name, "request's HTTPResponse is nil")) - return - } - - logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody) - if logBody { - r.HTTPResponse.Body = &teeReaderCloser{ - Reader: io.TeeReader(r.HTTPResponse.Body, lw), - Source: r.HTTPResponse.Body, - } - } - - handlerFn := func(req *request.Request) { - b, err := httputil.DumpResponse(req.HTTPResponse, false) - if err != nil { - lw.Logger.Log(fmt.Sprintf(logRespErrMsg, - req.ClientInfo.ServiceName, req.Operation.Name, err)) - return - } - - lw.Logger.Log(fmt.Sprintf(logRespMsg, - req.ClientInfo.ServiceName, req.Operation.Name, string(b))) - - if logBody { - b, err := ioutil.ReadAll(lw.buf) - if err != nil { - lw.Logger.Log(fmt.Sprintf(logRespErrMsg, - req.ClientInfo.ServiceName, req.Operation.Name, err)) - return - } - - lw.Logger.Log(string(b)) - } - } - - const handlerName = "awsdk.client.LogResponse.ResponseBody" - - r.Handlers.Unmarshal.SetBackNamed(request.NamedHandler{ - Name: handlerName, Fn: handlerFn, - }) - r.Handlers.UnmarshalError.SetBackNamed(request.NamedHandler{ - Name: handlerName, Fn: handlerFn, - }) -} - -// LogHTTPResponseHeaderHandler is a SDK request handler to log the HTTP -// response received from a service. Will only log the HTTP response's headers. -// The response payload will not be read. -var LogHTTPResponseHeaderHandler = request.NamedHandler{ - Name: "awssdk.client.LogResponseHeader", - Fn: logResponseHeader, -} - -func logResponseHeader(r *request.Request) { - if r.Config.Logger == nil { - return - } - - b, err := httputil.DumpResponse(r.HTTPResponse, false) - if err != nil { - r.Config.Logger.Log(fmt.Sprintf(logRespErrMsg, - r.ClientInfo.ServiceName, r.Operation.Name, err)) - return - } - - r.Config.Logger.Log(fmt.Sprintf(logRespMsg, - r.ClientInfo.ServiceName, r.Operation.Name, string(b))) -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go b/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go deleted file mode 100644 index 920e9fddf..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/client/metadata/client_info.go +++ /dev/null @@ -1,13 +0,0 @@ -package metadata - -// ClientInfo wraps immutable data from the client.Client structure. -type ClientInfo struct { - ServiceName string - ServiceID string - APIVersion string - Endpoint string - SigningName string - SigningRegion string - JSONVersion string - TargetPrefix string -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/config.go b/vendor/github.com/aws/aws-sdk-go/aws/config.go deleted file mode 100644 index fd1e240f6..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/config.go +++ /dev/null @@ -1,536 +0,0 @@ -package aws - -import ( - "net/http" - "time" - - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/endpoints" -) - -// UseServiceDefaultRetries instructs the config to use the service's own -// default number of retries. This will be the default action if -// Config.MaxRetries is nil also. -const UseServiceDefaultRetries = -1 - -// RequestRetryer is an alias for a type that implements the request.Retryer -// interface. -type RequestRetryer interface{} - -// A Config provides service configuration for service clients. By default, -// all clients will use the defaults.DefaultConfig structure. -// -// // Create Session with MaxRetries configuration to be shared by multiple -// // service clients. -// sess := session.Must(session.NewSession(&aws.Config{ -// MaxRetries: aws.Int(3), -// })) -// -// // Create S3 service client with a specific Region. -// svc := s3.New(sess, &aws.Config{ -// Region: aws.String("us-west-2"), -// }) -type Config struct { - // Enables verbose error printing of all credential chain errors. - // Should be used when wanting to see all errors while attempting to - // retrieve credentials. - CredentialsChainVerboseErrors *bool - - // The credentials object to use when signing requests. Defaults to a - // chain of credential providers to search for credentials in environment - // variables, shared credential file, and EC2 Instance Roles. - Credentials *credentials.Credentials - - // An optional endpoint URL (hostname only or fully qualified URI) - // that overrides the default generated endpoint for a client. Set this - // to `""` to use the default generated endpoint. - // - // Note: You must still provide a `Region` value when specifying an - // endpoint for a client. - Endpoint *string - - // The resolver to use for looking up endpoints for AWS service clients - // to use based on region. - EndpointResolver endpoints.Resolver - - // EnforceShouldRetryCheck is used in the AfterRetryHandler to always call - // ShouldRetry regardless of whether or not if request.Retryable is set. - // This will utilize ShouldRetry method of custom retryers. If EnforceShouldRetryCheck - // is not set, then ShouldRetry will only be called if request.Retryable is nil. - // Proper handling of the request.Retryable field is important when setting this field. - EnforceShouldRetryCheck *bool - - // The region to send requests to. This parameter is required and must - // be configured globally or on a per-client basis unless otherwise - // noted. A full list of regions is found in the "Regions and Endpoints" - // document. - // - // See http://docs.aws.amazon.com/general/latest/gr/rande.html for AWS - // Regions and Endpoints. - Region *string - - // Set this to `true` to disable SSL when sending requests. Defaults - // to `false`. - DisableSSL *bool - - // The HTTP client to use when sending requests. Defaults to - // `http.DefaultClient`. - HTTPClient *http.Client - - // An integer value representing the logging level. The default log level - // is zero (LogOff), which represents no logging. To enable logging set - // to a LogLevel Value. - LogLevel *LogLevelType - - // The logger writer interface to write logging messages to. Defaults to - // standard out. - Logger Logger - - // The maximum number of times that a request will be retried for failures. - // Defaults to -1, which defers the max retry setting to the service - // specific configuration. - MaxRetries *int - - // Retryer guides how HTTP requests should be retried in case of - // recoverable failures. - // - // When nil or the value does not implement the request.Retryer interface, - // the client.DefaultRetryer will be used. - // - // When both Retryer and MaxRetries are non-nil, the former is used and - // the latter ignored. - // - // To set the Retryer field in a type-safe manner and with chaining, use - // the request.WithRetryer helper function: - // - // cfg := request.WithRetryer(aws.NewConfig(), myRetryer) - // - Retryer RequestRetryer - - // Disables semantic parameter validation, which validates input for - // missing required fields and/or other semantic request input errors. - DisableParamValidation *bool - - // Disables the computation of request and response checksums, e.g., - // CRC32 checksums in Amazon DynamoDB. - DisableComputeChecksums *bool - - // Set this to `true` to force the request to use path-style addressing, - // i.e., `http://s3.amazonaws.com/BUCKET/KEY`. By default, the S3 client - // will use virtual hosted bucket addressing when possible - // (`http://BUCKET.s3.amazonaws.com/KEY`). - // - // Note: This configuration option is specific to the Amazon S3 service. - // - // See http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html - // for Amazon S3: Virtual Hosting of Buckets - S3ForcePathStyle *bool - - // Set this to `true` to disable the SDK adding the `Expect: 100-Continue` - // header to PUT requests over 2MB of content. 100-Continue instructs the - // HTTP client not to send the body until the service responds with a - // `continue` status. This is useful to prevent sending the request body - // until after the request is authenticated, and validated. - // - // http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html - // - // 100-Continue is only enabled for Go 1.6 and above. See `http.Transport`'s - // `ExpectContinueTimeout` for information on adjusting the continue wait - // timeout. https://golang.org/pkg/net/http/#Transport - // - // You should use this flag to disble 100-Continue if you experience issues - // with proxies or third party S3 compatible services. - S3Disable100Continue *bool - - // Set this to `true` to enable S3 Accelerate feature. For all operations - // compatible with S3 Accelerate will use the accelerate endpoint for - // requests. Requests not compatible will fall back to normal S3 requests. - // - // The bucket must be enable for accelerate to be used with S3 client with - // accelerate enabled. If the bucket is not enabled for accelerate an error - // will be returned. The bucket name must be DNS compatible to also work - // with accelerate. - S3UseAccelerate *bool - - // S3DisableContentMD5Validation config option is temporarily disabled, - // For S3 GetObject API calls, #1837. - // - // Set this to `true` to disable the S3 service client from automatically - // adding the ContentMD5 to S3 Object Put and Upload API calls. This option - // will also disable the SDK from performing object ContentMD5 validation - // on GetObject API calls. - S3DisableContentMD5Validation *bool - - // Set this to `true` to disable the EC2Metadata client from overriding the - // default http.Client's Timeout. This is helpful if you do not want the - // EC2Metadata client to create a new http.Client. This options is only - // meaningful if you're not already using a custom HTTP client with the - // SDK. Enabled by default. - // - // Must be set and provided to the session.NewSession() in order to disable - // the EC2Metadata overriding the timeout for default credentials chain. - // - // Example: - // sess := session.Must(session.NewSession(aws.NewConfig() - // .WithEC2MetadataDiableTimeoutOverride(true))) - // - // svc := s3.New(sess) - // - EC2MetadataDisableTimeoutOverride *bool - - // Instructs the endpoint to be generated for a service client to - // be the dual stack endpoint. The dual stack endpoint will support - // both IPv4 and IPv6 addressing. - // - // Setting this for a service which does not support dual stack will fail - // to make requets. It is not recommended to set this value on the session - // as it will apply to all service clients created with the session. Even - // services which don't support dual stack endpoints. - // - // If the Endpoint config value is also provided the UseDualStack flag - // will be ignored. - // - // Only supported with. - // - // sess := session.Must(session.NewSession()) - // - // svc := s3.New(sess, &aws.Config{ - // UseDualStack: aws.Bool(true), - // }) - UseDualStack *bool - - // SleepDelay is an override for the func the SDK will call when sleeping - // during the lifecycle of a request. Specifically this will be used for - // request delays. This value should only be used for testing. To adjust - // the delay of a request see the aws/client.DefaultRetryer and - // aws/request.Retryer. - // - // SleepDelay will prevent any Context from being used for canceling retry - // delay of an API operation. It is recommended to not use SleepDelay at all - // and specify a Retryer instead. - SleepDelay func(time.Duration) - - // DisableRestProtocolURICleaning will not clean the URL path when making rest protocol requests. - // Will default to false. This would only be used for empty directory names in s3 requests. - // - // Example: - // sess := session.Must(session.NewSession(&aws.Config{ - // DisableRestProtocolURICleaning: aws.Bool(true), - // })) - // - // svc := s3.New(sess) - // out, err := svc.GetObject(&s3.GetObjectInput { - // Bucket: aws.String("bucketname"), - // Key: aws.String("//foo//bar//moo"), - // }) - DisableRestProtocolURICleaning *bool - - // EnableEndpointDiscovery will allow for endpoint discovery on operations that - // have the definition in its model. By default, endpoint discovery is off. - // - // Example: - // sess := session.Must(session.NewSession(&aws.Config{ - // EnableEndpointDiscovery: aws.Bool(true), - // })) - // - // svc := s3.New(sess) - // out, err := svc.GetObject(&s3.GetObjectInput { - // Bucket: aws.String("bucketname"), - // Key: aws.String("/foo/bar/moo"), - // }) - EnableEndpointDiscovery *bool - - // DisableEndpointHostPrefix will disable the SDK's behavior of prefixing - // request endpoint hosts with modeled information. - // - // Disabling this feature is useful when you want to use local endpoints - // for testing that do not support the modeled host prefix pattern. - DisableEndpointHostPrefix *bool -} - -// NewConfig returns a new Config pointer that can be chained with builder -// methods to set multiple configuration values inline without using pointers. -// -// // Create Session with MaxRetries configuration to be shared by multiple -// // service clients. -// sess := session.Must(session.NewSession(aws.NewConfig(). -// WithMaxRetries(3), -// )) -// -// // Create S3 service client with a specific Region. -// svc := s3.New(sess, aws.NewConfig(). -// WithRegion("us-west-2"), -// ) -func NewConfig() *Config { - return &Config{} -} - -// WithCredentialsChainVerboseErrors sets a config verbose errors boolean and returning -// a Config pointer. -func (c *Config) WithCredentialsChainVerboseErrors(verboseErrs bool) *Config { - c.CredentialsChainVerboseErrors = &verboseErrs - return c -} - -// WithCredentials sets a config Credentials value returning a Config pointer -// for chaining. -func (c *Config) WithCredentials(creds *credentials.Credentials) *Config { - c.Credentials = creds - return c -} - -// WithEndpoint sets a config Endpoint value returning a Config pointer for -// chaining. -func (c *Config) WithEndpoint(endpoint string) *Config { - c.Endpoint = &endpoint - return c -} - -// WithEndpointResolver sets a config EndpointResolver value returning a -// Config pointer for chaining. -func (c *Config) WithEndpointResolver(resolver endpoints.Resolver) *Config { - c.EndpointResolver = resolver - return c -} - -// WithRegion sets a config Region value returning a Config pointer for -// chaining. -func (c *Config) WithRegion(region string) *Config { - c.Region = ®ion - return c -} - -// WithDisableSSL sets a config DisableSSL value returning a Config pointer -// for chaining. -func (c *Config) WithDisableSSL(disable bool) *Config { - c.DisableSSL = &disable - return c -} - -// WithHTTPClient sets a config HTTPClient value returning a Config pointer -// for chaining. -func (c *Config) WithHTTPClient(client *http.Client) *Config { - c.HTTPClient = client - return c -} - -// WithMaxRetries sets a config MaxRetries value returning a Config pointer -// for chaining. -func (c *Config) WithMaxRetries(max int) *Config { - c.MaxRetries = &max - return c -} - -// WithDisableParamValidation sets a config DisableParamValidation value -// returning a Config pointer for chaining. -func (c *Config) WithDisableParamValidation(disable bool) *Config { - c.DisableParamValidation = &disable - return c -} - -// WithDisableComputeChecksums sets a config DisableComputeChecksums value -// returning a Config pointer for chaining. -func (c *Config) WithDisableComputeChecksums(disable bool) *Config { - c.DisableComputeChecksums = &disable - return c -} - -// WithLogLevel sets a config LogLevel value returning a Config pointer for -// chaining. -func (c *Config) WithLogLevel(level LogLevelType) *Config { - c.LogLevel = &level - return c -} - -// WithLogger sets a config Logger value returning a Config pointer for -// chaining. -func (c *Config) WithLogger(logger Logger) *Config { - c.Logger = logger - return c -} - -// WithS3ForcePathStyle sets a config S3ForcePathStyle value returning a Config -// pointer for chaining. -func (c *Config) WithS3ForcePathStyle(force bool) *Config { - c.S3ForcePathStyle = &force - return c -} - -// WithS3Disable100Continue sets a config S3Disable100Continue value returning -// a Config pointer for chaining. -func (c *Config) WithS3Disable100Continue(disable bool) *Config { - c.S3Disable100Continue = &disable - return c -} - -// WithS3UseAccelerate sets a config S3UseAccelerate value returning a Config -// pointer for chaining. -func (c *Config) WithS3UseAccelerate(enable bool) *Config { - c.S3UseAccelerate = &enable - return c - -} - -// WithS3DisableContentMD5Validation sets a config -// S3DisableContentMD5Validation value returning a Config pointer for chaining. -func (c *Config) WithS3DisableContentMD5Validation(enable bool) *Config { - c.S3DisableContentMD5Validation = &enable - return c - -} - -// WithUseDualStack sets a config UseDualStack value returning a Config -// pointer for chaining. -func (c *Config) WithUseDualStack(enable bool) *Config { - c.UseDualStack = &enable - return c -} - -// WithEC2MetadataDisableTimeoutOverride sets a config EC2MetadataDisableTimeoutOverride value -// returning a Config pointer for chaining. -func (c *Config) WithEC2MetadataDisableTimeoutOverride(enable bool) *Config { - c.EC2MetadataDisableTimeoutOverride = &enable - return c -} - -// WithSleepDelay overrides the function used to sleep while waiting for the -// next retry. Defaults to time.Sleep. -func (c *Config) WithSleepDelay(fn func(time.Duration)) *Config { - c.SleepDelay = fn - return c -} - -// WithEndpointDiscovery will set whether or not to use endpoint discovery. -func (c *Config) WithEndpointDiscovery(t bool) *Config { - c.EnableEndpointDiscovery = &t - return c -} - -// WithDisableEndpointHostPrefix will set whether or not to use modeled host prefix -// when making requests. -func (c *Config) WithDisableEndpointHostPrefix(t bool) *Config { - c.DisableEndpointHostPrefix = &t - return c -} - -// MergeIn merges the passed in configs into the existing config object. -func (c *Config) MergeIn(cfgs ...*Config) { - for _, other := range cfgs { - mergeInConfig(c, other) - } -} - -func mergeInConfig(dst *Config, other *Config) { - if other == nil { - return - } - - if other.CredentialsChainVerboseErrors != nil { - dst.CredentialsChainVerboseErrors = other.CredentialsChainVerboseErrors - } - - if other.Credentials != nil { - dst.Credentials = other.Credentials - } - - if other.Endpoint != nil { - dst.Endpoint = other.Endpoint - } - - if other.EndpointResolver != nil { - dst.EndpointResolver = other.EndpointResolver - } - - if other.Region != nil { - dst.Region = other.Region - } - - if other.DisableSSL != nil { - dst.DisableSSL = other.DisableSSL - } - - if other.HTTPClient != nil { - dst.HTTPClient = other.HTTPClient - } - - if other.LogLevel != nil { - dst.LogLevel = other.LogLevel - } - - if other.Logger != nil { - dst.Logger = other.Logger - } - - if other.MaxRetries != nil { - dst.MaxRetries = other.MaxRetries - } - - if other.Retryer != nil { - dst.Retryer = other.Retryer - } - - if other.DisableParamValidation != nil { - dst.DisableParamValidation = other.DisableParamValidation - } - - if other.DisableComputeChecksums != nil { - dst.DisableComputeChecksums = other.DisableComputeChecksums - } - - if other.S3ForcePathStyle != nil { - dst.S3ForcePathStyle = other.S3ForcePathStyle - } - - if other.S3Disable100Continue != nil { - dst.S3Disable100Continue = other.S3Disable100Continue - } - - if other.S3UseAccelerate != nil { - dst.S3UseAccelerate = other.S3UseAccelerate - } - - if other.S3DisableContentMD5Validation != nil { - dst.S3DisableContentMD5Validation = other.S3DisableContentMD5Validation - } - - if other.UseDualStack != nil { - dst.UseDualStack = other.UseDualStack - } - - if other.EC2MetadataDisableTimeoutOverride != nil { - dst.EC2MetadataDisableTimeoutOverride = other.EC2MetadataDisableTimeoutOverride - } - - if other.SleepDelay != nil { - dst.SleepDelay = other.SleepDelay - } - - if other.DisableRestProtocolURICleaning != nil { - dst.DisableRestProtocolURICleaning = other.DisableRestProtocolURICleaning - } - - if other.EnforceShouldRetryCheck != nil { - dst.EnforceShouldRetryCheck = other.EnforceShouldRetryCheck - } - - if other.EnableEndpointDiscovery != nil { - dst.EnableEndpointDiscovery = other.EnableEndpointDiscovery - } - - if other.DisableEndpointHostPrefix != nil { - dst.DisableEndpointHostPrefix = other.DisableEndpointHostPrefix - } -} - -// Copy will return a shallow copy of the Config object. If any additional -// configurations are provided they will be merged into the new config returned. -func (c *Config) Copy(cfgs ...*Config) *Config { - dst := &Config{} - dst.MergeIn(c) - - for _, cfg := range cfgs { - dst.MergeIn(cfg) - } - - return dst -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_1_5.go b/vendor/github.com/aws/aws-sdk-go/aws/context_1_5.go deleted file mode 100644 index 2866f9a7f..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/context_1_5.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build !go1.9 - -package aws - -import "time" - -// Context is an copy of the Go v1.7 stdlib's context.Context interface. -// It is represented as a SDK interface to enable you to use the "WithContext" -// API methods with Go v1.6 and a Context type such as golang.org/x/net/context. -// -// See https://golang.org/pkg/context on how to use contexts. -type Context interface { - // Deadline returns the time when work done on behalf of this context - // should be canceled. Deadline returns ok==false when no deadline is - // set. Successive calls to Deadline return the same results. - Deadline() (deadline time.Time, ok bool) - - // Done returns a channel that's closed when work done on behalf of this - // context should be canceled. Done may return nil if this context can - // never be canceled. Successive calls to Done return the same value. - Done() <-chan struct{} - - // Err returns a non-nil error value after Done is closed. Err returns - // Canceled if the context was canceled or DeadlineExceeded if the - // context's deadline passed. No other values for Err are defined. - // After Done is closed, successive calls to Err return the same value. - Err() error - - // Value returns the value associated with this context for key, or nil - // if no value is associated with key. Successive calls to Value with - // the same key returns the same result. - // - // Use context values only for request-scoped data that transits - // processes and API boundaries, not for passing optional parameters to - // functions. - Value(key interface{}) interface{} -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_1_9.go b/vendor/github.com/aws/aws-sdk-go/aws/context_1_9.go deleted file mode 100644 index 3718b26e1..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/context_1_9.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build go1.9 - -package aws - -import "context" - -// Context is an alias of the Go stdlib's context.Context interface. -// It can be used within the SDK's API operation "WithContext" methods. -// -// See https://golang.org/pkg/context on how to use contexts. -type Context = context.Context diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_5.go b/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_5.go deleted file mode 100644 index 66c5945db..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_5.go +++ /dev/null @@ -1,56 +0,0 @@ -// +build !go1.7 - -package aws - -import "time" - -// An emptyCtx is a copy of the Go 1.7 context.emptyCtx type. This is copied to -// provide a 1.6 and 1.5 safe version of context that is compatible with Go -// 1.7's Context. -// -// An emptyCtx is never canceled, has no values, and has no deadline. It is not -// struct{}, since vars of this type must have distinct addresses. -type emptyCtx int - -func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { - return -} - -func (*emptyCtx) Done() <-chan struct{} { - return nil -} - -func (*emptyCtx) Err() error { - return nil -} - -func (*emptyCtx) Value(key interface{}) interface{} { - return nil -} - -func (e *emptyCtx) String() string { - switch e { - case backgroundCtx: - return "aws.BackgroundContext" - } - return "unknown empty Context" -} - -var ( - backgroundCtx = new(emptyCtx) -) - -// BackgroundContext returns a context that will never be canceled, has no -// values, and no deadline. This context is used by the SDK to provide -// backwards compatibility with non-context API operations and functionality. -// -// Go 1.6 and before: -// This context function is equivalent to context.Background in the Go stdlib. -// -// Go 1.7 and later: -// The context returned will be the value returned by context.Background() -// -// See https://golang.org/pkg/context for more information on Contexts. -func BackgroundContext() Context { - return backgroundCtx -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_7.go b/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_7.go deleted file mode 100644 index 9c29f29af..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/context_background_1_7.go +++ /dev/null @@ -1,20 +0,0 @@ -// +build go1.7 - -package aws - -import "context" - -// BackgroundContext returns a context that will never be canceled, has no -// values, and no deadline. This context is used by the SDK to provide -// backwards compatibility with non-context API operations and functionality. -// -// Go 1.6 and before: -// This context function is equivalent to context.Background in the Go stdlib. -// -// Go 1.7 and later: -// The context returned will be the value returned by context.Background() -// -// See https://golang.org/pkg/context for more information on Contexts. -func BackgroundContext() Context { - return context.Background() -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/context_sleep.go b/vendor/github.com/aws/aws-sdk-go/aws/context_sleep.go deleted file mode 100644 index 304fd1561..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/context_sleep.go +++ /dev/null @@ -1,24 +0,0 @@ -package aws - -import ( - "time" -) - -// SleepWithContext will wait for the timer duration to expire, or the context -// is canceled. Which ever happens first. If the context is canceled the Context's -// error will be returned. -// -// Expects Context to always return a non-nil error if the Done channel is closed. -func SleepWithContext(ctx Context, dur time.Duration) error { - t := time.NewTimer(dur) - defer t.Stop() - - select { - case <-t.C: - break - case <-ctx.Done(): - return ctx.Err() - } - - return nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/convert_types.go b/vendor/github.com/aws/aws-sdk-go/aws/convert_types.go deleted file mode 100644 index ff5d58e06..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/convert_types.go +++ /dev/null @@ -1,387 +0,0 @@ -package aws - -import "time" - -// String returns a pointer to the string value passed in. -func String(v string) *string { - return &v -} - -// StringValue returns the value of the string pointer passed in or -// "" if the pointer is nil. -func StringValue(v *string) string { - if v != nil { - return *v - } - return "" -} - -// StringSlice converts a slice of string values into a slice of -// string pointers -func StringSlice(src []string) []*string { - dst := make([]*string, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// StringValueSlice converts a slice of string pointers into a slice of -// string values -func StringValueSlice(src []*string) []string { - dst := make([]string, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// StringMap converts a string map of string values into a string -// map of string pointers -func StringMap(src map[string]string) map[string]*string { - dst := make(map[string]*string) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// StringValueMap converts a string map of string pointers into a string -// map of string values -func StringValueMap(src map[string]*string) map[string]string { - dst := make(map[string]string) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Bool returns a pointer to the bool value passed in. -func Bool(v bool) *bool { - return &v -} - -// BoolValue returns the value of the bool pointer passed in or -// false if the pointer is nil. -func BoolValue(v *bool) bool { - if v != nil { - return *v - } - return false -} - -// BoolSlice converts a slice of bool values into a slice of -// bool pointers -func BoolSlice(src []bool) []*bool { - dst := make([]*bool, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// BoolValueSlice converts a slice of bool pointers into a slice of -// bool values -func BoolValueSlice(src []*bool) []bool { - dst := make([]bool, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// BoolMap converts a string map of bool values into a string -// map of bool pointers -func BoolMap(src map[string]bool) map[string]*bool { - dst := make(map[string]*bool) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// BoolValueMap converts a string map of bool pointers into a string -// map of bool values -func BoolValueMap(src map[string]*bool) map[string]bool { - dst := make(map[string]bool) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Int returns a pointer to the int value passed in. -func Int(v int) *int { - return &v -} - -// IntValue returns the value of the int pointer passed in or -// 0 if the pointer is nil. -func IntValue(v *int) int { - if v != nil { - return *v - } - return 0 -} - -// IntSlice converts a slice of int values into a slice of -// int pointers -func IntSlice(src []int) []*int { - dst := make([]*int, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// IntValueSlice converts a slice of int pointers into a slice of -// int values -func IntValueSlice(src []*int) []int { - dst := make([]int, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// IntMap converts a string map of int values into a string -// map of int pointers -func IntMap(src map[string]int) map[string]*int { - dst := make(map[string]*int) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// IntValueMap converts a string map of int pointers into a string -// map of int values -func IntValueMap(src map[string]*int) map[string]int { - dst := make(map[string]int) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Int64 returns a pointer to the int64 value passed in. -func Int64(v int64) *int64 { - return &v -} - -// Int64Value returns the value of the int64 pointer passed in or -// 0 if the pointer is nil. -func Int64Value(v *int64) int64 { - if v != nil { - return *v - } - return 0 -} - -// Int64Slice converts a slice of int64 values into a slice of -// int64 pointers -func Int64Slice(src []int64) []*int64 { - dst := make([]*int64, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// Int64ValueSlice converts a slice of int64 pointers into a slice of -// int64 values -func Int64ValueSlice(src []*int64) []int64 { - dst := make([]int64, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// Int64Map converts a string map of int64 values into a string -// map of int64 pointers -func Int64Map(src map[string]int64) map[string]*int64 { - dst := make(map[string]*int64) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// Int64ValueMap converts a string map of int64 pointers into a string -// map of int64 values -func Int64ValueMap(src map[string]*int64) map[string]int64 { - dst := make(map[string]int64) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Float64 returns a pointer to the float64 value passed in. -func Float64(v float64) *float64 { - return &v -} - -// Float64Value returns the value of the float64 pointer passed in or -// 0 if the pointer is nil. -func Float64Value(v *float64) float64 { - if v != nil { - return *v - } - return 0 -} - -// Float64Slice converts a slice of float64 values into a slice of -// float64 pointers -func Float64Slice(src []float64) []*float64 { - dst := make([]*float64, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// Float64ValueSlice converts a slice of float64 pointers into a slice of -// float64 values -func Float64ValueSlice(src []*float64) []float64 { - dst := make([]float64, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// Float64Map converts a string map of float64 values into a string -// map of float64 pointers -func Float64Map(src map[string]float64) map[string]*float64 { - dst := make(map[string]*float64) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// Float64ValueMap converts a string map of float64 pointers into a string -// map of float64 values -func Float64ValueMap(src map[string]*float64) map[string]float64 { - dst := make(map[string]float64) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Time returns a pointer to the time.Time value passed in. -func Time(v time.Time) *time.Time { - return &v -} - -// TimeValue returns the value of the time.Time pointer passed in or -// time.Time{} if the pointer is nil. -func TimeValue(v *time.Time) time.Time { - if v != nil { - return *v - } - return time.Time{} -} - -// SecondsTimeValue converts an int64 pointer to a time.Time value -// representing seconds since Epoch or time.Time{} if the pointer is nil. -func SecondsTimeValue(v *int64) time.Time { - if v != nil { - return time.Unix((*v / 1000), 0) - } - return time.Time{} -} - -// MillisecondsTimeValue converts an int64 pointer to a time.Time value -// representing milliseconds sinch Epoch or time.Time{} if the pointer is nil. -func MillisecondsTimeValue(v *int64) time.Time { - if v != nil { - return time.Unix(0, (*v * 1000000)) - } - return time.Time{} -} - -// TimeUnixMilli returns a Unix timestamp in milliseconds from "January 1, 1970 UTC". -// The result is undefined if the Unix time cannot be represented by an int64. -// Which includes calling TimeUnixMilli on a zero Time is undefined. -// -// This utility is useful for service API's such as CloudWatch Logs which require -// their unix time values to be in milliseconds. -// -// See Go stdlib https://golang.org/pkg/time/#Time.UnixNano for more information. -func TimeUnixMilli(t time.Time) int64 { - return t.UnixNano() / int64(time.Millisecond/time.Nanosecond) -} - -// TimeSlice converts a slice of time.Time values into a slice of -// time.Time pointers -func TimeSlice(src []time.Time) []*time.Time { - dst := make([]*time.Time, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// TimeValueSlice converts a slice of time.Time pointers into a slice of -// time.Time values -func TimeValueSlice(src []*time.Time) []time.Time { - dst := make([]time.Time, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// TimeMap converts a string map of time.Time values into a string -// map of time.Time pointers -func TimeMap(src map[string]time.Time) map[string]*time.Time { - dst := make(map[string]*time.Time) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// TimeValueMap converts a string map of time.Time pointers into a string -// map of time.Time values -func TimeValueMap(src map[string]*time.Time) map[string]time.Time { - dst := make(map[string]time.Time) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go deleted file mode 100644 index 0c60e612e..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go +++ /dev/null @@ -1,230 +0,0 @@ -package corehandlers - -import ( - "bytes" - "fmt" - "io/ioutil" - "net/http" - "net/url" - "regexp" - "strconv" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/request" -) - -// Interface for matching types which also have a Len method. -type lener interface { - Len() int -} - -// BuildContentLengthHandler builds the content length of a request based on the body, -// or will use the HTTPRequest.Header's "Content-Length" if defined. If unable -// to determine request body length and no "Content-Length" was specified it will panic. -// -// The Content-Length will only be added to the request if the length of the body -// is greater than 0. If the body is empty or the current `Content-Length` -// header is <= 0, the header will also be stripped. -var BuildContentLengthHandler = request.NamedHandler{Name: "core.BuildContentLengthHandler", Fn: func(r *request.Request) { - var length int64 - - if slength := r.HTTPRequest.Header.Get("Content-Length"); slength != "" { - length, _ = strconv.ParseInt(slength, 10, 64) - } else { - if r.Body != nil { - var err error - length, err = aws.SeekerLen(r.Body) - if err != nil { - r.Error = awserr.New(request.ErrCodeSerialization, "failed to get request body's length", err) - return - } - } - } - - if length > 0 { - r.HTTPRequest.ContentLength = length - r.HTTPRequest.Header.Set("Content-Length", fmt.Sprintf("%d", length)) - } else { - r.HTTPRequest.ContentLength = 0 - r.HTTPRequest.Header.Del("Content-Length") - } -}} - -var reStatusCode = regexp.MustCompile(`^(\d{3})`) - -// ValidateReqSigHandler is a request handler to ensure that the request's -// signature doesn't expire before it is sent. This can happen when a request -// is built and signed significantly before it is sent. Or significant delays -// occur when retrying requests that would cause the signature to expire. -var ValidateReqSigHandler = request.NamedHandler{ - Name: "core.ValidateReqSigHandler", - Fn: func(r *request.Request) { - // Unsigned requests are not signed - if r.Config.Credentials == credentials.AnonymousCredentials { - return - } - - signedTime := r.Time - if !r.LastSignedAt.IsZero() { - signedTime = r.LastSignedAt - } - - // 5 minutes to allow for some clock skew/delays in transmission. - // Would be improved with aws/aws-sdk-go#423 - if signedTime.Add(5 * time.Minute).After(time.Now()) { - return - } - - fmt.Println("request expired, resigning") - r.Sign() - }, -} - -// SendHandler is a request handler to send service request using HTTP client. -var SendHandler = request.NamedHandler{ - Name: "core.SendHandler", - Fn: func(r *request.Request) { - sender := sendFollowRedirects - if r.DisableFollowRedirects { - sender = sendWithoutFollowRedirects - } - - if request.NoBody == r.HTTPRequest.Body { - // Strip off the request body if the NoBody reader was used as a - // place holder for a request body. This prevents the SDK from - // making requests with a request body when it would be invalid - // to do so. - // - // Use a shallow copy of the http.Request to ensure the race condition - // of transport on Body will not trigger - reqOrig, reqCopy := r.HTTPRequest, *r.HTTPRequest - reqCopy.Body = nil - r.HTTPRequest = &reqCopy - defer func() { - r.HTTPRequest = reqOrig - }() - } - - var err error - r.HTTPResponse, err = sender(r) - if err != nil { - handleSendError(r, err) - } - }, -} - -func sendFollowRedirects(r *request.Request) (*http.Response, error) { - return r.Config.HTTPClient.Do(r.HTTPRequest) -} - -func sendWithoutFollowRedirects(r *request.Request) (*http.Response, error) { - transport := r.Config.HTTPClient.Transport - if transport == nil { - transport = http.DefaultTransport - } - - return transport.RoundTrip(r.HTTPRequest) -} - -func handleSendError(r *request.Request, err error) { - // Prevent leaking if an HTTPResponse was returned. Clean up - // the body. - if r.HTTPResponse != nil { - r.HTTPResponse.Body.Close() - } - // Capture the case where url.Error is returned for error processing - // response. e.g. 301 without location header comes back as string - // error and r.HTTPResponse is nil. Other URL redirect errors will - // comeback in a similar method. - if e, ok := err.(*url.Error); ok && e.Err != nil { - if s := reStatusCode.FindStringSubmatch(e.Err.Error()); s != nil { - code, _ := strconv.ParseInt(s[1], 10, 64) - r.HTTPResponse = &http.Response{ - StatusCode: int(code), - Status: http.StatusText(int(code)), - Body: ioutil.NopCloser(bytes.NewReader([]byte{})), - } - return - } - } - if r.HTTPResponse == nil { - // Add a dummy request response object to ensure the HTTPResponse - // value is consistent. - r.HTTPResponse = &http.Response{ - StatusCode: int(0), - Status: http.StatusText(int(0)), - Body: ioutil.NopCloser(bytes.NewReader([]byte{})), - } - } - // Catch all request errors, and let the default retrier determine - // if the error is retryable. - r.Error = awserr.New("RequestError", "send request failed", err) - - // Override the error with a context canceled error, if that was canceled. - ctx := r.Context() - select { - case <-ctx.Done(): - r.Error = awserr.New(request.CanceledErrorCode, - "request context canceled", ctx.Err()) - r.Retryable = aws.Bool(false) - default: - } -} - -// ValidateResponseHandler is a request handler to validate service response. -var ValidateResponseHandler = request.NamedHandler{Name: "core.ValidateResponseHandler", Fn: func(r *request.Request) { - if r.HTTPResponse.StatusCode == 0 || r.HTTPResponse.StatusCode >= 300 { - // this may be replaced by an UnmarshalError handler - r.Error = awserr.New("UnknownError", "unknown error", nil) - } -}} - -// AfterRetryHandler performs final checks to determine if the request should -// be retried and how long to delay. -var AfterRetryHandler = request.NamedHandler{ - Name: "core.AfterRetryHandler", - Fn: func(r *request.Request) { - // If one of the other handlers already set the retry state - // we don't want to override it based on the service's state - if r.Retryable == nil || aws.BoolValue(r.Config.EnforceShouldRetryCheck) { - r.Retryable = aws.Bool(r.ShouldRetry(r)) - } - - if r.WillRetry() { - r.RetryDelay = r.RetryRules(r) - - if sleepFn := r.Config.SleepDelay; sleepFn != nil { - // Support SleepDelay for backwards compatibility and testing - sleepFn(r.RetryDelay) - } else if err := aws.SleepWithContext(r.Context(), r.RetryDelay); err != nil { - r.Error = awserr.New(request.CanceledErrorCode, - "request context canceled", err) - r.Retryable = aws.Bool(false) - return - } - - // when the expired token exception occurs the credentials - // need to be expired locally so that the next request to - // get credentials will trigger a credentials refresh. - if r.IsErrorExpired() { - r.Config.Credentials.Expire() - } - - r.RetryCount++ - r.Error = nil - } - }} - -// ValidateEndpointHandler is a request handler to validate a request had the -// appropriate Region and Endpoint set. Will set r.Error if the endpoint or -// region is not valid. -var ValidateEndpointHandler = request.NamedHandler{Name: "core.ValidateEndpointHandler", Fn: func(r *request.Request) { - if r.ClientInfo.SigningRegion == "" && aws.StringValue(r.Config.Region) == "" { - r.Error = aws.ErrMissingRegion - } else if r.ClientInfo.Endpoint == "" { - r.Error = aws.ErrMissingEndpoint - } -}} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/param_validator.go b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/param_validator.go deleted file mode 100644 index 7d50b1557..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/param_validator.go +++ /dev/null @@ -1,17 +0,0 @@ -package corehandlers - -import "github.com/aws/aws-sdk-go/aws/request" - -// ValidateParametersHandler is a request handler to validate the input parameters. -// Validating parameters only has meaning if done prior to the request being sent. -var ValidateParametersHandler = request.NamedHandler{Name: "core.ValidateParametersHandler", Fn: func(r *request.Request) { - if !r.ParamsFilled() { - return - } - - if v, ok := r.Params.(request.Validator); ok { - if err := v.Validate(); err != nil { - r.Error = err - } - } -}} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go b/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go deleted file mode 100644 index ab69c7a6f..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go +++ /dev/null @@ -1,37 +0,0 @@ -package corehandlers - -import ( - "os" - "runtime" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/request" -) - -// SDKVersionUserAgentHandler is a request handler for adding the SDK Version -// to the user agent. -var SDKVersionUserAgentHandler = request.NamedHandler{ - Name: "core.SDKVersionUserAgentHandler", - Fn: request.MakeAddToUserAgentHandler(aws.SDKName, aws.SDKVersion, - runtime.Version(), runtime.GOOS, runtime.GOARCH), -} - -const execEnvVar = `AWS_EXECUTION_ENV` -const execEnvUAKey = `exec-env` - -// AddHostExecEnvUserAgentHander is a request handler appending the SDK's -// execution environment to the user agent. -// -// If the environment variable AWS_EXECUTION_ENV is set, its value will be -// appended to the user agent string. -var AddHostExecEnvUserAgentHander = request.NamedHandler{ - Name: "core.AddHostExecEnvUserAgentHander", - Fn: func(r *request.Request) { - v := os.Getenv(execEnvVar) - if len(v) == 0 { - return - } - - request.AddToUserAgent(r, execEnvUAKey+"/"+v) - }, -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go deleted file mode 100644 index 3ad1e798d..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go +++ /dev/null @@ -1,100 +0,0 @@ -package credentials - -import ( - "github.com/aws/aws-sdk-go/aws/awserr" -) - -var ( - // ErrNoValidProvidersFoundInChain Is returned when there are no valid - // providers in the ChainProvider. - // - // This has been deprecated. For verbose error messaging set - // aws.Config.CredentialsChainVerboseErrors to true. - ErrNoValidProvidersFoundInChain = awserr.New("NoCredentialProviders", - `no valid providers in chain. Deprecated. - For verbose messaging see aws.Config.CredentialsChainVerboseErrors`, - nil) -) - -// A ChainProvider will search for a provider which returns credentials -// and cache that provider until Retrieve is called again. -// -// The ChainProvider provides a way of chaining multiple providers together -// which will pick the first available using priority order of the Providers -// in the list. -// -// If none of the Providers retrieve valid credentials Value, ChainProvider's -// Retrieve() will return the error ErrNoValidProvidersFoundInChain. -// -// If a Provider is found which returns valid credentials Value ChainProvider -// will cache that Provider for all calls to IsExpired(), until Retrieve is -// called again. -// -// Example of ChainProvider to be used with an EnvProvider and EC2RoleProvider. -// In this example EnvProvider will first check if any credentials are available -// via the environment variables. If there are none ChainProvider will check -// the next Provider in the list, EC2RoleProvider in this case. If EC2RoleProvider -// does not return any credentials ChainProvider will return the error -// ErrNoValidProvidersFoundInChain -// -// creds := credentials.NewChainCredentials( -// []credentials.Provider{ -// &credentials.EnvProvider{}, -// &ec2rolecreds.EC2RoleProvider{ -// Client: ec2metadata.New(sess), -// }, -// }) -// -// // Usage of ChainCredentials with aws.Config -// svc := ec2.New(session.Must(session.NewSession(&aws.Config{ -// Credentials: creds, -// }))) -// -type ChainProvider struct { - Providers []Provider - curr Provider - VerboseErrors bool -} - -// NewChainCredentials returns a pointer to a new Credentials object -// wrapping a chain of providers. -func NewChainCredentials(providers []Provider) *Credentials { - return NewCredentials(&ChainProvider{ - Providers: append([]Provider{}, providers...), - }) -} - -// Retrieve returns the credentials value or error if no provider returned -// without error. -// -// If a provider is found it will be cached and any calls to IsExpired() -// will return the expired state of the cached provider. -func (c *ChainProvider) Retrieve() (Value, error) { - var errs []error - for _, p := range c.Providers { - creds, err := p.Retrieve() - if err == nil { - c.curr = p - return creds, nil - } - errs = append(errs, err) - } - c.curr = nil - - var err error - err = ErrNoValidProvidersFoundInChain - if c.VerboseErrors { - err = awserr.NewBatchError("NoCredentialProviders", "no valid providers in chain", errs) - } - return Value{}, err -} - -// IsExpired will returned the expired state of the currently cached provider -// if there is one. If there is no current provider, true will be returned. -func (c *ChainProvider) IsExpired() bool { - if c.curr != nil { - return c.curr.IsExpired() - } - - return true -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go deleted file mode 100644 index 4af592158..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go +++ /dev/null @@ -1,299 +0,0 @@ -// Package credentials provides credential retrieval and management -// -// The Credentials is the primary method of getting access to and managing -// credentials Values. Using dependency injection retrieval of the credential -// values is handled by a object which satisfies the Provider interface. -// -// By default the Credentials.Get() will cache the successful result of a -// Provider's Retrieve() until Provider.IsExpired() returns true. At which -// point Credentials will call Provider's Retrieve() to get new credential Value. -// -// The Provider is responsible for determining when credentials Value have expired. -// It is also important to note that Credentials will always call Retrieve the -// first time Credentials.Get() is called. -// -// Example of using the environment variable credentials. -// -// creds := credentials.NewEnvCredentials() -// -// // Retrieve the credentials value -// credValue, err := creds.Get() -// if err != nil { -// // handle error -// } -// -// Example of forcing credentials to expire and be refreshed on the next Get(). -// This may be helpful to proactively expire credentials and refresh them sooner -// than they would naturally expire on their own. -// -// creds := credentials.NewCredentials(&ec2rolecreds.EC2RoleProvider{}) -// creds.Expire() -// credsValue, err := creds.Get() -// // New credentials will be retrieved instead of from cache. -// -// -// Custom Provider -// -// Each Provider built into this package also provides a helper method to generate -// a Credentials pointer setup with the provider. To use a custom Provider just -// create a type which satisfies the Provider interface and pass it to the -// NewCredentials method. -// -// type MyProvider struct{} -// func (m *MyProvider) Retrieve() (Value, error) {...} -// func (m *MyProvider) IsExpired() bool {...} -// -// creds := credentials.NewCredentials(&MyProvider{}) -// credValue, err := creds.Get() -// -package credentials - -import ( - "fmt" - "sync" - "time" - - "github.com/aws/aws-sdk-go/aws/awserr" -) - -// AnonymousCredentials is an empty Credential object that can be used as -// dummy placeholder credentials for requests that do not need signed. -// -// This Credentials can be used to configure a service to not sign requests -// when making service API calls. For example, when accessing public -// s3 buckets. -// -// svc := s3.New(session.Must(session.NewSession(&aws.Config{ -// Credentials: credentials.AnonymousCredentials, -// }))) -// // Access public S3 buckets. -var AnonymousCredentials = NewStaticCredentials("", "", "") - -// A Value is the AWS credentials value for individual credential fields. -type Value struct { - // AWS Access key ID - AccessKeyID string - - // AWS Secret Access Key - SecretAccessKey string - - // AWS Session Token - SessionToken string - - // Provider used to get credentials - ProviderName string -} - -// HasKeys returns if the credentials Value has both AccessKeyID and -// SecretAccessKey value set. -func (v Value) HasKeys() bool { - return len(v.AccessKeyID) != 0 && len(v.SecretAccessKey) != 0 -} - -// A Provider is the interface for any component which will provide credentials -// Value. A provider is required to manage its own Expired state, and what to -// be expired means. -// -// The Provider should not need to implement its own mutexes, because -// that will be managed by Credentials. -type Provider interface { - // Retrieve returns nil if it successfully retrieved the value. - // Error is returned if the value were not obtainable, or empty. - Retrieve() (Value, error) - - // IsExpired returns if the credentials are no longer valid, and need - // to be retrieved. - IsExpired() bool -} - -// An Expirer is an interface that Providers can implement to expose the expiration -// time, if known. If the Provider cannot accurately provide this info, -// it should not implement this interface. -type Expirer interface { - // The time at which the credentials are no longer valid - ExpiresAt() time.Time -} - -// An ErrorProvider is a stub credentials provider that always returns an error -// this is used by the SDK when construction a known provider is not possible -// due to an error. -type ErrorProvider struct { - // The error to be returned from Retrieve - Err error - - // The provider name to set on the Retrieved returned Value - ProviderName string -} - -// Retrieve will always return the error that the ErrorProvider was created with. -func (p ErrorProvider) Retrieve() (Value, error) { - return Value{ProviderName: p.ProviderName}, p.Err -} - -// IsExpired will always return not expired. -func (p ErrorProvider) IsExpired() bool { - return false -} - -// A Expiry provides shared expiration logic to be used by credentials -// providers to implement expiry functionality. -// -// The best method to use this struct is as an anonymous field within the -// provider's struct. -// -// Example: -// type EC2RoleProvider struct { -// Expiry -// ... -// } -type Expiry struct { - // The date/time when to expire on - expiration time.Time - - // If set will be used by IsExpired to determine the current time. - // Defaults to time.Now if CurrentTime is not set. Available for testing - // to be able to mock out the current time. - CurrentTime func() time.Time -} - -// SetExpiration sets the expiration IsExpired will check when called. -// -// If window is greater than 0 the expiration time will be reduced by the -// window value. -// -// Using a window is helpful to trigger credentials to expire sooner than -// the expiration time given to ensure no requests are made with expired -// tokens. -func (e *Expiry) SetExpiration(expiration time.Time, window time.Duration) { - e.expiration = expiration - if window > 0 { - e.expiration = e.expiration.Add(-window) - } -} - -// IsExpired returns if the credentials are expired. -func (e *Expiry) IsExpired() bool { - curTime := e.CurrentTime - if curTime == nil { - curTime = time.Now - } - return e.expiration.Before(curTime()) -} - -// ExpiresAt returns the expiration time of the credential -func (e *Expiry) ExpiresAt() time.Time { - return e.expiration -} - -// A Credentials provides concurrency safe retrieval of AWS credentials Value. -// Credentials will cache the credentials value until they expire. Once the value -// expires the next Get will attempt to retrieve valid credentials. -// -// Credentials is safe to use across multiple goroutines and will manage the -// synchronous state so the Providers do not need to implement their own -// synchronization. -// -// The first Credentials.Get() will always call Provider.Retrieve() to get the -// first instance of the credentials Value. All calls to Get() after that -// will return the cached credentials Value until IsExpired() returns true. -type Credentials struct { - creds Value - forceRefresh bool - - m sync.RWMutex - - provider Provider -} - -// NewCredentials returns a pointer to a new Credentials with the provider set. -func NewCredentials(provider Provider) *Credentials { - return &Credentials{ - provider: provider, - forceRefresh: true, - } -} - -// Get returns the credentials value, or error if the credentials Value failed -// to be retrieved. -// -// Will return the cached credentials Value if it has not expired. If the -// credentials Value has expired the Provider's Retrieve() will be called -// to refresh the credentials. -// -// If Credentials.Expire() was called the credentials Value will be force -// expired, and the next call to Get() will cause them to be refreshed. -func (c *Credentials) Get() (Value, error) { - // Check the cached credentials first with just the read lock. - c.m.RLock() - if !c.isExpired() { - creds := c.creds - c.m.RUnlock() - return creds, nil - } - c.m.RUnlock() - - // Credentials are expired need to retrieve the credentials taking the full - // lock. - c.m.Lock() - defer c.m.Unlock() - - if c.isExpired() { - creds, err := c.provider.Retrieve() - if err != nil { - return Value{}, err - } - c.creds = creds - c.forceRefresh = false - } - - return c.creds, nil -} - -// Expire expires the credentials and forces them to be retrieved on the -// next call to Get(). -// -// This will override the Provider's expired state, and force Credentials -// to call the Provider's Retrieve(). -func (c *Credentials) Expire() { - c.m.Lock() - defer c.m.Unlock() - - c.forceRefresh = true -} - -// IsExpired returns if the credentials are no longer valid, and need -// to be retrieved. -// -// If the Credentials were forced to be expired with Expire() this will -// reflect that override. -func (c *Credentials) IsExpired() bool { - c.m.RLock() - defer c.m.RUnlock() - - return c.isExpired() -} - -// isExpired helper method wrapping the definition of expired credentials. -func (c *Credentials) isExpired() bool { - return c.forceRefresh || c.provider.IsExpired() -} - -// ExpiresAt provides access to the functionality of the Expirer interface of -// the underlying Provider, if it supports that interface. Otherwise, it returns -// an error. -func (c *Credentials) ExpiresAt() (time.Time, error) { - c.m.RLock() - defer c.m.RUnlock() - - expirer, ok := c.provider.(Expirer) - if !ok { - return time.Time{}, awserr.New("ProviderNotExpirer", - fmt.Sprintf("provider %s does not support ExpiresAt()", c.creds.ProviderName), - nil) - } - if c.forceRefresh { - // set expiration time to the distant past - return time.Time{}, nil - } - return expirer.ExpiresAt(), nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go deleted file mode 100644 index 43d4ed386..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go +++ /dev/null @@ -1,180 +0,0 @@ -package ec2rolecreds - -import ( - "bufio" - "encoding/json" - "fmt" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/client" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/ec2metadata" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/internal/sdkuri" -) - -// ProviderName provides a name of EC2Role provider -const ProviderName = "EC2RoleProvider" - -// A EC2RoleProvider retrieves credentials from the EC2 service, and keeps track if -// those credentials are expired. -// -// Example how to configure the EC2RoleProvider with custom http Client, Endpoint -// or ExpiryWindow -// -// p := &ec2rolecreds.EC2RoleProvider{ -// // Pass in a custom timeout to be used when requesting -// // IAM EC2 Role credentials. -// Client: ec2metadata.New(sess, aws.Config{ -// HTTPClient: &http.Client{Timeout: 10 * time.Second}, -// }), -// -// // Do not use early expiry of credentials. If a non zero value is -// // specified the credentials will be expired early -// ExpiryWindow: 0, -// } -type EC2RoleProvider struct { - credentials.Expiry - - // Required EC2Metadata client to use when connecting to EC2 metadata service. - Client *ec2metadata.EC2Metadata - - // ExpiryWindow will allow the credentials to trigger refreshing prior to - // the credentials actually expiring. This is beneficial so race conditions - // with expiring credentials do not cause request to fail unexpectedly - // due to ExpiredTokenException exceptions. - // - // So a ExpiryWindow of 10s would cause calls to IsExpired() to return true - // 10 seconds before the credentials are actually expired. - // - // If ExpiryWindow is 0 or less it will be ignored. - ExpiryWindow time.Duration -} - -// NewCredentials returns a pointer to a new Credentials object wrapping -// the EC2RoleProvider. Takes a ConfigProvider to create a EC2Metadata client. -// The ConfigProvider is satisfied by the session.Session type. -func NewCredentials(c client.ConfigProvider, options ...func(*EC2RoleProvider)) *credentials.Credentials { - p := &EC2RoleProvider{ - Client: ec2metadata.New(c), - } - - for _, option := range options { - option(p) - } - - return credentials.NewCredentials(p) -} - -// NewCredentialsWithClient returns a pointer to a new Credentials object wrapping -// the EC2RoleProvider. Takes a EC2Metadata client to use when connecting to EC2 -// metadata service. -func NewCredentialsWithClient(client *ec2metadata.EC2Metadata, options ...func(*EC2RoleProvider)) *credentials.Credentials { - p := &EC2RoleProvider{ - Client: client, - } - - for _, option := range options { - option(p) - } - - return credentials.NewCredentials(p) -} - -// Retrieve retrieves credentials from the EC2 service. -// Error will be returned if the request fails, or unable to extract -// the desired credentials. -func (m *EC2RoleProvider) Retrieve() (credentials.Value, error) { - credsList, err := requestCredList(m.Client) - if err != nil { - return credentials.Value{ProviderName: ProviderName}, err - } - - if len(credsList) == 0 { - return credentials.Value{ProviderName: ProviderName}, awserr.New("EmptyEC2RoleList", "empty EC2 Role list", nil) - } - credsName := credsList[0] - - roleCreds, err := requestCred(m.Client, credsName) - if err != nil { - return credentials.Value{ProviderName: ProviderName}, err - } - - m.SetExpiration(roleCreds.Expiration, m.ExpiryWindow) - - return credentials.Value{ - AccessKeyID: roleCreds.AccessKeyID, - SecretAccessKey: roleCreds.SecretAccessKey, - SessionToken: roleCreds.Token, - ProviderName: ProviderName, - }, nil -} - -// A ec2RoleCredRespBody provides the shape for unmarshaling credential -// request responses. -type ec2RoleCredRespBody struct { - // Success State - Expiration time.Time - AccessKeyID string - SecretAccessKey string - Token string - - // Error state - Code string - Message string -} - -const iamSecurityCredsPath = "iam/security-credentials/" - -// requestCredList requests a list of credentials from the EC2 service. -// If there are no credentials, or there is an error making or receiving the request -func requestCredList(client *ec2metadata.EC2Metadata) ([]string, error) { - resp, err := client.GetMetadata(iamSecurityCredsPath) - if err != nil { - return nil, awserr.New("EC2RoleRequestError", "no EC2 instance role found", err) - } - - credsList := []string{} - s := bufio.NewScanner(strings.NewReader(resp)) - for s.Scan() { - credsList = append(credsList, s.Text()) - } - - if err := s.Err(); err != nil { - return nil, awserr.New(request.ErrCodeSerialization, - "failed to read EC2 instance role from metadata service", err) - } - - return credsList, nil -} - -// requestCred requests the credentials for a specific credentials from the EC2 service. -// -// If the credentials cannot be found, or there is an error reading the response -// and error will be returned. -func requestCred(client *ec2metadata.EC2Metadata, credsName string) (ec2RoleCredRespBody, error) { - resp, err := client.GetMetadata(sdkuri.PathJoin(iamSecurityCredsPath, credsName)) - if err != nil { - return ec2RoleCredRespBody{}, - awserr.New("EC2RoleRequestError", - fmt.Sprintf("failed to get %s EC2 instance role credentials", credsName), - err) - } - - respCreds := ec2RoleCredRespBody{} - if err := json.NewDecoder(strings.NewReader(resp)).Decode(&respCreds); err != nil { - return ec2RoleCredRespBody{}, - awserr.New(request.ErrCodeSerialization, - fmt.Sprintf("failed to decode %s EC2 instance role credentials", credsName), - err) - } - - if respCreds.Code != "Success" { - // If an error code was returned something failed requesting the role. - return ec2RoleCredRespBody{}, awserr.New(respCreds.Code, respCreds.Message, nil) - } - - return respCreds, nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go deleted file mode 100644 index 1a7af53a4..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go +++ /dev/null @@ -1,203 +0,0 @@ -// Package endpointcreds provides support for retrieving credentials from an -// arbitrary HTTP endpoint. -// -// The credentials endpoint Provider can receive both static and refreshable -// credentials that will expire. Credentials are static when an "Expiration" -// value is not provided in the endpoint's response. -// -// Static credentials will never expire once they have been retrieved. The format -// of the static credentials response: -// { -// "AccessKeyId" : "MUA...", -// "SecretAccessKey" : "/7PC5om....", -// } -// -// Refreshable credentials will expire within the "ExpiryWindow" of the Expiration -// value in the response. The format of the refreshable credentials response: -// { -// "AccessKeyId" : "MUA...", -// "SecretAccessKey" : "/7PC5om....", -// "Token" : "AQoDY....=", -// "Expiration" : "2016-02-25T06:03:31Z" -// } -// -// Errors should be returned in the following format and only returned with 400 -// or 500 HTTP status codes. -// { -// "code": "ErrorCode", -// "message": "Helpful error message." -// } -package endpointcreds - -import ( - "encoding/json" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/client" - "github.com/aws/aws-sdk-go/aws/client/metadata" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/private/protocol/json/jsonutil" -) - -// ProviderName is the name of the credentials provider. -const ProviderName = `CredentialsEndpointProvider` - -// Provider satisfies the credentials.Provider interface, and is a client to -// retrieve credentials from an arbitrary endpoint. -type Provider struct { - staticCreds bool - credentials.Expiry - - // Requires a AWS Client to make HTTP requests to the endpoint with. - // the Endpoint the request will be made to is provided by the aws.Config's - // Endpoint value. - Client *client.Client - - // ExpiryWindow will allow the credentials to trigger refreshing prior to - // the credentials actually expiring. This is beneficial so race conditions - // with expiring credentials do not cause request to fail unexpectedly - // due to ExpiredTokenException exceptions. - // - // So a ExpiryWindow of 10s would cause calls to IsExpired() to return true - // 10 seconds before the credentials are actually expired. - // - // If ExpiryWindow is 0 or less it will be ignored. - ExpiryWindow time.Duration - - // Optional authorization token value if set will be used as the value of - // the Authorization header of the endpoint credential request. - AuthorizationToken string -} - -// NewProviderClient returns a credentials Provider for retrieving AWS credentials -// from arbitrary endpoint. -func NewProviderClient(cfg aws.Config, handlers request.Handlers, endpoint string, options ...func(*Provider)) credentials.Provider { - p := &Provider{ - Client: client.New( - cfg, - metadata.ClientInfo{ - ServiceName: "CredentialsEndpoint", - Endpoint: endpoint, - }, - handlers, - ), - } - - p.Client.Handlers.Unmarshal.PushBack(unmarshalHandler) - p.Client.Handlers.UnmarshalError.PushBack(unmarshalError) - p.Client.Handlers.Validate.Clear() - p.Client.Handlers.Validate.PushBack(validateEndpointHandler) - - for _, option := range options { - option(p) - } - - return p -} - -// NewCredentialsClient returns a pointer to a new Credentials object -// wrapping the endpoint credentials Provider. -func NewCredentialsClient(cfg aws.Config, handlers request.Handlers, endpoint string, options ...func(*Provider)) *credentials.Credentials { - return credentials.NewCredentials(NewProviderClient(cfg, handlers, endpoint, options...)) -} - -// IsExpired returns true if the credentials retrieved are expired, or not yet -// retrieved. -func (p *Provider) IsExpired() bool { - if p.staticCreds { - return false - } - return p.Expiry.IsExpired() -} - -// Retrieve will attempt to request the credentials from the endpoint the Provider -// was configured for. And error will be returned if the retrieval fails. -func (p *Provider) Retrieve() (credentials.Value, error) { - resp, err := p.getCredentials() - if err != nil { - return credentials.Value{ProviderName: ProviderName}, - awserr.New("CredentialsEndpointError", "failed to load credentials", err) - } - - if resp.Expiration != nil { - p.SetExpiration(*resp.Expiration, p.ExpiryWindow) - } else { - p.staticCreds = true - } - - return credentials.Value{ - AccessKeyID: resp.AccessKeyID, - SecretAccessKey: resp.SecretAccessKey, - SessionToken: resp.Token, - ProviderName: ProviderName, - }, nil -} - -type getCredentialsOutput struct { - Expiration *time.Time - AccessKeyID string - SecretAccessKey string - Token string -} - -type errorOutput struct { - Code string `json:"code"` - Message string `json:"message"` -} - -func (p *Provider) getCredentials() (*getCredentialsOutput, error) { - op := &request.Operation{ - Name: "GetCredentials", - HTTPMethod: "GET", - } - - out := &getCredentialsOutput{} - req := p.Client.NewRequest(op, nil, out) - req.HTTPRequest.Header.Set("Accept", "application/json") - if authToken := p.AuthorizationToken; len(authToken) != 0 { - req.HTTPRequest.Header.Set("Authorization", authToken) - } - - return out, req.Send() -} - -func validateEndpointHandler(r *request.Request) { - if len(r.ClientInfo.Endpoint) == 0 { - r.Error = aws.ErrMissingEndpoint - } -} - -func unmarshalHandler(r *request.Request) { - defer r.HTTPResponse.Body.Close() - - out := r.Data.(*getCredentialsOutput) - if err := json.NewDecoder(r.HTTPResponse.Body).Decode(&out); err != nil { - r.Error = awserr.New(request.ErrCodeSerialization, - "failed to decode endpoint credentials", - err, - ) - } -} - -func unmarshalError(r *request.Request) { - defer r.HTTPResponse.Body.Close() - - var errOut errorOutput - err := jsonutil.UnmarshalJSONError(&errOut, r.HTTPResponse.Body) - if err != nil { - r.Error = awserr.NewRequestFailure( - awserr.New(request.ErrCodeSerialization, - "failed to decode error message", err), - r.HTTPResponse.StatusCode, - r.RequestID, - ) - return - } - - // Response body format is not consistent between metadata endpoints. - // Grab the error message as a string and include that as the source error - r.Error = awserr.New(errOut.Code, errOut.Message, nil) -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go deleted file mode 100644 index 54c5cf733..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go +++ /dev/null @@ -1,74 +0,0 @@ -package credentials - -import ( - "os" - - "github.com/aws/aws-sdk-go/aws/awserr" -) - -// EnvProviderName provides a name of Env provider -const EnvProviderName = "EnvProvider" - -var ( - // ErrAccessKeyIDNotFound is returned when the AWS Access Key ID can't be - // found in the process's environment. - ErrAccessKeyIDNotFound = awserr.New("EnvAccessKeyNotFound", "AWS_ACCESS_KEY_ID or AWS_ACCESS_KEY not found in environment", nil) - - // ErrSecretAccessKeyNotFound is returned when the AWS Secret Access Key - // can't be found in the process's environment. - ErrSecretAccessKeyNotFound = awserr.New("EnvSecretNotFound", "AWS_SECRET_ACCESS_KEY or AWS_SECRET_KEY not found in environment", nil) -) - -// A EnvProvider retrieves credentials from the environment variables of the -// running process. Environment credentials never expire. -// -// Environment variables used: -// -// * Access Key ID: AWS_ACCESS_KEY_ID or AWS_ACCESS_KEY -// -// * Secret Access Key: AWS_SECRET_ACCESS_KEY or AWS_SECRET_KEY -type EnvProvider struct { - retrieved bool -} - -// NewEnvCredentials returns a pointer to a new Credentials object -// wrapping the environment variable provider. -func NewEnvCredentials() *Credentials { - return NewCredentials(&EnvProvider{}) -} - -// Retrieve retrieves the keys from the environment. -func (e *EnvProvider) Retrieve() (Value, error) { - e.retrieved = false - - id := os.Getenv("AWS_ACCESS_KEY_ID") - if id == "" { - id = os.Getenv("AWS_ACCESS_KEY") - } - - secret := os.Getenv("AWS_SECRET_ACCESS_KEY") - if secret == "" { - secret = os.Getenv("AWS_SECRET_KEY") - } - - if id == "" { - return Value{ProviderName: EnvProviderName}, ErrAccessKeyIDNotFound - } - - if secret == "" { - return Value{ProviderName: EnvProviderName}, ErrSecretAccessKeyNotFound - } - - e.retrieved = true - return Value{ - AccessKeyID: id, - SecretAccessKey: secret, - SessionToken: os.Getenv("AWS_SESSION_TOKEN"), - ProviderName: EnvProviderName, - }, nil -} - -// IsExpired returns if the credentials have been retrieved. -func (e *EnvProvider) IsExpired() bool { - return !e.retrieved -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini b/vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini deleted file mode 100644 index 7fc91d9d2..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/example.ini +++ /dev/null @@ -1,12 +0,0 @@ -[default] -aws_access_key_id = accessKey -aws_secret_access_key = secret -aws_session_token = token - -[no_token] -aws_access_key_id = accessKey -aws_secret_access_key = secret - -[with_colon] -aws_access_key_id: accessKey -aws_secret_access_key: secret diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go deleted file mode 100644 index 1980c8c14..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go +++ /dev/null @@ -1,425 +0,0 @@ -/* -Package processcreds is a credential Provider to retrieve `credential_process` -credentials. - -WARNING: The following describes a method of sourcing credentials from an external -process. This can potentially be dangerous, so proceed with caution. Other -credential providers should be preferred if at all possible. If using this -option, you should make sure that the config file is as locked down as possible -using security best practices for your operating system. - -You can use credentials from a `credential_process` in a variety of ways. - -One way is to setup your shared config file, located in the default -location, with the `credential_process` key and the command you want to be -called. You also need to set the AWS_SDK_LOAD_CONFIG environment variable -(e.g., `export AWS_SDK_LOAD_CONFIG=1`) to use the shared config file. - - [default] - credential_process = /command/to/call - -Creating a new session will use the credential process to retrieve credentials. -NOTE: If there are credentials in the profile you are using, the credential -process will not be used. - - // Initialize a session to load credentials. - sess, _ := session.NewSession(&aws.Config{ - Region: aws.String("us-east-1")}, - ) - - // Create S3 service client to use the credentials. - svc := s3.New(sess) - -Another way to use the `credential_process` method is by using -`credentials.NewCredentials()` and providing a command to be executed to -retrieve credentials: - - // Create credentials using the ProcessProvider. - creds := processcreds.NewCredentials("/path/to/command") - - // Create service client value configured for credentials. - svc := s3.New(sess, &aws.Config{Credentials: creds}) - -You can set a non-default timeout for the `credential_process` with another -constructor, `credentials.NewCredentialsTimeout()`, providing the timeout. To -set a one minute timeout: - - // Create credentials using the ProcessProvider. - creds := processcreds.NewCredentialsTimeout( - "/path/to/command", - time.Duration(500) * time.Millisecond) - -If you need more control, you can set any configurable options in the -credentials using one or more option functions. For example, you can set a two -minute timeout, a credential duration of 60 minutes, and a maximum stdout -buffer size of 2k. - - creds := processcreds.NewCredentials( - "/path/to/command", - func(opt *ProcessProvider) { - opt.Timeout = time.Duration(2) * time.Minute - opt.Duration = time.Duration(60) * time.Minute - opt.MaxBufSize = 2048 - }) - -You can also use your own `exec.Cmd`: - - // Create an exec.Cmd - myCommand := exec.Command("/path/to/command") - - // Create credentials using your exec.Cmd and custom timeout - creds := processcreds.NewCredentialsCommand( - myCommand, - func(opt *processcreds.ProcessProvider) { - opt.Timeout = time.Duration(1) * time.Second - }) -*/ -package processcreds - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "runtime" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/credentials" -) - -const ( - // ProviderName is the name this credentials provider will label any - // returned credentials Value with. - ProviderName = `ProcessProvider` - - // ErrCodeProcessProviderParse error parsing process output - ErrCodeProcessProviderParse = "ProcessProviderParseError" - - // ErrCodeProcessProviderVersion version error in output - ErrCodeProcessProviderVersion = "ProcessProviderVersionError" - - // ErrCodeProcessProviderRequired required attribute missing in output - ErrCodeProcessProviderRequired = "ProcessProviderRequiredError" - - // ErrCodeProcessProviderExecution execution of command failed - ErrCodeProcessProviderExecution = "ProcessProviderExecutionError" - - // errMsgProcessProviderTimeout process took longer than allowed - errMsgProcessProviderTimeout = "credential process timed out" - - // errMsgProcessProviderProcess process error - errMsgProcessProviderProcess = "error in credential_process" - - // errMsgProcessProviderParse problem parsing output - errMsgProcessProviderParse = "parse failed of credential_process output" - - // errMsgProcessProviderVersion version error in output - errMsgProcessProviderVersion = "wrong version in process output (not 1)" - - // errMsgProcessProviderMissKey missing access key id in output - errMsgProcessProviderMissKey = "missing AccessKeyId in process output" - - // errMsgProcessProviderMissSecret missing secret acess key in output - errMsgProcessProviderMissSecret = "missing SecretAccessKey in process output" - - // errMsgProcessProviderPrepareCmd prepare of command failed - errMsgProcessProviderPrepareCmd = "failed to prepare command" - - // errMsgProcessProviderEmptyCmd command must not be empty - errMsgProcessProviderEmptyCmd = "command must not be empty" - - // errMsgProcessProviderPipe failed to initialize pipe - errMsgProcessProviderPipe = "failed to initialize pipe" - - // DefaultDuration is the default amount of time in minutes that the - // credentials will be valid for. - DefaultDuration = time.Duration(15) * time.Minute - - // DefaultBufSize limits buffer size from growing to an enormous - // amount due to a faulty process. - DefaultBufSize = 1024 - - // DefaultTimeout default limit on time a process can run. - DefaultTimeout = time.Duration(1) * time.Minute -) - -// ProcessProvider satisfies the credentials.Provider interface, and is a -// client to retrieve credentials from a process. -type ProcessProvider struct { - staticCreds bool - credentials.Expiry - originalCommand []string - - // Expiry duration of the credentials. Defaults to 15 minutes if not set. - Duration time.Duration - - // ExpiryWindow will allow the credentials to trigger refreshing prior to - // the credentials actually expiring. This is beneficial so race conditions - // with expiring credentials do not cause request to fail unexpectedly - // due to ExpiredTokenException exceptions. - // - // So a ExpiryWindow of 10s would cause calls to IsExpired() to return true - // 10 seconds before the credentials are actually expired. - // - // If ExpiryWindow is 0 or less it will be ignored. - ExpiryWindow time.Duration - - // A string representing an os command that should return a JSON with - // credential information. - command *exec.Cmd - - // MaxBufSize limits memory usage from growing to an enormous - // amount due to a faulty process. - MaxBufSize int - - // Timeout limits the time a process can run. - Timeout time.Duration -} - -// NewCredentials returns a pointer to a new Credentials object wrapping the -// ProcessProvider. The credentials will expire every 15 minutes by default. -func NewCredentials(command string, options ...func(*ProcessProvider)) *credentials.Credentials { - p := &ProcessProvider{ - command: exec.Command(command), - Duration: DefaultDuration, - Timeout: DefaultTimeout, - MaxBufSize: DefaultBufSize, - } - - for _, option := range options { - option(p) - } - - return credentials.NewCredentials(p) -} - -// NewCredentialsTimeout returns a pointer to a new Credentials object with -// the specified command and timeout, and default duration and max buffer size. -func NewCredentialsTimeout(command string, timeout time.Duration) *credentials.Credentials { - p := NewCredentials(command, func(opt *ProcessProvider) { - opt.Timeout = timeout - }) - - return p -} - -// NewCredentialsCommand returns a pointer to a new Credentials object with -// the specified command, and default timeout, duration and max buffer size. -func NewCredentialsCommand(command *exec.Cmd, options ...func(*ProcessProvider)) *credentials.Credentials { - p := &ProcessProvider{ - command: command, - Duration: DefaultDuration, - Timeout: DefaultTimeout, - MaxBufSize: DefaultBufSize, - } - - for _, option := range options { - option(p) - } - - return credentials.NewCredentials(p) -} - -type credentialProcessResponse struct { - Version int - AccessKeyID string `json:"AccessKeyId"` - SecretAccessKey string - SessionToken string - Expiration *time.Time -} - -// Retrieve executes the 'credential_process' and returns the credentials. -func (p *ProcessProvider) Retrieve() (credentials.Value, error) { - out, err := p.executeCredentialProcess() - if err != nil { - return credentials.Value{ProviderName: ProviderName}, err - } - - // Serialize and validate response - resp := &credentialProcessResponse{} - if err = json.Unmarshal(out, resp); err != nil { - return credentials.Value{ProviderName: ProviderName}, awserr.New( - ErrCodeProcessProviderParse, - fmt.Sprintf("%s: %s", errMsgProcessProviderParse, string(out)), - err) - } - - if resp.Version != 1 { - return credentials.Value{ProviderName: ProviderName}, awserr.New( - ErrCodeProcessProviderVersion, - errMsgProcessProviderVersion, - nil) - } - - if len(resp.AccessKeyID) == 0 { - return credentials.Value{ProviderName: ProviderName}, awserr.New( - ErrCodeProcessProviderRequired, - errMsgProcessProviderMissKey, - nil) - } - - if len(resp.SecretAccessKey) == 0 { - return credentials.Value{ProviderName: ProviderName}, awserr.New( - ErrCodeProcessProviderRequired, - errMsgProcessProviderMissSecret, - nil) - } - - // Handle expiration - p.staticCreds = resp.Expiration == nil - if resp.Expiration != nil { - p.SetExpiration(*resp.Expiration, p.ExpiryWindow) - } - - return credentials.Value{ - ProviderName: ProviderName, - AccessKeyID: resp.AccessKeyID, - SecretAccessKey: resp.SecretAccessKey, - SessionToken: resp.SessionToken, - }, nil -} - -// IsExpired returns true if the credentials retrieved are expired, or not yet -// retrieved. -func (p *ProcessProvider) IsExpired() bool { - if p.staticCreds { - return false - } - return p.Expiry.IsExpired() -} - -// prepareCommand prepares the command to be executed. -func (p *ProcessProvider) prepareCommand() error { - - var cmdArgs []string - if runtime.GOOS == "windows" { - cmdArgs = []string{"cmd.exe", "/C"} - } else { - cmdArgs = []string{"sh", "-c"} - } - - if len(p.originalCommand) == 0 { - p.originalCommand = make([]string, len(p.command.Args)) - copy(p.originalCommand, p.command.Args) - - // check for empty command because it succeeds - if len(strings.TrimSpace(p.originalCommand[0])) < 1 { - return awserr.New( - ErrCodeProcessProviderExecution, - fmt.Sprintf( - "%s: %s", - errMsgProcessProviderPrepareCmd, - errMsgProcessProviderEmptyCmd), - nil) - } - } - - cmdArgs = append(cmdArgs, p.originalCommand...) - p.command = exec.Command(cmdArgs[0], cmdArgs[1:]...) - p.command.Env = os.Environ() - - return nil -} - -// executeCredentialProcess starts the credential process on the OS and -// returns the results or an error. -func (p *ProcessProvider) executeCredentialProcess() ([]byte, error) { - - if err := p.prepareCommand(); err != nil { - return nil, err - } - - // Setup the pipes - outReadPipe, outWritePipe, err := os.Pipe() - if err != nil { - return nil, awserr.New( - ErrCodeProcessProviderExecution, - errMsgProcessProviderPipe, - err) - } - - p.command.Stderr = os.Stderr // display stderr on console for MFA - p.command.Stdout = outWritePipe // get creds json on process's stdout - p.command.Stdin = os.Stdin // enable stdin for MFA - - output := bytes.NewBuffer(make([]byte, 0, p.MaxBufSize)) - - stdoutCh := make(chan error, 1) - go readInput( - io.LimitReader(outReadPipe, int64(p.MaxBufSize)), - output, - stdoutCh) - - execCh := make(chan error, 1) - go executeCommand(*p.command, execCh) - - finished := false - var errors []error - for !finished { - select { - case readError := <-stdoutCh: - errors = appendError(errors, readError) - finished = true - case execError := <-execCh: - err := outWritePipe.Close() - errors = appendError(errors, err) - errors = appendError(errors, execError) - if errors != nil { - return output.Bytes(), awserr.NewBatchError( - ErrCodeProcessProviderExecution, - errMsgProcessProviderProcess, - errors) - } - case <-time.After(p.Timeout): - finished = true - return output.Bytes(), awserr.NewBatchError( - ErrCodeProcessProviderExecution, - errMsgProcessProviderTimeout, - errors) // errors can be nil - } - } - - out := output.Bytes() - - if runtime.GOOS == "windows" { - // windows adds slashes to quotes - out = []byte(strings.Replace(string(out), `\"`, `"`, -1)) - } - - return out, nil -} - -// appendError conveniently checks for nil before appending slice -func appendError(errors []error, err error) []error { - if err != nil { - return append(errors, err) - } - return errors -} - -func executeCommand(cmd exec.Cmd, exec chan error) { - // Start the command - err := cmd.Start() - if err == nil { - err = cmd.Wait() - } - - exec <- err -} - -func readInput(r io.Reader, w io.Writer, read chan error) { - tee := io.TeeReader(r, w) - - _, err := ioutil.ReadAll(tee) - - if err == io.EOF { - err = nil - } - - read <- err // will only arrive here when write end of pipe is closed -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go deleted file mode 100644 index e15514958..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go +++ /dev/null @@ -1,150 +0,0 @@ -package credentials - -import ( - "fmt" - "os" - - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/internal/ini" - "github.com/aws/aws-sdk-go/internal/shareddefaults" -) - -// SharedCredsProviderName provides a name of SharedCreds provider -const SharedCredsProviderName = "SharedCredentialsProvider" - -var ( - // ErrSharedCredentialsHomeNotFound is emitted when the user directory cannot be found. - ErrSharedCredentialsHomeNotFound = awserr.New("UserHomeNotFound", "user home directory not found.", nil) -) - -// A SharedCredentialsProvider retrieves credentials from the current user's home -// directory, and keeps track if those credentials are expired. -// -// Profile ini file example: $HOME/.aws/credentials -type SharedCredentialsProvider struct { - // Path to the shared credentials file. - // - // If empty will look for "AWS_SHARED_CREDENTIALS_FILE" env variable. If the - // env value is empty will default to current user's home directory. - // Linux/OSX: "$HOME/.aws/credentials" - // Windows: "%USERPROFILE%\.aws\credentials" - Filename string - - // AWS Profile to extract credentials from the shared credentials file. If empty - // will default to environment variable "AWS_PROFILE" or "default" if - // environment variable is also not set. - Profile string - - // retrieved states if the credentials have been successfully retrieved. - retrieved bool -} - -// NewSharedCredentials returns a pointer to a new Credentials object -// wrapping the Profile file provider. -func NewSharedCredentials(filename, profile string) *Credentials { - return NewCredentials(&SharedCredentialsProvider{ - Filename: filename, - Profile: profile, - }) -} - -// Retrieve reads and extracts the shared credentials from the current -// users home directory. -func (p *SharedCredentialsProvider) Retrieve() (Value, error) { - p.retrieved = false - - filename, err := p.filename() - if err != nil { - return Value{ProviderName: SharedCredsProviderName}, err - } - - creds, err := loadProfile(filename, p.profile()) - if err != nil { - return Value{ProviderName: SharedCredsProviderName}, err - } - - p.retrieved = true - return creds, nil -} - -// IsExpired returns if the shared credentials have expired. -func (p *SharedCredentialsProvider) IsExpired() bool { - return !p.retrieved -} - -// loadProfiles loads from the file pointed to by shared credentials filename for profile. -// The credentials retrieved from the profile will be returned or error. Error will be -// returned if it fails to read from the file, or the data is invalid. -func loadProfile(filename, profile string) (Value, error) { - config, err := ini.OpenFile(filename) - if err != nil { - return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsLoad", "failed to load shared credentials file", err) - } - - iniProfile, ok := config.GetSection(profile) - if !ok { - return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsLoad", "failed to get profile", nil) - } - - id := iniProfile.String("aws_access_key_id") - if len(id) == 0 { - return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsAccessKey", - fmt.Sprintf("shared credentials %s in %s did not contain aws_access_key_id", profile, filename), - nil) - } - - secret := iniProfile.String("aws_secret_access_key") - if len(secret) == 0 { - return Value{ProviderName: SharedCredsProviderName}, awserr.New("SharedCredsSecret", - fmt.Sprintf("shared credentials %s in %s did not contain aws_secret_access_key", profile, filename), - nil) - } - - // Default to empty string if not found - token := iniProfile.String("aws_session_token") - - return Value{ - AccessKeyID: id, - SecretAccessKey: secret, - SessionToken: token, - ProviderName: SharedCredsProviderName, - }, nil -} - -// filename returns the filename to use to read AWS shared credentials. -// -// Will return an error if the user's home directory path cannot be found. -func (p *SharedCredentialsProvider) filename() (string, error) { - if len(p.Filename) != 0 { - return p.Filename, nil - } - - if p.Filename = os.Getenv("AWS_SHARED_CREDENTIALS_FILE"); len(p.Filename) != 0 { - return p.Filename, nil - } - - if home := shareddefaults.UserHomeDir(); len(home) == 0 { - // Backwards compatibility of home directly not found error being returned. - // This error is too verbose, failure when opening the file would of been - // a better error to return. - return "", ErrSharedCredentialsHomeNotFound - } - - p.Filename = shareddefaults.SharedCredentialsFilename() - - return p.Filename, nil -} - -// profile returns the AWS shared credentials profile. If empty will read -// environment variable "AWS_PROFILE". If that is not set profile will -// return "default". -func (p *SharedCredentialsProvider) profile() string { - if p.Profile == "" { - p.Profile = os.Getenv("AWS_PROFILE") - } - if p.Profile == "" { - p.Profile = "default" - } - - return p.Profile -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go deleted file mode 100644 index 531139e39..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/static_provider.go +++ /dev/null @@ -1,55 +0,0 @@ -package credentials - -import ( - "github.com/aws/aws-sdk-go/aws/awserr" -) - -// StaticProviderName provides a name of Static provider -const StaticProviderName = "StaticProvider" - -var ( - // ErrStaticCredentialsEmpty is emitted when static credentials are empty. - ErrStaticCredentialsEmpty = awserr.New("EmptyStaticCreds", "static credentials are empty", nil) -) - -// A StaticProvider is a set of credentials which are set programmatically, -// and will never expire. -type StaticProvider struct { - Value -} - -// NewStaticCredentials returns a pointer to a new Credentials object -// wrapping a static credentials value provider. -func NewStaticCredentials(id, secret, token string) *Credentials { - return NewCredentials(&StaticProvider{Value: Value{ - AccessKeyID: id, - SecretAccessKey: secret, - SessionToken: token, - }}) -} - -// NewStaticCredentialsFromCreds returns a pointer to a new Credentials object -// wrapping the static credentials value provide. Same as NewStaticCredentials -// but takes the creds Value instead of individual fields -func NewStaticCredentialsFromCreds(creds Value) *Credentials { - return NewCredentials(&StaticProvider{Value: creds}) -} - -// Retrieve returns the credentials or error if the credentials are invalid. -func (s *StaticProvider) Retrieve() (Value, error) { - if s.AccessKeyID == "" || s.SecretAccessKey == "" { - return Value{ProviderName: StaticProviderName}, ErrStaticCredentialsEmpty - } - - if len(s.Value.ProviderName) == 0 { - s.Value.ProviderName = StaticProviderName - } - return s.Value, nil -} - -// IsExpired returns if the credentials are expired. -// -// For StaticProvider, the credentials never expired. -func (s *StaticProvider) IsExpired() bool { - return false -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go deleted file mode 100644 index 2e528d130..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go +++ /dev/null @@ -1,312 +0,0 @@ -/* -Package stscreds are credential Providers to retrieve STS AWS credentials. - -STS provides multiple ways to retrieve credentials which can be used when making -future AWS service API operation calls. - -The SDK will ensure that per instance of credentials.Credentials all requests -to refresh the credentials will be synchronized. But, the SDK is unable to -ensure synchronous usage of the AssumeRoleProvider if the value is shared -between multiple Credentials, Sessions or service clients. - -Assume Role - -To assume an IAM role using STS with the SDK you can create a new Credentials -with the SDKs's stscreds package. - - // Initial credentials loaded from SDK's default credential chain. Such as - // the environment, shared credentials (~/.aws/credentials), or EC2 Instance - // Role. These credentials will be used to to make the STS Assume Role API. - sess := session.Must(session.NewSession()) - - // Create the credentials from AssumeRoleProvider to assume the role - // referenced by the "myRoleARN" ARN. - creds := stscreds.NewCredentials(sess, "myRoleArn") - - // Create service client value configured for credentials - // from assumed role. - svc := s3.New(sess, &aws.Config{Credentials: creds}) - -Assume Role with static MFA Token - -To assume an IAM role with a MFA token you can either specify a MFA token code -directly or provide a function to prompt the user each time the credentials -need to refresh the role's credentials. Specifying the TokenCode should be used -for short lived operations that will not need to be refreshed, and when you do -not want to have direct control over the user provides their MFA token. - -With TokenCode the AssumeRoleProvider will be not be able to refresh the role's -credentials. - - // Create the credentials from AssumeRoleProvider to assume the role - // referenced by the "myRoleARN" ARN using the MFA token code provided. - creds := stscreds.NewCredentials(sess, "myRoleArn", func(p *stscreds.AssumeRoleProvider) { - p.SerialNumber = aws.String("myTokenSerialNumber") - p.TokenCode = aws.String("00000000") - }) - - // Create service client value configured for credentials - // from assumed role. - svc := s3.New(sess, &aws.Config{Credentials: creds}) - -Assume Role with MFA Token Provider - -To assume an IAM role with MFA for longer running tasks where the credentials -may need to be refreshed setting the TokenProvider field of AssumeRoleProvider -will allow the credential provider to prompt for new MFA token code when the -role's credentials need to be refreshed. - -The StdinTokenProvider function is available to prompt on stdin to retrieve -the MFA token code from the user. You can also implement custom prompts by -satisfing the TokenProvider function signature. - -Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will -have undesirable results as the StdinTokenProvider will not be synchronized. A -single Credentials with an AssumeRoleProvider can be shared safely. - - // Create the credentials from AssumeRoleProvider to assume the role - // referenced by the "myRoleARN" ARN. Prompting for MFA token from stdin. - creds := stscreds.NewCredentials(sess, "myRoleArn", func(p *stscreds.AssumeRoleProvider) { - p.SerialNumber = aws.String("myTokenSerialNumber") - p.TokenProvider = stscreds.StdinTokenProvider - }) - - // Create service client value configured for credentials - // from assumed role. - svc := s3.New(sess, &aws.Config{Credentials: creds}) - -*/ -package stscreds - -import ( - "fmt" - "os" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/client" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/internal/sdkrand" - "github.com/aws/aws-sdk-go/service/sts" -) - -// StdinTokenProvider will prompt on stderr and read from stdin for a string value. -// An error is returned if reading from stdin fails. -// -// Use this function go read MFA tokens from stdin. The function makes no attempt -// to make atomic prompts from stdin across multiple gorouties. -// -// Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will -// have undesirable results as the StdinTokenProvider will not be synchronized. A -// single Credentials with an AssumeRoleProvider can be shared safely -// -// Will wait forever until something is provided on the stdin. -func StdinTokenProvider() (string, error) { - var v string - fmt.Fprintf(os.Stderr, "Assume Role MFA token code: ") - _, err := fmt.Scanln(&v) - - return v, err -} - -// ProviderName provides a name of AssumeRole provider -const ProviderName = "AssumeRoleProvider" - -// AssumeRoler represents the minimal subset of the STS client API used by this provider. -type AssumeRoler interface { - AssumeRole(input *sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error) -} - -// DefaultDuration is the default amount of time in minutes that the credentials -// will be valid for. -var DefaultDuration = time.Duration(15) * time.Minute - -// AssumeRoleProvider retrieves temporary credentials from the STS service, and -// keeps track of their expiration time. -// -// This credential provider will be used by the SDKs default credential change -// when shared configuration is enabled, and the shared config or shared credentials -// file configure assume role. See Session docs for how to do this. -// -// AssumeRoleProvider does not provide any synchronization and it is not safe -// to share this value across multiple Credentials, Sessions, or service clients -// without also sharing the same Credentials instance. -type AssumeRoleProvider struct { - credentials.Expiry - - // STS client to make assume role request with. - Client AssumeRoler - - // Role to be assumed. - RoleARN string - - // Session name, if you wish to reuse the credentials elsewhere. - RoleSessionName string - - // Expiry duration of the STS credentials. Defaults to 15 minutes if not set. - Duration time.Duration - - // Optional ExternalID to pass along, defaults to nil if not set. - ExternalID *string - - // The policy plain text must be 2048 bytes or shorter. However, an internal - // conversion compresses it into a packed binary format with a separate limit. - // The PackedPolicySize response element indicates by percentage how close to - // the upper size limit the policy is, with 100% equaling the maximum allowed - // size. - Policy *string - - // The identification number of the MFA device that is associated with the user - // who is making the AssumeRole call. Specify this value if the trust policy - // of the role being assumed includes a condition that requires MFA authentication. - // The value is either the serial number for a hardware device (such as GAHT12345678) - // or an Amazon Resource Name (ARN) for a virtual device (such as arn:aws:iam::123456789012:mfa/user). - SerialNumber *string - - // The value provided by the MFA device, if the trust policy of the role being - // assumed requires MFA (that is, if the policy includes a condition that tests - // for MFA). If the role being assumed requires MFA and if the TokenCode value - // is missing or expired, the AssumeRole call returns an "access denied" error. - // - // If SerialNumber is set and neither TokenCode nor TokenProvider are also - // set an error will be returned. - TokenCode *string - - // Async method of providing MFA token code for assuming an IAM role with MFA. - // The value returned by the function will be used as the TokenCode in the Retrieve - // call. See StdinTokenProvider for a provider that prompts and reads from stdin. - // - // This token provider will be called when ever the assumed role's - // credentials need to be refreshed when SerialNumber is also set and - // TokenCode is not set. - // - // If both TokenCode and TokenProvider is set, TokenProvider will be used and - // TokenCode is ignored. - TokenProvider func() (string, error) - - // ExpiryWindow will allow the credentials to trigger refreshing prior to - // the credentials actually expiring. This is beneficial so race conditions - // with expiring credentials do not cause request to fail unexpectedly - // due to ExpiredTokenException exceptions. - // - // So a ExpiryWindow of 10s would cause calls to IsExpired() to return true - // 10 seconds before the credentials are actually expired. - // - // If ExpiryWindow is 0 or less it will be ignored. - ExpiryWindow time.Duration - - // MaxJitterFrac reduces the effective Duration of each credential requested - // by a random percentage between 0 and MaxJitterFraction. MaxJitterFrac must - // have a value between 0 and 1. Any other value may lead to expected behavior. - // With a MaxJitterFrac value of 0, default) will no jitter will be used. - // - // For example, with a Duration of 30m and a MaxJitterFrac of 0.1, the - // AssumeRole call will be made with an arbitrary Duration between 27m and - // 30m. - // - // MaxJitterFrac should not be negative. - MaxJitterFrac float64 -} - -// NewCredentials returns a pointer to a new Credentials object wrapping the -// AssumeRoleProvider. The credentials will expire every 15 minutes and the -// role will be named after a nanosecond timestamp of this operation. -// -// Takes a Config provider to create the STS client. The ConfigProvider is -// satisfied by the session.Session type. -// -// It is safe to share the returned Credentials with multiple Sessions and -// service clients. All access to the credentials and refreshing them -// will be synchronized. -func NewCredentials(c client.ConfigProvider, roleARN string, options ...func(*AssumeRoleProvider)) *credentials.Credentials { - p := &AssumeRoleProvider{ - Client: sts.New(c), - RoleARN: roleARN, - Duration: DefaultDuration, - } - - for _, option := range options { - option(p) - } - - return credentials.NewCredentials(p) -} - -// NewCredentialsWithClient returns a pointer to a new Credentials object wrapping the -// AssumeRoleProvider. The credentials will expire every 15 minutes and the -// role will be named after a nanosecond timestamp of this operation. -// -// Takes an AssumeRoler which can be satisfied by the STS client. -// -// It is safe to share the returned Credentials with multiple Sessions and -// service clients. All access to the credentials and refreshing them -// will be synchronized. -func NewCredentialsWithClient(svc AssumeRoler, roleARN string, options ...func(*AssumeRoleProvider)) *credentials.Credentials { - p := &AssumeRoleProvider{ - Client: svc, - RoleARN: roleARN, - Duration: DefaultDuration, - } - - for _, option := range options { - option(p) - } - - return credentials.NewCredentials(p) -} - -// Retrieve generates a new set of temporary credentials using STS. -func (p *AssumeRoleProvider) Retrieve() (credentials.Value, error) { - // Apply defaults where parameters are not set. - if p.RoleSessionName == "" { - // Try to work out a role name that will hopefully end up unique. - p.RoleSessionName = fmt.Sprintf("%d", time.Now().UTC().UnixNano()) - } - if p.Duration == 0 { - // Expire as often as AWS permits. - p.Duration = DefaultDuration - } - jitter := time.Duration(sdkrand.SeededRand.Float64() * p.MaxJitterFrac * float64(p.Duration)) - input := &sts.AssumeRoleInput{ - DurationSeconds: aws.Int64(int64((p.Duration - jitter) / time.Second)), - RoleArn: aws.String(p.RoleARN), - RoleSessionName: aws.String(p.RoleSessionName), - ExternalId: p.ExternalID, - } - if p.Policy != nil { - input.Policy = p.Policy - } - if p.SerialNumber != nil { - if p.TokenCode != nil { - input.SerialNumber = p.SerialNumber - input.TokenCode = p.TokenCode - } else if p.TokenProvider != nil { - input.SerialNumber = p.SerialNumber - code, err := p.TokenProvider() - if err != nil { - return credentials.Value{ProviderName: ProviderName}, err - } - input.TokenCode = aws.String(code) - } else { - return credentials.Value{ProviderName: ProviderName}, - awserr.New("AssumeRoleTokenNotAvailable", - "assume role with MFA enabled, but neither TokenCode nor TokenProvider are set", nil) - } - } - - roleOutput, err := p.Client.AssumeRole(input) - if err != nil { - return credentials.Value{ProviderName: ProviderName}, err - } - - // We will proactively generate new credentials before they expire. - p.SetExpiration(*roleOutput.Credentials.Expiration, p.ExpiryWindow) - - return credentials.Value{ - AccessKeyID: *roleOutput.Credentials.AccessKeyId, - SecretAccessKey: *roleOutput.Credentials.SecretAccessKey, - SessionToken: *roleOutput.Credentials.SessionToken, - ProviderName: ProviderName, - }, nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/web_identity_provider.go b/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/web_identity_provider.go deleted file mode 100644 index b20b63394..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/web_identity_provider.go +++ /dev/null @@ -1,100 +0,0 @@ -package stscreds - -import ( - "fmt" - "io/ioutil" - "strconv" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/client" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/service/sts" - "github.com/aws/aws-sdk-go/service/sts/stsiface" -) - -const ( - // ErrCodeWebIdentity will be used as an error code when constructing - // a new error to be returned during session creation or retrieval. - ErrCodeWebIdentity = "WebIdentityErr" - - // WebIdentityProviderName is the web identity provider name - WebIdentityProviderName = "WebIdentityCredentials" -) - -// now is used to return a time.Time object representing -// the current time. This can be used to easily test and -// compare test values. -var now = time.Now - -// WebIdentityRoleProvider is used to retrieve credentials using -// an OIDC token. -type WebIdentityRoleProvider struct { - credentials.Expiry - - client stsiface.STSAPI - ExpiryWindow time.Duration - - tokenFilePath string - roleARN string - roleSessionName string -} - -// NewWebIdentityCredentials will return a new set of credentials with a given -// configuration, role arn, and token file path. -func NewWebIdentityCredentials(c client.ConfigProvider, roleARN, roleSessionName, path string) *credentials.Credentials { - svc := sts.New(c) - p := NewWebIdentityRoleProvider(svc, roleARN, roleSessionName, path) - return credentials.NewCredentials(p) -} - -// NewWebIdentityRoleProvider will return a new WebIdentityRoleProvider with the -// provided stsiface.STSAPI -func NewWebIdentityRoleProvider(svc stsiface.STSAPI, roleARN, roleSessionName, path string) *WebIdentityRoleProvider { - return &WebIdentityRoleProvider{ - client: svc, - tokenFilePath: path, - roleARN: roleARN, - roleSessionName: roleSessionName, - } -} - -// Retrieve will attempt to assume a role from a token which is located at -// 'WebIdentityTokenFilePath' specified destination and if that is empty an -// error will be returned. -func (p *WebIdentityRoleProvider) Retrieve() (credentials.Value, error) { - b, err := ioutil.ReadFile(p.tokenFilePath) - if err != nil { - errMsg := fmt.Sprintf("unable to read file at %s", p.tokenFilePath) - return credentials.Value{}, awserr.New(ErrCodeWebIdentity, errMsg, err) - } - - sessionName := p.roleSessionName - if len(sessionName) == 0 { - // session name is used to uniquely identify a session. This simply - // uses unix time in nanoseconds to uniquely identify sessions. - sessionName = strconv.FormatInt(now().UnixNano(), 10) - } - req, resp := p.client.AssumeRoleWithWebIdentityRequest(&sts.AssumeRoleWithWebIdentityInput{ - RoleArn: &p.roleARN, - RoleSessionName: &sessionName, - WebIdentityToken: aws.String(string(b)), - }) - // InvalidIdentityToken error is a temporary error that can occur - // when assuming an Role with a JWT web identity token. - req.RetryErrorCodes = append(req.RetryErrorCodes, sts.ErrCodeInvalidIdentityTokenException) - if err := req.Send(); err != nil { - return credentials.Value{}, awserr.New(ErrCodeWebIdentity, "failed to retrieve credentials", err) - } - - p.SetExpiration(aws.TimeValue(resp.Credentials.Expiration), p.ExpiryWindow) - - value := credentials.Value{ - AccessKeyID: aws.StringValue(resp.Credentials.AccessKeyId), - SecretAccessKey: aws.StringValue(resp.Credentials.SecretAccessKey), - SessionToken: aws.StringValue(resp.Credentials.SessionToken), - ProviderName: WebIdentityProviderName, - } - return value, nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go deleted file mode 100644 index 25a66d1dd..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go +++ /dev/null @@ -1,69 +0,0 @@ -// Package csm provides the Client Side Monitoring (CSM) client which enables -// sending metrics via UDP connection to the CSM agent. This package provides -// control options, and configuration for the CSM client. The client can be -// controlled manually, or automatically via the SDK's Session configuration. -// -// Enabling CSM client via SDK's Session configuration -// -// The CSM client can be enabled automatically via SDK's Session configuration. -// The SDK's session configuration enables the CSM client if the AWS_CSM_PORT -// environment variable is set to a non-empty value. -// -// The configuration options for the CSM client via the SDK's session -// configuration are: -// -// * AWS_CSM_PORT= -// The port number the CSM agent will receive metrics on. -// -// * AWS_CSM_HOST= -// The hostname, or IP address the CSM agent will receive metrics on. -// Without port number. -// -// Manually enabling the CSM client -// -// The CSM client can be started, paused, and resumed manually. The Start -// function will enable the CSM client to publish metrics to the CSM agent. It -// is safe to call Start concurrently, but if Start is called additional times -// with different ClientID or address it will panic. -// -// r, err := csm.Start("clientID", ":31000") -// if err != nil { -// panic(fmt.Errorf("failed starting CSM: %v", err)) -// } -// -// When controlling the CSM client manually, you must also inject its request -// handlers into the SDK's Session configuration for the SDK's API clients to -// publish metrics. -// -// sess, err := session.NewSession(&aws.Config{}) -// if err != nil { -// panic(fmt.Errorf("failed loading session: %v", err)) -// } -// -// // Add CSM client's metric publishing request handlers to the SDK's -// // Session Configuration. -// r.InjectHandlers(&sess.Handlers) -// -// Controlling CSM client -// -// Once the CSM client has been enabled the Get function will return a Reporter -// value that you can use to pause and resume the metrics published to the CSM -// agent. If Get function is called before the reporter is enabled with the -// Start function or via SDK's Session configuration nil will be returned. -// -// The Pause method can be called to stop the CSM client publishing metrics to -// the CSM agent. The Continue method will resume metric publishing. -// -// // Get the CSM client Reporter. -// r := csm.Get() -// -// // Will pause monitoring -// r.Pause() -// resp, err = client.GetObject(&s3.GetObjectInput{ -// Bucket: aws.String("bucket"), -// Key: aws.String("key"), -// }) -// -// // Resume monitoring -// r.Continue() -package csm diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go deleted file mode 100644 index 4b19e2800..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go +++ /dev/null @@ -1,89 +0,0 @@ -package csm - -import ( - "fmt" - "strings" - "sync" -) - -var ( - lock sync.Mutex -) - -const ( - // DefaultPort is used when no port is specified. - DefaultPort = "31000" - - // DefaultHost is the host that will be used when none is specified. - DefaultHost = "127.0.0.1" -) - -// AddressWithDefaults returns a CSM address built from the host and port -// values. If the host or port is not set, default values will be used -// instead. If host is "localhost" it will be replaced with "127.0.0.1". -func AddressWithDefaults(host, port string) string { - if len(host) == 0 || strings.EqualFold(host, "localhost") { - host = DefaultHost - } - - if len(port) == 0 { - port = DefaultPort - } - - // Only IP6 host can contain a colon - if strings.Contains(host, ":") { - return "[" + host + "]:" + port - } - - return host + ":" + port -} - -// Start will start a long running go routine to capture -// client side metrics. Calling start multiple time will only -// start the metric listener once and will panic if a different -// client ID or port is passed in. -// -// r, err := csm.Start("clientID", "127.0.0.1:31000") -// if err != nil { -// panic(fmt.Errorf("expected no error, but received %v", err)) -// } -// sess := session.NewSession() -// r.InjectHandlers(sess.Handlers) -// -// svc := s3.New(sess) -// out, err := svc.GetObject(&s3.GetObjectInput{ -// Bucket: aws.String("bucket"), -// Key: aws.String("key"), -// }) -func Start(clientID string, url string) (*Reporter, error) { - lock.Lock() - defer lock.Unlock() - - if sender == nil { - sender = newReporter(clientID, url) - } else { - if sender.clientID != clientID { - panic(fmt.Errorf("inconsistent client IDs. %q was expected, but received %q", sender.clientID, clientID)) - } - - if sender.url != url { - panic(fmt.Errorf("inconsistent URLs. %q was expected, but received %q", sender.url, url)) - } - } - - if err := connect(url); err != nil { - sender = nil - return nil, err - } - - return sender, nil -} - -// Get will return a reporter if one exists, if one does not exist, nil will -// be returned. -func Get() *Reporter { - lock.Lock() - defer lock.Unlock() - - return sender -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go deleted file mode 100644 index 5bacc791a..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go +++ /dev/null @@ -1,109 +0,0 @@ -package csm - -import ( - "strconv" - "time" - - "github.com/aws/aws-sdk-go/aws" -) - -type metricTime time.Time - -func (t metricTime) MarshalJSON() ([]byte, error) { - ns := time.Duration(time.Time(t).UnixNano()) - return []byte(strconv.FormatInt(int64(ns/time.Millisecond), 10)), nil -} - -type metric struct { - ClientID *string `json:"ClientId,omitempty"` - API *string `json:"Api,omitempty"` - Service *string `json:"Service,omitempty"` - Timestamp *metricTime `json:"Timestamp,omitempty"` - Type *string `json:"Type,omitempty"` - Version *int `json:"Version,omitempty"` - - AttemptCount *int `json:"AttemptCount,omitempty"` - Latency *int `json:"Latency,omitempty"` - - Fqdn *string `json:"Fqdn,omitempty"` - UserAgent *string `json:"UserAgent,omitempty"` - AttemptLatency *int `json:"AttemptLatency,omitempty"` - - SessionToken *string `json:"SessionToken,omitempty"` - Region *string `json:"Region,omitempty"` - AccessKey *string `json:"AccessKey,omitempty"` - HTTPStatusCode *int `json:"HttpStatusCode,omitempty"` - XAmzID2 *string `json:"XAmzId2,omitempty"` - XAmzRequestID *string `json:"XAmznRequestId,omitempty"` - - AWSException *string `json:"AwsException,omitempty"` - AWSExceptionMessage *string `json:"AwsExceptionMessage,omitempty"` - SDKException *string `json:"SdkException,omitempty"` - SDKExceptionMessage *string `json:"SdkExceptionMessage,omitempty"` - - FinalHTTPStatusCode *int `json:"FinalHttpStatusCode,omitempty"` - FinalAWSException *string `json:"FinalAwsException,omitempty"` - FinalAWSExceptionMessage *string `json:"FinalAwsExceptionMessage,omitempty"` - FinalSDKException *string `json:"FinalSdkException,omitempty"` - FinalSDKExceptionMessage *string `json:"FinalSdkExceptionMessage,omitempty"` - - DestinationIP *string `json:"DestinationIp,omitempty"` - ConnectionReused *int `json:"ConnectionReused,omitempty"` - - AcquireConnectionLatency *int `json:"AcquireConnectionLatency,omitempty"` - ConnectLatency *int `json:"ConnectLatency,omitempty"` - RequestLatency *int `json:"RequestLatency,omitempty"` - DNSLatency *int `json:"DnsLatency,omitempty"` - TCPLatency *int `json:"TcpLatency,omitempty"` - SSLLatency *int `json:"SslLatency,omitempty"` - - MaxRetriesExceeded *int `json:"MaxRetriesExceeded,omitempty"` -} - -func (m *metric) TruncateFields() { - m.ClientID = truncateString(m.ClientID, 255) - m.UserAgent = truncateString(m.UserAgent, 256) - - m.AWSException = truncateString(m.AWSException, 128) - m.AWSExceptionMessage = truncateString(m.AWSExceptionMessage, 512) - - m.SDKException = truncateString(m.SDKException, 128) - m.SDKExceptionMessage = truncateString(m.SDKExceptionMessage, 512) - - m.FinalAWSException = truncateString(m.FinalAWSException, 128) - m.FinalAWSExceptionMessage = truncateString(m.FinalAWSExceptionMessage, 512) - - m.FinalSDKException = truncateString(m.FinalSDKException, 128) - m.FinalSDKExceptionMessage = truncateString(m.FinalSDKExceptionMessage, 512) -} - -func truncateString(v *string, l int) *string { - if v != nil && len(*v) > l { - nv := (*v)[:l] - return &nv - } - - return v -} - -func (m *metric) SetException(e metricException) { - switch te := e.(type) { - case awsException: - m.AWSException = aws.String(te.exception) - m.AWSExceptionMessage = aws.String(te.message) - case sdkException: - m.SDKException = aws.String(te.exception) - m.SDKExceptionMessage = aws.String(te.message) - } -} - -func (m *metric) SetFinalException(e metricException) { - switch te := e.(type) { - case awsException: - m.FinalAWSException = aws.String(te.exception) - m.FinalAWSExceptionMessage = aws.String(te.message) - case sdkException: - m.FinalSDKException = aws.String(te.exception) - m.FinalSDKExceptionMessage = aws.String(te.message) - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go deleted file mode 100644 index 82a3e345e..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go +++ /dev/null @@ -1,55 +0,0 @@ -package csm - -import ( - "sync/atomic" -) - -const ( - runningEnum = iota - pausedEnum -) - -var ( - // MetricsChannelSize of metrics to hold in the channel - MetricsChannelSize = 100 -) - -type metricChan struct { - ch chan metric - paused *int64 -} - -func newMetricChan(size int) metricChan { - return metricChan{ - ch: make(chan metric, size), - paused: new(int64), - } -} - -func (ch *metricChan) Pause() { - atomic.StoreInt64(ch.paused, pausedEnum) -} - -func (ch *metricChan) Continue() { - atomic.StoreInt64(ch.paused, runningEnum) -} - -func (ch *metricChan) IsPaused() bool { - v := atomic.LoadInt64(ch.paused) - return v == pausedEnum -} - -// Push will push metrics to the metric channel if the channel -// is not paused -func (ch *metricChan) Push(m metric) bool { - if ch.IsPaused() { - return false - } - - select { - case ch.ch <- m: - return true - default: - return false - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go deleted file mode 100644 index 54a99280c..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go +++ /dev/null @@ -1,26 +0,0 @@ -package csm - -type metricException interface { - Exception() string - Message() string -} - -type requestException struct { - exception string - message string -} - -func (e requestException) Exception() string { - return e.exception -} -func (e requestException) Message() string { - return e.message -} - -type awsException struct { - requestException -} - -type sdkException struct { - requestException -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go b/vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go deleted file mode 100644 index c7008d8c3..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go +++ /dev/null @@ -1,265 +0,0 @@ -package csm - -import ( - "encoding/json" - "net" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" -) - -// Reporter will gather metrics of API requests made and -// send those metrics to the CSM endpoint. -type Reporter struct { - clientID string - url string - conn net.Conn - metricsCh metricChan - done chan struct{} -} - -var ( - sender *Reporter -) - -func connect(url string) error { - const network = "udp" - if err := sender.connect(network, url); err != nil { - return err - } - - if sender.done == nil { - sender.done = make(chan struct{}) - go sender.start() - } - - return nil -} - -func newReporter(clientID, url string) *Reporter { - return &Reporter{ - clientID: clientID, - url: url, - metricsCh: newMetricChan(MetricsChannelSize), - } -} - -func (rep *Reporter) sendAPICallAttemptMetric(r *request.Request) { - if rep == nil { - return - } - - now := time.Now() - creds, _ := r.Config.Credentials.Get() - - m := metric{ - ClientID: aws.String(rep.clientID), - API: aws.String(r.Operation.Name), - Service: aws.String(r.ClientInfo.ServiceID), - Timestamp: (*metricTime)(&now), - UserAgent: aws.String(r.HTTPRequest.Header.Get("User-Agent")), - Region: r.Config.Region, - Type: aws.String("ApiCallAttempt"), - Version: aws.Int(1), - - XAmzRequestID: aws.String(r.RequestID), - - AttemptCount: aws.Int(r.RetryCount + 1), - AttemptLatency: aws.Int(int(now.Sub(r.AttemptTime).Nanoseconds() / int64(time.Millisecond))), - AccessKey: aws.String(creds.AccessKeyID), - } - - if r.HTTPResponse != nil { - m.HTTPStatusCode = aws.Int(r.HTTPResponse.StatusCode) - } - - if r.Error != nil { - if awserr, ok := r.Error.(awserr.Error); ok { - m.SetException(getMetricException(awserr)) - } - } - - m.TruncateFields() - rep.metricsCh.Push(m) -} - -func getMetricException(err awserr.Error) metricException { - msg := err.Error() - code := err.Code() - - switch code { - case "RequestError", - request.ErrCodeSerialization, - request.CanceledErrorCode: - return sdkException{ - requestException{exception: code, message: msg}, - } - default: - return awsException{ - requestException{exception: code, message: msg}, - } - } -} - -func (rep *Reporter) sendAPICallMetric(r *request.Request) { - if rep == nil { - return - } - - now := time.Now() - m := metric{ - ClientID: aws.String(rep.clientID), - API: aws.String(r.Operation.Name), - Service: aws.String(r.ClientInfo.ServiceID), - Timestamp: (*metricTime)(&now), - UserAgent: aws.String(r.HTTPRequest.Header.Get("User-Agent")), - Type: aws.String("ApiCall"), - AttemptCount: aws.Int(r.RetryCount + 1), - Region: r.Config.Region, - Latency: aws.Int(int(time.Since(r.Time) / time.Millisecond)), - XAmzRequestID: aws.String(r.RequestID), - MaxRetriesExceeded: aws.Int(boolIntValue(r.RetryCount >= r.MaxRetries())), - } - - if r.HTTPResponse != nil { - m.FinalHTTPStatusCode = aws.Int(r.HTTPResponse.StatusCode) - } - - if r.Error != nil { - if awserr, ok := r.Error.(awserr.Error); ok { - m.SetFinalException(getMetricException(awserr)) - } - } - - m.TruncateFields() - - // TODO: Probably want to figure something out for logging dropped - // metrics - rep.metricsCh.Push(m) -} - -func (rep *Reporter) connect(network, url string) error { - if rep.conn != nil { - rep.conn.Close() - } - - conn, err := net.Dial(network, url) - if err != nil { - return awserr.New("UDPError", "Could not connect", err) - } - - rep.conn = conn - - return nil -} - -func (rep *Reporter) close() { - if rep.done != nil { - close(rep.done) - } - - rep.metricsCh.Pause() -} - -func (rep *Reporter) start() { - defer func() { - rep.metricsCh.Pause() - }() - - for { - select { - case <-rep.done: - rep.done = nil - return - case m := <-rep.metricsCh.ch: - // TODO: What to do with this error? Probably should just log - b, err := json.Marshal(m) - if err != nil { - continue - } - - rep.conn.Write(b) - } - } -} - -// Pause will pause the metric channel preventing any new metrics from being -// added. It is safe to call concurrently with other calls to Pause, but if -// called concurently with Continue can lead to unexpected state. -func (rep *Reporter) Pause() { - lock.Lock() - defer lock.Unlock() - - if rep == nil { - return - } - - rep.close() -} - -// Continue will reopen the metric channel and allow for monitoring to be -// resumed. It is safe to call concurrently with other calls to Continue, but -// if called concurently with Pause can lead to unexpected state. -func (rep *Reporter) Continue() { - lock.Lock() - defer lock.Unlock() - if rep == nil { - return - } - - if !rep.metricsCh.IsPaused() { - return - } - - rep.metricsCh.Continue() -} - -// Client side metric handler names -const ( - APICallMetricHandlerName = "awscsm.SendAPICallMetric" - APICallAttemptMetricHandlerName = "awscsm.SendAPICallAttemptMetric" -) - -// InjectHandlers will will enable client side metrics and inject the proper -// handlers to handle how metrics are sent. -// -// InjectHandlers is NOT safe to call concurrently. Calling InjectHandlers -// multiple times may lead to unexpected behavior, (e.g. duplicate metrics). -// -// // Start must be called in order to inject the correct handlers -// r, err := csm.Start("clientID", "127.0.0.1:8094") -// if err != nil { -// panic(fmt.Errorf("expected no error, but received %v", err)) -// } -// -// sess := session.NewSession() -// r.InjectHandlers(&sess.Handlers) -// -// // create a new service client with our client side metric session -// svc := s3.New(sess) -func (rep *Reporter) InjectHandlers(handlers *request.Handlers) { - if rep == nil { - return - } - - handlers.Complete.PushFrontNamed(request.NamedHandler{ - Name: APICallMetricHandlerName, - Fn: rep.sendAPICallMetric, - }) - - handlers.CompleteAttempt.PushFrontNamed(request.NamedHandler{ - Name: APICallAttemptMetricHandlerName, - Fn: rep.sendAPICallAttemptMetric, - }) -} - -// boolIntValue return 1 for true and 0 for false. -func boolIntValue(b bool) int { - if b { - return 1 - } - - return 0 -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go deleted file mode 100644 index 23bb639e0..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go +++ /dev/null @@ -1,207 +0,0 @@ -// Package defaults is a collection of helpers to retrieve the SDK's default -// configuration and handlers. -// -// Generally this package shouldn't be used directly, but session.Session -// instead. This package is useful when you need to reset the defaults -// of a session or service client to the SDK defaults before setting -// additional parameters. -package defaults - -import ( - "fmt" - "net" - "net/http" - "net/url" - "os" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/corehandlers" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds" - "github.com/aws/aws-sdk-go/aws/credentials/endpointcreds" - "github.com/aws/aws-sdk-go/aws/ec2metadata" - "github.com/aws/aws-sdk-go/aws/endpoints" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/internal/shareddefaults" -) - -// A Defaults provides a collection of default values for SDK clients. -type Defaults struct { - Config *aws.Config - Handlers request.Handlers -} - -// Get returns the SDK's default values with Config and handlers pre-configured. -func Get() Defaults { - cfg := Config() - handlers := Handlers() - cfg.Credentials = CredChain(cfg, handlers) - - return Defaults{ - Config: cfg, - Handlers: handlers, - } -} - -// Config returns the default configuration without credentials. -// To retrieve a config with credentials also included use -// `defaults.Get().Config` instead. -// -// Generally you shouldn't need to use this method directly, but -// is available if you need to reset the configuration of an -// existing service client or session. -func Config() *aws.Config { - return aws.NewConfig(). - WithCredentials(credentials.AnonymousCredentials). - WithRegion(os.Getenv("AWS_REGION")). - WithHTTPClient(http.DefaultClient). - WithMaxRetries(aws.UseServiceDefaultRetries). - WithLogger(aws.NewDefaultLogger()). - WithLogLevel(aws.LogOff). - WithEndpointResolver(endpoints.DefaultResolver()) -} - -// Handlers returns the default request handlers. -// -// Generally you shouldn't need to use this method directly, but -// is available if you need to reset the request handlers of an -// existing service client or session. -func Handlers() request.Handlers { - var handlers request.Handlers - - handlers.Validate.PushBackNamed(corehandlers.ValidateEndpointHandler) - handlers.Validate.AfterEachFn = request.HandlerListStopOnError - handlers.Build.PushBackNamed(corehandlers.SDKVersionUserAgentHandler) - handlers.Build.PushBackNamed(corehandlers.AddHostExecEnvUserAgentHander) - handlers.Build.AfterEachFn = request.HandlerListStopOnError - handlers.Sign.PushBackNamed(corehandlers.BuildContentLengthHandler) - handlers.Send.PushBackNamed(corehandlers.ValidateReqSigHandler) - handlers.Send.PushBackNamed(corehandlers.SendHandler) - handlers.AfterRetry.PushBackNamed(corehandlers.AfterRetryHandler) - handlers.ValidateResponse.PushBackNamed(corehandlers.ValidateResponseHandler) - - return handlers -} - -// CredChain returns the default credential chain. -// -// Generally you shouldn't need to use this method directly, but -// is available if you need to reset the credentials of an -// existing service client or session's Config. -func CredChain(cfg *aws.Config, handlers request.Handlers) *credentials.Credentials { - return credentials.NewCredentials(&credentials.ChainProvider{ - VerboseErrors: aws.BoolValue(cfg.CredentialsChainVerboseErrors), - Providers: CredProviders(cfg, handlers), - }) -} - -// CredProviders returns the slice of providers used in -// the default credential chain. -// -// For applications that need to use some other provider (for example use -// different environment variables for legacy reasons) but still fall back -// on the default chain of providers. This allows that default chaint to be -// automatically updated -func CredProviders(cfg *aws.Config, handlers request.Handlers) []credentials.Provider { - return []credentials.Provider{ - &credentials.EnvProvider{}, - &credentials.SharedCredentialsProvider{Filename: "", Profile: ""}, - RemoteCredProvider(*cfg, handlers), - } -} - -const ( - httpProviderAuthorizationEnvVar = "AWS_CONTAINER_AUTHORIZATION_TOKEN" - httpProviderEnvVar = "AWS_CONTAINER_CREDENTIALS_FULL_URI" -) - -// RemoteCredProvider returns a credentials provider for the default remote -// endpoints such as EC2 or ECS Roles. -func RemoteCredProvider(cfg aws.Config, handlers request.Handlers) credentials.Provider { - if u := os.Getenv(httpProviderEnvVar); len(u) > 0 { - return localHTTPCredProvider(cfg, handlers, u) - } - - if uri := os.Getenv(shareddefaults.ECSCredsProviderEnvVar); len(uri) > 0 { - u := fmt.Sprintf("%s%s", shareddefaults.ECSContainerCredentialsURI, uri) - return httpCredProvider(cfg, handlers, u) - } - - return ec2RoleProvider(cfg, handlers) -} - -var lookupHostFn = net.LookupHost - -func isLoopbackHost(host string) (bool, error) { - ip := net.ParseIP(host) - if ip != nil { - return ip.IsLoopback(), nil - } - - // Host is not an ip, perform lookup - addrs, err := lookupHostFn(host) - if err != nil { - return false, err - } - for _, addr := range addrs { - if !net.ParseIP(addr).IsLoopback() { - return false, nil - } - } - - return true, nil -} - -func localHTTPCredProvider(cfg aws.Config, handlers request.Handlers, u string) credentials.Provider { - var errMsg string - - parsed, err := url.Parse(u) - if err != nil { - errMsg = fmt.Sprintf("invalid URL, %v", err) - } else { - host := aws.URLHostname(parsed) - if len(host) == 0 { - errMsg = "unable to parse host from local HTTP cred provider URL" - } else if isLoopback, loopbackErr := isLoopbackHost(host); loopbackErr != nil { - errMsg = fmt.Sprintf("failed to resolve host %q, %v", host, loopbackErr) - } else if !isLoopback { - errMsg = fmt.Sprintf("invalid endpoint host, %q, only loopback hosts are allowed.", host) - } - } - - if len(errMsg) > 0 { - if cfg.Logger != nil { - cfg.Logger.Log("Ignoring, HTTP credential provider", errMsg, err) - } - return credentials.ErrorProvider{ - Err: awserr.New("CredentialsEndpointError", errMsg, err), - ProviderName: endpointcreds.ProviderName, - } - } - - return httpCredProvider(cfg, handlers, u) -} - -func httpCredProvider(cfg aws.Config, handlers request.Handlers, u string) credentials.Provider { - return endpointcreds.NewProviderClient(cfg, handlers, u, - func(p *endpointcreds.Provider) { - p.ExpiryWindow = 5 * time.Minute - p.AuthorizationToken = os.Getenv(httpProviderAuthorizationEnvVar) - }, - ) -} - -func ec2RoleProvider(cfg aws.Config, handlers request.Handlers) credentials.Provider { - resolver := cfg.EndpointResolver - if resolver == nil { - resolver = endpoints.DefaultResolver() - } - - e, _ := resolver.EndpointFor(endpoints.Ec2metadataServiceID, "") - return &ec2rolecreds.EC2RoleProvider{ - Client: ec2metadata.NewClient(cfg, handlers, e.URL, e.SigningRegion), - ExpiryWindow: 5 * time.Minute, - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go b/vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go deleted file mode 100644 index ca0ee1dcc..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go +++ /dev/null @@ -1,27 +0,0 @@ -package defaults - -import ( - "github.com/aws/aws-sdk-go/internal/shareddefaults" -) - -// SharedCredentialsFilename returns the SDK's default file path -// for the shared credentials file. -// -// Builds the shared config file path based on the OS's platform. -// -// - Linux/Unix: $HOME/.aws/credentials -// - Windows: %USERPROFILE%\.aws\credentials -func SharedCredentialsFilename() string { - return shareddefaults.SharedCredentialsFilename() -} - -// SharedConfigFilename returns the SDK's default file path for -// the shared config file. -// -// Builds the shared config file path based on the OS's platform. -// -// - Linux/Unix: $HOME/.aws/config -// - Windows: %USERPROFILE%\.aws\config -func SharedConfigFilename() string { - return shareddefaults.SharedConfigFilename() -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/doc.go b/vendor/github.com/aws/aws-sdk-go/aws/doc.go deleted file mode 100644 index 4fcb61618..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/doc.go +++ /dev/null @@ -1,56 +0,0 @@ -// Package aws provides the core SDK's utilities and shared types. Use this package's -// utilities to simplify setting and reading API operations parameters. -// -// Value and Pointer Conversion Utilities -// -// This package includes a helper conversion utility for each scalar type the SDK's -// API use. These utilities make getting a pointer of the scalar, and dereferencing -// a pointer easier. -// -// Each conversion utility comes in two forms. Value to Pointer and Pointer to Value. -// The Pointer to value will safely dereference the pointer and return its value. -// If the pointer was nil, the scalar's zero value will be returned. -// -// The value to pointer functions will be named after the scalar type. So get a -// *string from a string value use the "String" function. This makes it easy to -// to get pointer of a literal string value, because getting the address of a -// literal requires assigning the value to a variable first. -// -// var strPtr *string -// -// // Without the SDK's conversion functions -// str := "my string" -// strPtr = &str -// -// // With the SDK's conversion functions -// strPtr = aws.String("my string") -// -// // Convert *string to string value -// str = aws.StringValue(strPtr) -// -// In addition to scalars the aws package also includes conversion utilities for -// map and slice for commonly types used in API parameters. The map and slice -// conversion functions use similar naming pattern as the scalar conversion -// functions. -// -// var strPtrs []*string -// var strs []string = []string{"Go", "Gophers", "Go"} -// -// // Convert []string to []*string -// strPtrs = aws.StringSlice(strs) -// -// // Convert []*string to []string -// strs = aws.StringValueSlice(strPtrs) -// -// SDK Default HTTP Client -// -// The SDK will use the http.DefaultClient if a HTTP client is not provided to -// the SDK's Session, or service client constructor. This means that if the -// http.DefaultClient is modified by other components of your application the -// modifications will be picked up by the SDK as well. -// -// In some cases this might be intended, but it is a better practice to create -// a custom HTTP Client to share explicitly through your application. You can -// configure the SDK to use the custom HTTP Client by setting the HTTPClient -// value of the SDK's Config type when creating a Session or service client. -package aws diff --git a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go deleted file mode 100644 index d126764ce..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go +++ /dev/null @@ -1,170 +0,0 @@ -package ec2metadata - -import ( - "encoding/json" - "fmt" - "net/http" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/internal/sdkuri" -) - -// GetMetadata uses the path provided to request information from the EC2 -// instance metdata service. The content will be returned as a string, or -// error if the request failed. -func (c *EC2Metadata) GetMetadata(p string) (string, error) { - op := &request.Operation{ - Name: "GetMetadata", - HTTPMethod: "GET", - HTTPPath: sdkuri.PathJoin("/meta-data", p), - } - - output := &metadataOutput{} - req := c.NewRequest(op, nil, output) - err := req.Send() - - return output.Content, err -} - -// GetUserData returns the userdata that was configured for the service. If -// there is no user-data setup for the EC2 instance a "NotFoundError" error -// code will be returned. -func (c *EC2Metadata) GetUserData() (string, error) { - op := &request.Operation{ - Name: "GetUserData", - HTTPMethod: "GET", - HTTPPath: "/user-data", - } - - output := &metadataOutput{} - req := c.NewRequest(op, nil, output) - req.Handlers.UnmarshalError.PushBack(func(r *request.Request) { - if r.HTTPResponse.StatusCode == http.StatusNotFound { - r.Error = awserr.New("NotFoundError", "user-data not found", r.Error) - } - }) - err := req.Send() - - return output.Content, err -} - -// GetDynamicData uses the path provided to request information from the EC2 -// instance metadata service for dynamic data. The content will be returned -// as a string, or error if the request failed. -func (c *EC2Metadata) GetDynamicData(p string) (string, error) { - op := &request.Operation{ - Name: "GetDynamicData", - HTTPMethod: "GET", - HTTPPath: sdkuri.PathJoin("/dynamic", p), - } - - output := &metadataOutput{} - req := c.NewRequest(op, nil, output) - err := req.Send() - - return output.Content, err -} - -// GetInstanceIdentityDocument retrieves an identity document describing an -// instance. Error is returned if the request fails or is unable to parse -// the response. -func (c *EC2Metadata) GetInstanceIdentityDocument() (EC2InstanceIdentityDocument, error) { - resp, err := c.GetDynamicData("instance-identity/document") - if err != nil { - return EC2InstanceIdentityDocument{}, - awserr.New("EC2MetadataRequestError", - "failed to get EC2 instance identity document", err) - } - - doc := EC2InstanceIdentityDocument{} - if err := json.NewDecoder(strings.NewReader(resp)).Decode(&doc); err != nil { - return EC2InstanceIdentityDocument{}, - awserr.New(request.ErrCodeSerialization, - "failed to decode EC2 instance identity document", err) - } - - return doc, nil -} - -// IAMInfo retrieves IAM info from the metadata API -func (c *EC2Metadata) IAMInfo() (EC2IAMInfo, error) { - resp, err := c.GetMetadata("iam/info") - if err != nil { - return EC2IAMInfo{}, - awserr.New("EC2MetadataRequestError", - "failed to get EC2 IAM info", err) - } - - info := EC2IAMInfo{} - if err := json.NewDecoder(strings.NewReader(resp)).Decode(&info); err != nil { - return EC2IAMInfo{}, - awserr.New(request.ErrCodeSerialization, - "failed to decode EC2 IAM info", err) - } - - if info.Code != "Success" { - errMsg := fmt.Sprintf("failed to get EC2 IAM Info (%s)", info.Code) - return EC2IAMInfo{}, - awserr.New("EC2MetadataError", errMsg, nil) - } - - return info, nil -} - -// Region returns the region the instance is running in. -func (c *EC2Metadata) Region() (string, error) { - resp, err := c.GetMetadata("placement/availability-zone") - if err != nil { - return "", err - } - - if len(resp) == 0 { - return "", awserr.New("EC2MetadataError", "invalid Region response", nil) - } - - // returns region without the suffix. Eg: us-west-2a becomes us-west-2 - return resp[:len(resp)-1], nil -} - -// Available returns if the application has access to the EC2 Metadata service. -// Can be used to determine if application is running within an EC2 Instance and -// the metadata service is available. -func (c *EC2Metadata) Available() bool { - if _, err := c.GetMetadata("instance-id"); err != nil { - return false - } - - return true -} - -// An EC2IAMInfo provides the shape for unmarshaling -// an IAM info from the metadata API -type EC2IAMInfo struct { - Code string - LastUpdated time.Time - InstanceProfileArn string - InstanceProfileID string -} - -// An EC2InstanceIdentityDocument provides the shape for unmarshaling -// an instance identity document -type EC2InstanceIdentityDocument struct { - DevpayProductCodes []string `json:"devpayProductCodes"` - MarketplaceProductCodes []string `json:"marketplaceProductCodes"` - AvailabilityZone string `json:"availabilityZone"` - PrivateIP string `json:"privateIp"` - Version string `json:"version"` - Region string `json:"region"` - InstanceID string `json:"instanceId"` - BillingProducts []string `json:"billingProducts"` - InstanceType string `json:"instanceType"` - AccountID string `json:"accountId"` - PendingTime time.Time `json:"pendingTime"` - ImageID string `json:"imageId"` - KernelID string `json:"kernelId"` - RamdiskID string `json:"ramdiskId"` - Architecture string `json:"architecture"` -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go b/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go deleted file mode 100644 index 4c5636e35..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go +++ /dev/null @@ -1,152 +0,0 @@ -// Package ec2metadata provides the client for making API calls to the -// EC2 Metadata service. -// -// This package's client can be disabled completely by setting the environment -// variable "AWS_EC2_METADATA_DISABLED=true". This environment variable set to -// true instructs the SDK to disable the EC2 Metadata client. The client cannot -// be used while the environment variable is set to true, (case insensitive). -package ec2metadata - -import ( - "bytes" - "errors" - "io" - "net/http" - "os" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/client" - "github.com/aws/aws-sdk-go/aws/client/metadata" - "github.com/aws/aws-sdk-go/aws/corehandlers" - "github.com/aws/aws-sdk-go/aws/request" -) - -// ServiceName is the name of the service. -const ServiceName = "ec2metadata" -const disableServiceEnvVar = "AWS_EC2_METADATA_DISABLED" - -// A EC2Metadata is an EC2 Metadata service Client. -type EC2Metadata struct { - *client.Client -} - -// New creates a new instance of the EC2Metadata client with a session. -// This client is safe to use across multiple goroutines. -// -// -// Example: -// // Create a EC2Metadata client from just a session. -// svc := ec2metadata.New(mySession) -// -// // Create a EC2Metadata client with additional configuration -// svc := ec2metadata.New(mySession, aws.NewConfig().WithLogLevel(aws.LogDebugHTTPBody)) -func New(p client.ConfigProvider, cfgs ...*aws.Config) *EC2Metadata { - c := p.ClientConfig(ServiceName, cfgs...) - return NewClient(*c.Config, c.Handlers, c.Endpoint, c.SigningRegion) -} - -// NewClient returns a new EC2Metadata client. Should be used to create -// a client when not using a session. Generally using just New with a session -// is preferred. -// -// If an unmodified HTTP client is provided from the stdlib default, or no client -// the EC2RoleProvider's EC2Metadata HTTP client's timeout will be shortened. -// To disable this set Config.EC2MetadataDisableTimeoutOverride to false. Enabled by default. -func NewClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegion string, opts ...func(*client.Client)) *EC2Metadata { - if !aws.BoolValue(cfg.EC2MetadataDisableTimeoutOverride) && httpClientZero(cfg.HTTPClient) { - // If the http client is unmodified and this feature is not disabled - // set custom timeouts for EC2Metadata requests. - cfg.HTTPClient = &http.Client{ - // use a shorter timeout than default because the metadata - // service is local if it is running, and to fail faster - // if not running on an ec2 instance. - Timeout: 5 * time.Second, - } - } - - svc := &EC2Metadata{ - Client: client.New( - cfg, - metadata.ClientInfo{ - ServiceName: ServiceName, - ServiceID: ServiceName, - Endpoint: endpoint, - APIVersion: "latest", - }, - handlers, - ), - } - - svc.Handlers.Unmarshal.PushBack(unmarshalHandler) - svc.Handlers.UnmarshalError.PushBack(unmarshalError) - svc.Handlers.Validate.Clear() - svc.Handlers.Validate.PushBack(validateEndpointHandler) - - // Disable the EC2 Metadata service if the environment variable is set. - // This shortcirctes the service's functionality to always fail to send - // requests. - if strings.ToLower(os.Getenv(disableServiceEnvVar)) == "true" { - svc.Handlers.Send.SwapNamed(request.NamedHandler{ - Name: corehandlers.SendHandler.Name, - Fn: func(r *request.Request) { - r.HTTPResponse = &http.Response{ - Header: http.Header{}, - } - r.Error = awserr.New( - request.CanceledErrorCode, - "EC2 IMDS access disabled via "+disableServiceEnvVar+" env var", - nil) - }, - }) - } - - // Add additional options to the service config - for _, option := range opts { - option(svc.Client) - } - - return svc -} - -func httpClientZero(c *http.Client) bool { - return c == nil || (c.Transport == nil && c.CheckRedirect == nil && c.Jar == nil && c.Timeout == 0) -} - -type metadataOutput struct { - Content string -} - -func unmarshalHandler(r *request.Request) { - defer r.HTTPResponse.Body.Close() - b := &bytes.Buffer{} - if _, err := io.Copy(b, r.HTTPResponse.Body); err != nil { - r.Error = awserr.New(request.ErrCodeSerialization, "unable to unmarshal EC2 metadata response", err) - return - } - - if data, ok := r.Data.(*metadataOutput); ok { - data.Content = b.String() - } -} - -func unmarshalError(r *request.Request) { - defer r.HTTPResponse.Body.Close() - b := &bytes.Buffer{} - if _, err := io.Copy(b, r.HTTPResponse.Body); err != nil { - r.Error = awserr.New(request.ErrCodeSerialization, "unable to unmarshal EC2 metadata error response", err) - return - } - - // Response body format is not consistent between metadata endpoints. - // Grab the error message as a string and include that as the source error - r.Error = awserr.New("EC2MetadataError", "failed to make EC2Metadata request", errors.New(b.String())) -} - -func validateEndpointHandler(r *request.Request) { - if r.ClientInfo.Endpoint == "" { - r.Error = aws.ErrMissingEndpoint - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go deleted file mode 100644 index 87b9ff3ff..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go +++ /dev/null @@ -1,188 +0,0 @@ -package endpoints - -import ( - "encoding/json" - "fmt" - "io" - - "github.com/aws/aws-sdk-go/aws/awserr" -) - -type modelDefinition map[string]json.RawMessage - -// A DecodeModelOptions are the options for how the endpoints model definition -// are decoded. -type DecodeModelOptions struct { - SkipCustomizations bool -} - -// Set combines all of the option functions together. -func (d *DecodeModelOptions) Set(optFns ...func(*DecodeModelOptions)) { - for _, fn := range optFns { - fn(d) - } -} - -// DecodeModel unmarshals a Regions and Endpoint model definition file into -// a endpoint Resolver. If the file format is not supported, or an error occurs -// when unmarshaling the model an error will be returned. -// -// Casting the return value of this func to a EnumPartitions will -// allow you to get a list of the partitions in the order the endpoints -// will be resolved in. -// -// resolver, err := endpoints.DecodeModel(reader) -// -// partitions := resolver.(endpoints.EnumPartitions).Partitions() -// for _, p := range partitions { -// // ... inspect partitions -// } -func DecodeModel(r io.Reader, optFns ...func(*DecodeModelOptions)) (Resolver, error) { - var opts DecodeModelOptions - opts.Set(optFns...) - - // Get the version of the partition file to determine what - // unmarshaling model to use. - modelDef := modelDefinition{} - if err := json.NewDecoder(r).Decode(&modelDef); err != nil { - return nil, newDecodeModelError("failed to decode endpoints model", err) - } - - var version string - if b, ok := modelDef["version"]; ok { - version = string(b) - } else { - return nil, newDecodeModelError("endpoints version not found in model", nil) - } - - if version == "3" { - return decodeV3Endpoints(modelDef, opts) - } - - return nil, newDecodeModelError( - fmt.Sprintf("endpoints version %s, not supported", version), nil) -} - -func decodeV3Endpoints(modelDef modelDefinition, opts DecodeModelOptions) (Resolver, error) { - b, ok := modelDef["partitions"] - if !ok { - return nil, newDecodeModelError("endpoints model missing partitions", nil) - } - - ps := partitions{} - if err := json.Unmarshal(b, &ps); err != nil { - return nil, newDecodeModelError("failed to decode endpoints model", err) - } - - if opts.SkipCustomizations { - return ps, nil - } - - // Customization - for i := 0; i < len(ps); i++ { - p := &ps[i] - custAddEC2Metadata(p) - custAddS3DualStack(p) - custRmIotDataService(p) - custFixAppAutoscalingChina(p) - custFixAppAutoscalingUsGov(p) - } - - return ps, nil -} - -func custAddS3DualStack(p *partition) { - if p.ID != "aws" { - return - } - - custAddDualstack(p, "s3") - custAddDualstack(p, "s3-control") -} - -func custAddDualstack(p *partition, svcName string) { - s, ok := p.Services[svcName] - if !ok { - return - } - - s.Defaults.HasDualStack = boxedTrue - s.Defaults.DualStackHostname = "{service}.dualstack.{region}.{dnsSuffix}" - - p.Services[svcName] = s -} - -func custAddEC2Metadata(p *partition) { - p.Services["ec2metadata"] = service{ - IsRegionalized: boxedFalse, - PartitionEndpoint: "aws-global", - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "169.254.169.254/latest", - Protocols: []string{"http"}, - }, - }, - } -} - -func custRmIotDataService(p *partition) { - delete(p.Services, "data.iot") -} - -func custFixAppAutoscalingChina(p *partition) { - if p.ID != "aws-cn" { - return - } - - const serviceName = "application-autoscaling" - s, ok := p.Services[serviceName] - if !ok { - return - } - - const expectHostname = `autoscaling.{region}.amazonaws.com` - if e, a := s.Defaults.Hostname, expectHostname; e != a { - fmt.Printf("custFixAppAutoscalingChina: ignoring customization, expected %s, got %s\n", e, a) - return - } - - s.Defaults.Hostname = expectHostname + ".cn" - p.Services[serviceName] = s -} - -func custFixAppAutoscalingUsGov(p *partition) { - if p.ID != "aws-us-gov" { - return - } - - const serviceName = "application-autoscaling" - s, ok := p.Services[serviceName] - if !ok { - return - } - - if a := s.Defaults.CredentialScope.Service; a != "" { - fmt.Printf("custFixAppAutoscalingUsGov: ignoring customization, expected empty credential scope service, got %s\n", a) - return - } - - if a := s.Defaults.Hostname; a != "" { - fmt.Printf("custFixAppAutoscalingUsGov: ignoring customization, expected empty hostname, got %s\n", a) - return - } - - s.Defaults.CredentialScope.Service = "application-autoscaling" - s.Defaults.Hostname = "autoscaling.{region}.amazonaws.com" - - p.Services[serviceName] = s -} - -type decodeModelError struct { - awsError -} - -func newDecodeModelError(msg string, err error) decodeModelError { - return decodeModelError{ - awsError: awserr.New("DecodeEndpointsModelError", msg, err), - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go deleted file mode 100644 index aacd84d78..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go +++ /dev/null @@ -1,5564 +0,0 @@ -// Code generated by aws/endpoints/v3model_codegen.go. DO NOT EDIT. - -package endpoints - -import ( - "regexp" -) - -// Partition identifiers -const ( - AwsPartitionID = "aws" // AWS Standard partition. - AwsCnPartitionID = "aws-cn" // AWS China partition. - AwsUsGovPartitionID = "aws-us-gov" // AWS GovCloud (US) partition. - AwsIsoPartitionID = "aws-iso" // AWS ISO (US) partition. - AwsIsoBPartitionID = "aws-iso-b" // AWS ISOB (US) partition. -) - -// AWS Standard partition's regions. -const ( - ApEast1RegionID = "ap-east-1" // Asia Pacific (Hong Kong). - ApNortheast1RegionID = "ap-northeast-1" // Asia Pacific (Tokyo). - ApNortheast2RegionID = "ap-northeast-2" // Asia Pacific (Seoul). - ApSouth1RegionID = "ap-south-1" // Asia Pacific (Mumbai). - ApSoutheast1RegionID = "ap-southeast-1" // Asia Pacific (Singapore). - ApSoutheast2RegionID = "ap-southeast-2" // Asia Pacific (Sydney). - CaCentral1RegionID = "ca-central-1" // Canada (Central). - EuCentral1RegionID = "eu-central-1" // EU (Frankfurt). - EuNorth1RegionID = "eu-north-1" // EU (Stockholm). - EuWest1RegionID = "eu-west-1" // EU (Ireland). - EuWest2RegionID = "eu-west-2" // EU (London). - EuWest3RegionID = "eu-west-3" // EU (Paris). - MeSouth1RegionID = "me-south-1" // Middle East (Bahrain). - SaEast1RegionID = "sa-east-1" // South America (Sao Paulo). - UsEast1RegionID = "us-east-1" // US East (N. Virginia). - UsEast2RegionID = "us-east-2" // US East (Ohio). - UsWest1RegionID = "us-west-1" // US West (N. California). - UsWest2RegionID = "us-west-2" // US West (Oregon). -) - -// AWS China partition's regions. -const ( - CnNorth1RegionID = "cn-north-1" // China (Beijing). - CnNorthwest1RegionID = "cn-northwest-1" // China (Ningxia). -) - -// AWS GovCloud (US) partition's regions. -const ( - UsGovEast1RegionID = "us-gov-east-1" // AWS GovCloud (US-East). - UsGovWest1RegionID = "us-gov-west-1" // AWS GovCloud (US). -) - -// AWS ISO (US) partition's regions. -const ( - UsIsoEast1RegionID = "us-iso-east-1" // US ISO East. -) - -// AWS ISOB (US) partition's regions. -const ( - UsIsobEast1RegionID = "us-isob-east-1" // US ISOB East (Ohio). -) - -// DefaultResolver returns an Endpoint resolver that will be able -// to resolve endpoints for: AWS Standard, AWS China, AWS GovCloud (US), AWS ISO (US), and AWS ISOB (US). -// -// Use DefaultPartitions() to get the list of the default partitions. -func DefaultResolver() Resolver { - return defaultPartitions -} - -// DefaultPartitions returns a list of the partitions the SDK is bundled -// with. The available partitions are: AWS Standard, AWS China, AWS GovCloud (US), AWS ISO (US), and AWS ISOB (US). -// -// partitions := endpoints.DefaultPartitions -// for _, p := range partitions { -// // ... inspect partitions -// } -func DefaultPartitions() []Partition { - return defaultPartitions.Partitions() -} - -var defaultPartitions = partitions{ - awsPartition, - awscnPartition, - awsusgovPartition, - awsisoPartition, - awsisobPartition, -} - -// AwsPartition returns the Resolver for AWS Standard. -func AwsPartition() Partition { - return awsPartition.Partition() -} - -var awsPartition = partition{ - ID: "aws", - Name: "AWS Standard", - DNSSuffix: "amazonaws.com", - RegionRegex: regionRegex{ - Regexp: func() *regexp.Regexp { - reg, _ := regexp.Compile("^(us|eu|ap|sa|ca|me)\\-\\w+\\-\\d+$") - return reg - }(), - }, - Defaults: endpoint{ - Hostname: "{service}.{region}.{dnsSuffix}", - Protocols: []string{"https"}, - SignatureVersions: []string{"v4"}, - }, - Regions: regions{ - "ap-east-1": region{ - Description: "Asia Pacific (Hong Kong)", - }, - "ap-northeast-1": region{ - Description: "Asia Pacific (Tokyo)", - }, - "ap-northeast-2": region{ - Description: "Asia Pacific (Seoul)", - }, - "ap-south-1": region{ - Description: "Asia Pacific (Mumbai)", - }, - "ap-southeast-1": region{ - Description: "Asia Pacific (Singapore)", - }, - "ap-southeast-2": region{ - Description: "Asia Pacific (Sydney)", - }, - "ca-central-1": region{ - Description: "Canada (Central)", - }, - "eu-central-1": region{ - Description: "EU (Frankfurt)", - }, - "eu-north-1": region{ - Description: "EU (Stockholm)", - }, - "eu-west-1": region{ - Description: "EU (Ireland)", - }, - "eu-west-2": region{ - Description: "EU (London)", - }, - "eu-west-3": region{ - Description: "EU (Paris)", - }, - "me-south-1": region{ - Description: "Middle East (Bahrain)", - }, - "sa-east-1": region{ - Description: "South America (Sao Paulo)", - }, - "us-east-1": region{ - Description: "US East (N. Virginia)", - }, - "us-east-2": region{ - Description: "US East (Ohio)", - }, - "us-west-1": region{ - Description: "US West (N. California)", - }, - "us-west-2": region{ - Description: "US West (Oregon)", - }, - }, - Services: services{ - "a4b": service{ - - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "acm": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "acm-pca": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "api.ecr": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{ - Hostname: "api.ecr.ap-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-east-1", - }, - }, - "ap-northeast-1": endpoint{ - Hostname: "api.ecr.ap-northeast-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-northeast-1", - }, - }, - "ap-northeast-2": endpoint{ - Hostname: "api.ecr.ap-northeast-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-northeast-2", - }, - }, - "ap-south-1": endpoint{ - Hostname: "api.ecr.ap-south-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-south-1", - }, - }, - "ap-southeast-1": endpoint{ - Hostname: "api.ecr.ap-southeast-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-southeast-1", - }, - }, - "ap-southeast-2": endpoint{ - Hostname: "api.ecr.ap-southeast-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-southeast-2", - }, - }, - "ca-central-1": endpoint{ - Hostname: "api.ecr.ca-central-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ca-central-1", - }, - }, - "eu-central-1": endpoint{ - Hostname: "api.ecr.eu-central-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-central-1", - }, - }, - "eu-north-1": endpoint{ - Hostname: "api.ecr.eu-north-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-north-1", - }, - }, - "eu-west-1": endpoint{ - Hostname: "api.ecr.eu-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-west-1", - }, - }, - "eu-west-2": endpoint{ - Hostname: "api.ecr.eu-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-west-2", - }, - }, - "eu-west-3": endpoint{ - Hostname: "api.ecr.eu-west-3.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-west-3", - }, - }, - "me-south-1": endpoint{ - Hostname: "api.ecr.me-south-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "me-south-1", - }, - }, - "sa-east-1": endpoint{ - Hostname: "api.ecr.sa-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "sa-east-1", - }, - }, - "us-east-1": endpoint{ - Hostname: "api.ecr.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{ - Hostname: "api.ecr.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{ - Hostname: "api.ecr.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{ - Hostname: "api.ecr.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "api.mediatailor": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "api.pricing": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "pricing", - }, - }, - Endpoints: endpoints{ - "ap-south-1": endpoint{}, - "us-east-1": endpoint{}, - }, - }, - "api.sagemaker": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "api-fips.sagemaker.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "api-fips.sagemaker.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{}, - "us-west-1-fips": endpoint{ - Hostname: "api-fips.sagemaker.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "api-fips.sagemaker.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "apigateway": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "application-autoscaling": service{ - Defaults: endpoint{ - Hostname: "autoscaling.{region}.amazonaws.com", - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "application-autoscaling", - }, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "appmesh": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "appstream2": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - CredentialScope: credentialScope{ - Service: "appstream", - }, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "appsync": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "athena": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "autoscaling": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "autoscaling-plans": service{ - Defaults: endpoint{ - Hostname: "autoscaling.{region}.amazonaws.com", - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "autoscaling-plans", - }, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "backup": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "batch": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "budgets": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "budgets.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "ce": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "ce.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "chime": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - Defaults: endpoint{ - SSLCommonName: "service.chime.aws.amazon.com", - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "service.chime.aws.amazon.com", - Protocols: []string{"https"}, - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "cloud9": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "clouddirectory": service{ - - Endpoints: endpoints{ - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "cloudformation": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "cloudfront": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "cloudfront.amazonaws.com", - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "cloudhsm": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "cloudhsmv2": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "cloudhsm", - }, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "cloudsearch": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "cloudtrail": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "codebuild": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "codebuild-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "codebuild-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{}, - "us-west-1-fips": endpoint{ - Hostname: "codebuild-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "codebuild-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "codecommit": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "fips": endpoint{ - Hostname: "codecommit-fips.ca-central-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ca-central-1", - }, - }, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "codedeploy": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "codedeploy-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "codedeploy-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{}, - "us-west-1-fips": endpoint{ - Hostname: "codedeploy-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "codedeploy-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "codepipeline": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "codestar": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "cognito-identity": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "cognito-idp": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "cognito-sync": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "comprehend": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "comprehendmedical": service{ - - Endpoints: endpoints{ - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "config": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "cur": service{ - - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "data.mediastore": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "datapipeline": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "datasync": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "fips-us-east-1": endpoint{ - Hostname: "datasync-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "fips-us-east-2": endpoint{ - Hostname: "datasync-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "fips-us-west-1": endpoint{ - Hostname: "datasync-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "fips-us-west-2": endpoint{ - Hostname: "datasync-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - "me-south-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "dax": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "devicefarm": service{ - - Endpoints: endpoints{ - "us-west-2": endpoint{}, - }, - }, - "directconnect": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "discovery": service{ - - Endpoints: endpoints{ - "us-west-2": endpoint{}, - }, - }, - "dms": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "docdb": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{ - Hostname: "rds.ap-northeast-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-northeast-1", - }, - }, - "ap-northeast-2": endpoint{ - Hostname: "rds.ap-northeast-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-northeast-2", - }, - }, - "ap-southeast-2": endpoint{ - Hostname: "rds.ap-southeast-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-southeast-2", - }, - }, - "eu-central-1": endpoint{ - Hostname: "rds.eu-central-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-central-1", - }, - }, - "eu-west-1": endpoint{ - Hostname: "rds.eu-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-west-1", - }, - }, - "eu-west-2": endpoint{ - Hostname: "rds.eu-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-west-2", - }, - }, - "us-east-1": endpoint{ - Hostname: "rds.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{ - Hostname: "rds.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-2": endpoint{ - Hostname: "rds.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "ds": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "dynamodb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "ca-central-1-fips": endpoint{ - Hostname: "dynamodb-fips.ca-central-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ca-central-1", - }, - }, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "local": endpoint{ - Hostname: "localhost:8000", - Protocols: []string{"http"}, - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "dynamodb-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "dynamodb-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{}, - "us-west-1-fips": endpoint{ - Hostname: "dynamodb-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "dynamodb-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "ec2": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "ec2metadata": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "169.254.169.254/latest", - Protocols: []string{"http"}, - }, - }, - }, - "ecs": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "elasticache": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "fips": endpoint{ - Hostname: "elasticache-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "elasticbeanstalk": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "elasticfilesystem": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "elasticloadbalancing": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "elasticmapreduce": service{ - Defaults: endpoint{ - SSLCommonName: "{region}.{service}.{dnsSuffix}", - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{ - SSLCommonName: "{service}.{region}.{dnsSuffix}", - }, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{ - SSLCommonName: "{service}.{region}.{dnsSuffix}", - }, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "elastictranscoder": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "email": service{ - - Endpoints: endpoints{ - "ap-south-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "entitlement.marketplace": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "aws-marketplace", - }, - }, - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "es": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "fips": endpoint{ - Hostname: "es-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "events": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "firehose": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "fms": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "fsx": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "gamelift": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "glacier": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "glue": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "greengrass": service{ - IsRegionalized: boxedTrue, - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "groundstation": service{ - - Endpoints: endpoints{ - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "guardduty": service{ - IsRegionalized: boxedTrue, - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "guardduty-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "guardduty-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{}, - "us-west-1-fips": endpoint{ - Hostname: "guardduty-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "guardduty-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "health": service{ - - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "iam": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "iam.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "importexport": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "importexport.amazonaws.com", - SignatureVersions: []string{"v2", "v4"}, - CredentialScope: credentialScope{ - Region: "us-east-1", - Service: "IngestionService", - }, - }, - }, - }, - "inspector": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "iot": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "execute-api", - }, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "iotanalytics": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "iotevents": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "ioteventsdata": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{ - Hostname: "data.iotevents.ap-northeast-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-northeast-1", - }, - }, - "ap-southeast-2": endpoint{ - Hostname: "data.iotevents.ap-southeast-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-southeast-2", - }, - }, - "eu-central-1": endpoint{ - Hostname: "data.iotevents.eu-central-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-central-1", - }, - }, - "eu-west-1": endpoint{ - Hostname: "data.iotevents.eu-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-west-1", - }, - }, - "us-east-1": endpoint{ - Hostname: "data.iotevents.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{ - Hostname: "data.iotevents.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-2": endpoint{ - Hostname: "data.iotevents.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "iotthingsgraph": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "iotthingsgraph", - }, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "kafka": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "kinesis": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "kinesisanalytics": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "kinesisvideo": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "kms": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "lakeformation": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "lambda": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "license-manager": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "lightsail": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "logs": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "machinelearning": service{ - - Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - }, - }, - "marketplacecommerceanalytics": service{ - - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "mediaconnect": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "mediaconvert": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "medialive": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "mediapackage": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "mediastore": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "metering.marketplace": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "aws-marketplace", - }, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "mgh": service{ - - Endpoints: endpoints{ - "us-west-2": endpoint{}, - }, - }, - "mobileanalytics": service{ - - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "models.lex": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "lex", - }, - }, - Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "monitoring": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "mq": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "mturk-requester": service{ - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "sandbox": endpoint{ - Hostname: "mturk-requester-sandbox.us-east-1.amazonaws.com", - }, - "us-east-1": endpoint{}, - }, - }, - "neptune": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{ - Hostname: "rds.ap-northeast-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-northeast-1", - }, - }, - "ap-northeast-2": endpoint{ - Hostname: "rds.ap-northeast-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-northeast-2", - }, - }, - "ap-south-1": endpoint{ - Hostname: "rds.ap-south-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-south-1", - }, - }, - "ap-southeast-1": endpoint{ - Hostname: "rds.ap-southeast-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-southeast-1", - }, - }, - "ap-southeast-2": endpoint{ - Hostname: "rds.ap-southeast-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-southeast-2", - }, - }, - "eu-central-1": endpoint{ - Hostname: "rds.eu-central-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-central-1", - }, - }, - "eu-north-1": endpoint{ - Hostname: "rds.eu-north-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-north-1", - }, - }, - "eu-west-1": endpoint{ - Hostname: "rds.eu-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-west-1", - }, - }, - "eu-west-2": endpoint{ - Hostname: "rds.eu-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "eu-west-2", - }, - }, - "us-east-1": endpoint{ - Hostname: "rds.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{ - Hostname: "rds.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-2": endpoint{ - Hostname: "rds.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "opsworks": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "opsworks-cm": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "organizations": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "organizations.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "pinpoint": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "mobiletargeting", - }, - }, - Endpoints: endpoints{ - "ap-south-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "polly": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "projects.iot1click": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "ram": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "rds": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{ - SSLCommonName: "{service}.{dnsSuffix}", - }, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "redshift": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "rekognition": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "resource-groups": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "robomaker": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "route53": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "route53.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "route53domains": service{ - - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "route53resolver": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "runtime.lex": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "lex", - }, - }, - Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "runtime.sagemaker": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "runtime-fips.sagemaker.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "runtime-fips.sagemaker.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{}, - "us-west-1-fips": endpoint{ - Hostname: "runtime-fips.sagemaker.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "runtime-fips.sagemaker.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "s3": service{ - PartitionEndpoint: "us-east-1", - IsRegionalized: boxedTrue, - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - SignatureVersions: []string{"s3v4"}, - - HasDualStack: boxedTrue, - DualStackHostname: "{service}.dualstack.{region}.{dnsSuffix}", - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{ - Hostname: "s3.ap-northeast-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{ - Hostname: "s3.ap-southeast-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "ap-southeast-2": endpoint{ - Hostname: "s3.ap-southeast-2.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{ - Hostname: "s3.eu-west-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "s3-external-1": endpoint{ - Hostname: "s3-external-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "sa-east-1": endpoint{ - Hostname: "s3.sa-east-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "us-east-1": endpoint{ - Hostname: "s3.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "us-east-2": endpoint{}, - "us-west-1": endpoint{ - Hostname: "s3.us-west-1.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - "us-west-2": endpoint{ - Hostname: "s3.us-west-2.amazonaws.com", - SignatureVersions: []string{"s3", "s3v4"}, - }, - }, - }, - "s3-control": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - SignatureVersions: []string{"s3v4"}, - - HasDualStack: boxedTrue, - DualStackHostname: "{service}.dualstack.{region}.{dnsSuffix}", - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{ - Hostname: "s3-control.ap-northeast-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "ap-northeast-1", - }, - }, - "ap-northeast-2": endpoint{ - Hostname: "s3-control.ap-northeast-2.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "ap-northeast-2", - }, - }, - "ap-south-1": endpoint{ - Hostname: "s3-control.ap-south-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "ap-south-1", - }, - }, - "ap-southeast-1": endpoint{ - Hostname: "s3-control.ap-southeast-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "ap-southeast-1", - }, - }, - "ap-southeast-2": endpoint{ - Hostname: "s3-control.ap-southeast-2.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "ap-southeast-2", - }, - }, - "ca-central-1": endpoint{ - Hostname: "s3-control.ca-central-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "ca-central-1", - }, - }, - "eu-central-1": endpoint{ - Hostname: "s3-control.eu-central-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "eu-central-1", - }, - }, - "eu-north-1": endpoint{ - Hostname: "s3-control.eu-north-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "eu-north-1", - }, - }, - "eu-west-1": endpoint{ - Hostname: "s3-control.eu-west-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "eu-west-1", - }, - }, - "eu-west-2": endpoint{ - Hostname: "s3-control.eu-west-2.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "eu-west-2", - }, - }, - "eu-west-3": endpoint{ - Hostname: "s3-control.eu-west-3.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "eu-west-3", - }, - }, - "sa-east-1": endpoint{ - Hostname: "s3-control.sa-east-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "sa-east-1", - }, - }, - "us-east-1": endpoint{ - Hostname: "s3-control.us-east-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-1-fips": endpoint{ - Hostname: "s3-control-fips.us-east-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{ - Hostname: "s3-control.us-east-2.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-east-2-fips": endpoint{ - Hostname: "s3-control-fips.us-east-2.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{ - Hostname: "s3-control.us-west-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-1-fips": endpoint{ - Hostname: "s3-control-fips.us-west-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{ - Hostname: "s3-control.us-west-2.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - "us-west-2-fips": endpoint{ - Hostname: "s3-control-fips.us-west-2.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "sdb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - SignatureVersions: []string{"v2"}, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-west-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{ - Hostname: "sdb.amazonaws.com", - }, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "secretsmanager": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "secretsmanager-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "secretsmanager-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{}, - "us-west-1-fips": endpoint{ - Hostname: "secretsmanager-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "secretsmanager-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "securityhub": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "serverlessrepo": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{ - Protocols: []string{"https"}, - }, - "ap-northeast-2": endpoint{ - Protocols: []string{"https"}, - }, - "ap-south-1": endpoint{ - Protocols: []string{"https"}, - }, - "ap-southeast-1": endpoint{ - Protocols: []string{"https"}, - }, - "ap-southeast-2": endpoint{ - Protocols: []string{"https"}, - }, - "ca-central-1": endpoint{ - Protocols: []string{"https"}, - }, - "eu-central-1": endpoint{ - Protocols: []string{"https"}, - }, - "eu-north-1": endpoint{ - Protocols: []string{"https"}, - }, - "eu-west-1": endpoint{ - Protocols: []string{"https"}, - }, - "eu-west-2": endpoint{ - Protocols: []string{"https"}, - }, - "eu-west-3": endpoint{ - Protocols: []string{"https"}, - }, - "sa-east-1": endpoint{ - Protocols: []string{"https"}, - }, - "us-east-1": endpoint{ - Protocols: []string{"https"}, - }, - "us-east-2": endpoint{ - Protocols: []string{"https"}, - }, - "us-west-1": endpoint{ - Protocols: []string{"https"}, - }, - "us-west-2": endpoint{ - Protocols: []string{"https"}, - }, - }, - }, - "servicecatalog": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "servicecatalog-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "servicecatalog-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{}, - "us-west-1-fips": endpoint{ - Hostname: "servicecatalog-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "servicecatalog-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "servicediscovery": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "shield": service{ - IsRegionalized: boxedFalse, - Defaults: endpoint{ - SSLCommonName: "shield.us-east-1.amazonaws.com", - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "us-east-1": endpoint{}, - }, - }, - "sms": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "snowball": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "sns": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "sqs": service{ - Defaults: endpoint{ - SSLCommonName: "{region}.queue.{dnsSuffix}", - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "fips-us-east-1": endpoint{ - Hostname: "sqs-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "fips-us-east-2": endpoint{ - Hostname: "sqs-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "fips-us-west-1": endpoint{ - Hostname: "sqs-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "fips-us-west-2": endpoint{ - Hostname: "sqs-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{ - SSLCommonName: "queue.{dnsSuffix}", - }, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "ssm": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "states": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "storagegateway": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "streams.dynamodb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "dynamodb", - }, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "ca-central-1-fips": endpoint{ - Hostname: "dynamodb-fips.ca-central-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ca-central-1", - }, - }, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "local": endpoint{ - Hostname: "localhost:8000", - Protocols: []string{"http"}, - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "dynamodb-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "dynamodb-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{}, - "us-west-1-fips": endpoint{ - Hostname: "dynamodb-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "dynamodb-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "sts": service{ - PartitionEndpoint: "aws-global", - Defaults: endpoint{ - Hostname: "sts.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - Endpoints: endpoints{ - "ap-east-1": endpoint{ - Hostname: "sts.ap-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-east-1", - }, - }, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{ - Hostname: "sts.ap-northeast-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "ap-northeast-2", - }, - }, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "aws-global": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{ - Hostname: "sts.me-south-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "me-south-1", - }, - }, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "sts-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "sts-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-1": endpoint{}, - "us-west-1-fips": endpoint{ - Hostname: "sts-fips.us-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-1", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "sts-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "support": service{ - PartitionEndpoint: "aws-global", - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "support.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "swf": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "tagging": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "transfer": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "translate": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-1-fips": endpoint{ - Hostname: "translate-fips.us-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - "us-east-2": endpoint{}, - "us-east-2-fips": endpoint{ - Hostname: "translate-fips.us-east-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-2", - }, - }, - "us-west-2": endpoint{}, - "us-west-2-fips": endpoint{ - Hostname: "translate-fips.us-west-2.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-west-2", - }, - }, - }, - }, - "waf": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "waf.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-east-1", - }, - }, - }, - }, - "waf-regional": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "workdocs": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "workmail": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "eu-west-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "workspaces": service{ - - Endpoints: endpoints{ - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - "xray": service{ - - Endpoints: endpoints{ - "ap-east-1": endpoint{}, - "ap-northeast-1": endpoint{}, - "ap-northeast-2": endpoint{}, - "ap-south-1": endpoint{}, - "ap-southeast-1": endpoint{}, - "ap-southeast-2": endpoint{}, - "ca-central-1": endpoint{}, - "eu-central-1": endpoint{}, - "eu-north-1": endpoint{}, - "eu-west-1": endpoint{}, - "eu-west-2": endpoint{}, - "eu-west-3": endpoint{}, - "me-south-1": endpoint{}, - "sa-east-1": endpoint{}, - "us-east-1": endpoint{}, - "us-east-2": endpoint{}, - "us-west-1": endpoint{}, - "us-west-2": endpoint{}, - }, - }, - }, -} - -// AwsCnPartition returns the Resolver for AWS China. -func AwsCnPartition() Partition { - return awscnPartition.Partition() -} - -var awscnPartition = partition{ - ID: "aws-cn", - Name: "AWS China", - DNSSuffix: "amazonaws.com.cn", - RegionRegex: regionRegex{ - Regexp: func() *regexp.Regexp { - reg, _ := regexp.Compile("^cn\\-\\w+\\-\\d+$") - return reg - }(), - }, - Defaults: endpoint{ - Hostname: "{service}.{region}.{dnsSuffix}", - Protocols: []string{"https"}, - SignatureVersions: []string{"v4"}, - }, - Regions: regions{ - "cn-north-1": region{ - Description: "China (Beijing)", - }, - "cn-northwest-1": region{ - Description: "China (Ningxia)", - }, - }, - Services: services{ - "api.ecr": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{ - Hostname: "api.ecr.cn-north-1.amazonaws.com.cn", - CredentialScope: credentialScope{ - Region: "cn-north-1", - }, - }, - "cn-northwest-1": endpoint{ - Hostname: "api.ecr.cn-northwest-1.amazonaws.com.cn", - CredentialScope: credentialScope{ - Region: "cn-northwest-1", - }, - }, - }, - }, - "apigateway": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "application-autoscaling": service{ - Defaults: endpoint{ - Hostname: "autoscaling.{region}.amazonaws.com.cn", - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "application-autoscaling", - }, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "autoscaling": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "cloudformation": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "cloudfront": service{ - PartitionEndpoint: "aws-cn-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-cn-global": endpoint{ - Hostname: "cloudfront.cn-northwest-1.amazonaws.com.cn", - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Region: "cn-northwest-1", - }, - }, - }, - }, - "cloudtrail": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "codebuild": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "codedeploy": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "cognito-identity": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - }, - }, - "config": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "directconnect": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "dms": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "ds": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "dynamodb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "ec2": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "ec2metadata": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "169.254.169.254/latest", - Protocols: []string{"http"}, - }, - }, - }, - "ecs": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "elasticache": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "elasticbeanstalk": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "elasticloadbalancing": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "elasticmapreduce": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "es": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "events": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "firehose": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "gamelift": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - }, - }, - "glacier": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "greengrass": service{ - IsRegionalized: boxedTrue, - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - }, - }, - "iam": service{ - PartitionEndpoint: "aws-cn-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-cn-global": endpoint{ - Hostname: "iam.cn-north-1.amazonaws.com.cn", - CredentialScope: credentialScope{ - Region: "cn-north-1", - }, - }, - }, - }, - "iot": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "execute-api", - }, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "kinesis": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "kms": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "lambda": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "license-manager": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "logs": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "mediaconvert": service{ - - Endpoints: endpoints{ - "cn-northwest-1": endpoint{ - Hostname: "subscribe.mediaconvert.cn-northwest-1.amazonaws.com.cn", - CredentialScope: credentialScope{ - Region: "cn-northwest-1", - }, - }, - }, - }, - "monitoring": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "polly": service{ - - Endpoints: endpoints{ - "cn-northwest-1": endpoint{}, - }, - }, - "rds": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "redshift": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "s3": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - SignatureVersions: []string{"s3v4"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "s3-control": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - SignatureVersions: []string{"s3v4"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{ - Hostname: "s3-control.cn-north-1.amazonaws.com.cn", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "cn-north-1", - }, - }, - "cn-northwest-1": endpoint{ - Hostname: "s3-control.cn-northwest-1.amazonaws.com.cn", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "cn-northwest-1", - }, - }, - }, - }, - "sms": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "snowball": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - }, - }, - "sns": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "sqs": service{ - Defaults: endpoint{ - SSLCommonName: "{region}.queue.{dnsSuffix}", - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "ssm": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "states": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "storagegateway": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - }, - }, - "streams.dynamodb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "dynamodb", - }, - }, - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "sts": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "support": service{ - PartitionEndpoint: "aws-cn-global", - - Endpoints: endpoints{ - "aws-cn-global": endpoint{ - Hostname: "support.cn-north-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "cn-north-1", - }, - }, - }, - }, - "swf": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - "tagging": service{ - - Endpoints: endpoints{ - "cn-north-1": endpoint{}, - "cn-northwest-1": endpoint{}, - }, - }, - }, -} - -// AwsUsGovPartition returns the Resolver for AWS GovCloud (US). -func AwsUsGovPartition() Partition { - return awsusgovPartition.Partition() -} - -var awsusgovPartition = partition{ - ID: "aws-us-gov", - Name: "AWS GovCloud (US)", - DNSSuffix: "amazonaws.com", - RegionRegex: regionRegex{ - Regexp: func() *regexp.Regexp { - reg, _ := regexp.Compile("^us\\-gov\\-\\w+\\-\\d+$") - return reg - }(), - }, - Defaults: endpoint{ - Hostname: "{service}.{region}.{dnsSuffix}", - Protocols: []string{"https"}, - SignatureVersions: []string{"v4"}, - }, - Regions: regions{ - "us-gov-east-1": region{ - Description: "AWS GovCloud (US-East)", - }, - "us-gov-west-1": region{ - Description: "AWS GovCloud (US)", - }, - }, - Services: services{ - "acm": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "acm-pca": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "api.ecr": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{ - Hostname: "api.ecr.us-gov-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-east-1", - }, - }, - "us-gov-west-1": endpoint{ - Hostname: "api.ecr.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - }, - }, - "api.sagemaker": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "apigateway": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "application-autoscaling": service{ - Defaults: endpoint{ - Hostname: "autoscaling.{region}.amazonaws.com", - CredentialScope: credentialScope{ - Service: "application-autoscaling", - }, - }, - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "athena": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "autoscaling": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{ - Protocols: []string{"http", "https"}, - }, - }, - }, - "clouddirectory": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "cloudformation": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "cloudhsm": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "cloudhsmv2": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "cloudhsm", - }, - }, - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "cloudtrail": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "codebuild": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "codecommit": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "codedeploy": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-east-1-fips": endpoint{ - Hostname: "codedeploy-fips.us-gov-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-east-1", - }, - }, - "us-gov-west-1": endpoint{}, - "us-gov-west-1-fips": endpoint{ - Hostname: "codedeploy-fips.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - }, - }, - "comprehend": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "config": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "datasync": service{ - - Endpoints: endpoints{ - "fips-us-gov-west-1": endpoint{ - Hostname: "datasync-fips.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - "us-gov-west-1": endpoint{}, - }, - }, - "directconnect": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "dms": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "ds": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "dynamodb": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-east-1-fips": endpoint{ - Hostname: "dynamodb.us-gov-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-east-1", - }, - }, - "us-gov-west-1": endpoint{}, - "us-gov-west-1-fips": endpoint{ - Hostname: "dynamodb.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - }, - }, - "ec2": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "ec2metadata": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "169.254.169.254/latest", - Protocols: []string{"http"}, - }, - }, - }, - "ecs": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "elasticache": service{ - - Endpoints: endpoints{ - "fips": endpoint{ - Hostname: "elasticache-fips.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "elasticbeanstalk": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "elasticfilesystem": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "elasticloadbalancing": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{ - Protocols: []string{"http", "https"}, - }, - }, - }, - "elasticmapreduce": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{ - Protocols: []string{"https"}, - }, - }, - }, - "es": service{ - - Endpoints: endpoints{ - "fips": endpoint{ - Hostname: "es-fips.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "events": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "firehose": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "glacier": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{ - Protocols: []string{"http", "https"}, - }, - }, - }, - "glue": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "greengrass": service{ - IsRegionalized: boxedTrue, - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "guardduty": service{ - IsRegionalized: boxedTrue, - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "health": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "iam": service{ - PartitionEndpoint: "aws-us-gov-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-us-gov-global": endpoint{ - Hostname: "iam.us-gov.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - }, - }, - "inspector": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "iot": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "execute-api", - }, - }, - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "kinesis": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "kms": service{ - - Endpoints: endpoints{ - "ProdFips": endpoint{ - Hostname: "kms-fips.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "lambda": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "license-manager": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "logs": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "mediaconvert": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "metering.marketplace": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "aws-marketplace", - }, - }, - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "monitoring": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "neptune": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{ - Hostname: "rds.us-gov-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-east-1", - }, - }, - "us-gov-west-1": endpoint{ - Hostname: "rds.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - }, - }, - "organizations": service{ - PartitionEndpoint: "aws-us-gov-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-us-gov-global": endpoint{ - Hostname: "organizations.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - }, - }, - "polly": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "ram": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "rds": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "redshift": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "rekognition": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "route53": service{ - PartitionEndpoint: "aws-us-gov-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-us-gov-global": endpoint{ - Hostname: "route53.us-gov.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - }, - }, - "runtime.sagemaker": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "s3": service{ - Defaults: endpoint{ - SignatureVersions: []string{"s3", "s3v4"}, - }, - Endpoints: endpoints{ - "fips-us-gov-west-1": endpoint{ - Hostname: "s3-fips-us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - "us-gov-east-1": endpoint{ - Hostname: "s3.us-gov-east-1.amazonaws.com", - Protocols: []string{"http", "https"}, - }, - "us-gov-west-1": endpoint{ - Hostname: "s3.us-gov-west-1.amazonaws.com", - Protocols: []string{"http", "https"}, - }, - }, - }, - "s3-control": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - SignatureVersions: []string{"s3v4"}, - }, - Endpoints: endpoints{ - "us-gov-east-1": endpoint{ - Hostname: "s3-control.us-gov-east-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-gov-east-1", - }, - }, - "us-gov-east-1-fips": endpoint{ - Hostname: "s3-control-fips.us-gov-east-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-gov-east-1", - }, - }, - "us-gov-west-1": endpoint{ - Hostname: "s3-control.us-gov-west-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - "us-gov-west-1-fips": endpoint{ - Hostname: "s3-control-fips.us-gov-west-1.amazonaws.com", - SignatureVersions: []string{"s3v4"}, - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - }, - }, - "secretsmanager": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - "us-gov-west-1-fips": endpoint{ - Hostname: "secretsmanager-fips.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - }, - }, - "serverlessrepo": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "us-gov-east-1": endpoint{ - Protocols: []string{"https"}, - }, - "us-gov-west-1": endpoint{ - Protocols: []string{"https"}, - }, - }, - }, - "sms": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "snowball": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "sns": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{ - Protocols: []string{"http", "https"}, - }, - }, - }, - "sqs": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{ - SSLCommonName: "{region}.queue.{dnsSuffix}", - Protocols: []string{"http", "https"}, - }, - }, - }, - "ssm": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "states": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "storagegateway": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "streams.dynamodb": service{ - Defaults: endpoint{ - CredentialScope: credentialScope{ - Service: "dynamodb", - }, - }, - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-east-1-fips": endpoint{ - Hostname: "dynamodb.us-gov-east-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-east-1", - }, - }, - "us-gov-west-1": endpoint{}, - "us-gov-west-1-fips": endpoint{ - Hostname: "dynamodb.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - }, - }, - "sts": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "swf": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "tagging": service{ - - Endpoints: endpoints{ - "us-gov-east-1": endpoint{}, - "us-gov-west-1": endpoint{}, - }, - }, - "translate": service{ - Defaults: endpoint{ - Protocols: []string{"https"}, - }, - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - "us-gov-west-1-fips": endpoint{ - Hostname: "translate-fips.us-gov-west-1.amazonaws.com", - CredentialScope: credentialScope{ - Region: "us-gov-west-1", - }, - }, - }, - }, - "waf-regional": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - "workspaces": service{ - - Endpoints: endpoints{ - "us-gov-west-1": endpoint{}, - }, - }, - }, -} - -// AwsIsoPartition returns the Resolver for AWS ISO (US). -func AwsIsoPartition() Partition { - return awsisoPartition.Partition() -} - -var awsisoPartition = partition{ - ID: "aws-iso", - Name: "AWS ISO (US)", - DNSSuffix: "c2s.ic.gov", - RegionRegex: regionRegex{ - Regexp: func() *regexp.Regexp { - reg, _ := regexp.Compile("^us\\-iso\\-\\w+\\-\\d+$") - return reg - }(), - }, - Defaults: endpoint{ - Hostname: "{service}.{region}.{dnsSuffix}", - Protocols: []string{"https"}, - SignatureVersions: []string{"v4"}, - }, - Regions: regions{ - "us-iso-east-1": region{ - Description: "US ISO East", - }, - }, - Services: services{ - "api.ecr": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{ - Hostname: "api.ecr.us-iso-east-1.c2s.ic.gov", - CredentialScope: credentialScope{ - Region: "us-iso-east-1", - }, - }, - }, - }, - "application-autoscaling": service{ - Defaults: endpoint{ - Hostname: "autoscaling.{region}.amazonaws.com", - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "application-autoscaling", - }, - }, - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "autoscaling": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{ - Protocols: []string{"http", "https"}, - }, - }, - }, - "cloudformation": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "cloudtrail": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "codedeploy": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "config": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "datapipeline": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "directconnect": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "dms": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "ds": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "dynamodb": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{ - Protocols: []string{"http", "https"}, - }, - }, - }, - "ec2": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "ec2metadata": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "169.254.169.254/latest", - Protocols: []string{"http"}, - }, - }, - }, - "ecs": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "elasticache": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "elasticloadbalancing": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{ - Protocols: []string{"http", "https"}, - }, - }, - }, - "elasticmapreduce": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{ - Protocols: []string{"https"}, - }, - }, - }, - "events": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "glacier": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{ - Protocols: []string{"http", "https"}, - }, - }, - }, - "health": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "iam": service{ - PartitionEndpoint: "aws-iso-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-iso-global": endpoint{ - Hostname: "iam.us-iso-east-1.c2s.ic.gov", - CredentialScope: credentialScope{ - Region: "us-iso-east-1", - }, - }, - }, - }, - "kinesis": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "kms": service{ - - Endpoints: endpoints{ - "ProdFips": endpoint{ - Hostname: "kms-fips.us-iso-east-1.c2s.ic.gov", - CredentialScope: credentialScope{ - Region: "us-iso-east-1", - }, - }, - "us-iso-east-1": endpoint{}, - }, - }, - "lambda": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "logs": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "monitoring": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "rds": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "redshift": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "s3": service{ - Defaults: endpoint{ - SignatureVersions: []string{"s3v4"}, - }, - Endpoints: endpoints{ - "us-iso-east-1": endpoint{ - Protocols: []string{"http", "https"}, - SignatureVersions: []string{"s3v4"}, - }, - }, - }, - "snowball": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "sns": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{ - Protocols: []string{"http", "https"}, - }, - }, - }, - "sqs": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{ - Protocols: []string{"http", "https"}, - }, - }, - }, - "states": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "streams.dynamodb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "dynamodb", - }, - }, - Endpoints: endpoints{ - "us-iso-east-1": endpoint{ - Protocols: []string{"http", "https"}, - }, - }, - }, - "sts": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "support": service{ - PartitionEndpoint: "aws-iso-global", - - Endpoints: endpoints{ - "aws-iso-global": endpoint{ - Hostname: "support.us-iso-east-1.c2s.ic.gov", - CredentialScope: credentialScope{ - Region: "us-iso-east-1", - }, - }, - }, - }, - "swf": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - "workspaces": service{ - - Endpoints: endpoints{ - "us-iso-east-1": endpoint{}, - }, - }, - }, -} - -// AwsIsoBPartition returns the Resolver for AWS ISOB (US). -func AwsIsoBPartition() Partition { - return awsisobPartition.Partition() -} - -var awsisobPartition = partition{ - ID: "aws-iso-b", - Name: "AWS ISOB (US)", - DNSSuffix: "sc2s.sgov.gov", - RegionRegex: regionRegex{ - Regexp: func() *regexp.Regexp { - reg, _ := regexp.Compile("^us\\-isob\\-\\w+\\-\\d+$") - return reg - }(), - }, - Defaults: endpoint{ - Hostname: "{service}.{region}.{dnsSuffix}", - Protocols: []string{"https"}, - SignatureVersions: []string{"v4"}, - }, - Regions: regions{ - "us-isob-east-1": region{ - Description: "US ISOB East (Ohio)", - }, - }, - Services: services{ - "application-autoscaling": service{ - Defaults: endpoint{ - Hostname: "autoscaling.{region}.amazonaws.com", - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "application-autoscaling", - }, - }, - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "autoscaling": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "cloudformation": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "cloudtrail": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "config": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "directconnect": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "dms": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "dynamodb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "ec2": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "ec2metadata": service{ - PartitionEndpoint: "aws-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-global": endpoint{ - Hostname: "169.254.169.254/latest", - Protocols: []string{"http"}, - }, - }, - }, - "elasticache": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "elasticloadbalancing": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{ - Protocols: []string{"https"}, - }, - }, - }, - "elasticmapreduce": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "events": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "glacier": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "health": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "iam": service{ - PartitionEndpoint: "aws-iso-b-global", - IsRegionalized: boxedFalse, - - Endpoints: endpoints{ - "aws-iso-b-global": endpoint{ - Hostname: "iam.us-isob-east-1.sc2s.sgov.gov", - CredentialScope: credentialScope{ - Region: "us-isob-east-1", - }, - }, - }, - }, - "kinesis": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "kms": service{ - - Endpoints: endpoints{ - "ProdFips": endpoint{ - Hostname: "kms-fips.us-isob-east-1.sc2s.sgov.gov", - CredentialScope: credentialScope{ - Region: "us-isob-east-1", - }, - }, - "us-isob-east-1": endpoint{}, - }, - }, - "logs": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "monitoring": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "rds": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "redshift": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "s3": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - SignatureVersions: []string{"s3v4"}, - }, - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "snowball": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "sns": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "sqs": service{ - Defaults: endpoint{ - SSLCommonName: "{region}.queue.{dnsSuffix}", - Protocols: []string{"http", "https"}, - }, - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "states": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "streams.dynamodb": service{ - Defaults: endpoint{ - Protocols: []string{"http", "https"}, - CredentialScope: credentialScope{ - Service: "dynamodb", - }, - }, - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "sts": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - "support": service{ - PartitionEndpoint: "aws-iso-b-global", - - Endpoints: endpoints{ - "aws-iso-b-global": endpoint{ - Hostname: "support.us-isob-east-1.sc2s.sgov.gov", - CredentialScope: credentialScope{ - Region: "us-isob-east-1", - }, - }, - }, - }, - "swf": service{ - - Endpoints: endpoints{ - "us-isob-east-1": endpoint{}, - }, - }, - }, -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/dep_service_ids.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/dep_service_ids.go deleted file mode 100644 index ca8fc828e..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/dep_service_ids.go +++ /dev/null @@ -1,141 +0,0 @@ -package endpoints - -// Service identifiers -// -// Deprecated: Use client package's EndpointsID value instead of these -// ServiceIDs. These IDs are not maintained, and are out of date. -const ( - A4bServiceID = "a4b" // A4b. - AcmServiceID = "acm" // Acm. - AcmPcaServiceID = "acm-pca" // AcmPca. - ApiMediatailorServiceID = "api.mediatailor" // ApiMediatailor. - ApiPricingServiceID = "api.pricing" // ApiPricing. - ApiSagemakerServiceID = "api.sagemaker" // ApiSagemaker. - ApigatewayServiceID = "apigateway" // Apigateway. - ApplicationAutoscalingServiceID = "application-autoscaling" // ApplicationAutoscaling. - Appstream2ServiceID = "appstream2" // Appstream2. - AppsyncServiceID = "appsync" // Appsync. - AthenaServiceID = "athena" // Athena. - AutoscalingServiceID = "autoscaling" // Autoscaling. - AutoscalingPlansServiceID = "autoscaling-plans" // AutoscalingPlans. - BatchServiceID = "batch" // Batch. - BudgetsServiceID = "budgets" // Budgets. - CeServiceID = "ce" // Ce. - ChimeServiceID = "chime" // Chime. - Cloud9ServiceID = "cloud9" // Cloud9. - ClouddirectoryServiceID = "clouddirectory" // Clouddirectory. - CloudformationServiceID = "cloudformation" // Cloudformation. - CloudfrontServiceID = "cloudfront" // Cloudfront. - CloudhsmServiceID = "cloudhsm" // Cloudhsm. - Cloudhsmv2ServiceID = "cloudhsmv2" // Cloudhsmv2. - CloudsearchServiceID = "cloudsearch" // Cloudsearch. - CloudtrailServiceID = "cloudtrail" // Cloudtrail. - CodebuildServiceID = "codebuild" // Codebuild. - CodecommitServiceID = "codecommit" // Codecommit. - CodedeployServiceID = "codedeploy" // Codedeploy. - CodepipelineServiceID = "codepipeline" // Codepipeline. - CodestarServiceID = "codestar" // Codestar. - CognitoIdentityServiceID = "cognito-identity" // CognitoIdentity. - CognitoIdpServiceID = "cognito-idp" // CognitoIdp. - CognitoSyncServiceID = "cognito-sync" // CognitoSync. - ComprehendServiceID = "comprehend" // Comprehend. - ConfigServiceID = "config" // Config. - CurServiceID = "cur" // Cur. - DatapipelineServiceID = "datapipeline" // Datapipeline. - DaxServiceID = "dax" // Dax. - DevicefarmServiceID = "devicefarm" // Devicefarm. - DirectconnectServiceID = "directconnect" // Directconnect. - DiscoveryServiceID = "discovery" // Discovery. - DmsServiceID = "dms" // Dms. - DsServiceID = "ds" // Ds. - DynamodbServiceID = "dynamodb" // Dynamodb. - Ec2ServiceID = "ec2" // Ec2. - Ec2metadataServiceID = "ec2metadata" // Ec2metadata. - EcrServiceID = "ecr" // Ecr. - EcsServiceID = "ecs" // Ecs. - ElasticacheServiceID = "elasticache" // Elasticache. - ElasticbeanstalkServiceID = "elasticbeanstalk" // Elasticbeanstalk. - ElasticfilesystemServiceID = "elasticfilesystem" // Elasticfilesystem. - ElasticloadbalancingServiceID = "elasticloadbalancing" // Elasticloadbalancing. - ElasticmapreduceServiceID = "elasticmapreduce" // Elasticmapreduce. - ElastictranscoderServiceID = "elastictranscoder" // Elastictranscoder. - EmailServiceID = "email" // Email. - EntitlementMarketplaceServiceID = "entitlement.marketplace" // EntitlementMarketplace. - EsServiceID = "es" // Es. - EventsServiceID = "events" // Events. - FirehoseServiceID = "firehose" // Firehose. - FmsServiceID = "fms" // Fms. - GameliftServiceID = "gamelift" // Gamelift. - GlacierServiceID = "glacier" // Glacier. - GlueServiceID = "glue" // Glue. - GreengrassServiceID = "greengrass" // Greengrass. - GuarddutyServiceID = "guardduty" // Guardduty. - HealthServiceID = "health" // Health. - IamServiceID = "iam" // Iam. - ImportexportServiceID = "importexport" // Importexport. - InspectorServiceID = "inspector" // Inspector. - IotServiceID = "iot" // Iot. - IotanalyticsServiceID = "iotanalytics" // Iotanalytics. - KinesisServiceID = "kinesis" // Kinesis. - KinesisanalyticsServiceID = "kinesisanalytics" // Kinesisanalytics. - KinesisvideoServiceID = "kinesisvideo" // Kinesisvideo. - KmsServiceID = "kms" // Kms. - LambdaServiceID = "lambda" // Lambda. - LightsailServiceID = "lightsail" // Lightsail. - LogsServiceID = "logs" // Logs. - MachinelearningServiceID = "machinelearning" // Machinelearning. - MarketplacecommerceanalyticsServiceID = "marketplacecommerceanalytics" // Marketplacecommerceanalytics. - MediaconvertServiceID = "mediaconvert" // Mediaconvert. - MedialiveServiceID = "medialive" // Medialive. - MediapackageServiceID = "mediapackage" // Mediapackage. - MediastoreServiceID = "mediastore" // Mediastore. - MeteringMarketplaceServiceID = "metering.marketplace" // MeteringMarketplace. - MghServiceID = "mgh" // Mgh. - MobileanalyticsServiceID = "mobileanalytics" // Mobileanalytics. - ModelsLexServiceID = "models.lex" // ModelsLex. - MonitoringServiceID = "monitoring" // Monitoring. - MturkRequesterServiceID = "mturk-requester" // MturkRequester. - NeptuneServiceID = "neptune" // Neptune. - OpsworksServiceID = "opsworks" // Opsworks. - OpsworksCmServiceID = "opsworks-cm" // OpsworksCm. - OrganizationsServiceID = "organizations" // Organizations. - PinpointServiceID = "pinpoint" // Pinpoint. - PollyServiceID = "polly" // Polly. - RdsServiceID = "rds" // Rds. - RedshiftServiceID = "redshift" // Redshift. - RekognitionServiceID = "rekognition" // Rekognition. - ResourceGroupsServiceID = "resource-groups" // ResourceGroups. - Route53ServiceID = "route53" // Route53. - Route53domainsServiceID = "route53domains" // Route53domains. - RuntimeLexServiceID = "runtime.lex" // RuntimeLex. - RuntimeSagemakerServiceID = "runtime.sagemaker" // RuntimeSagemaker. - S3ServiceID = "s3" // S3. - S3ControlServiceID = "s3-control" // S3Control. - SagemakerServiceID = "api.sagemaker" // Sagemaker. - SdbServiceID = "sdb" // Sdb. - SecretsmanagerServiceID = "secretsmanager" // Secretsmanager. - ServerlessrepoServiceID = "serverlessrepo" // Serverlessrepo. - ServicecatalogServiceID = "servicecatalog" // Servicecatalog. - ServicediscoveryServiceID = "servicediscovery" // Servicediscovery. - ShieldServiceID = "shield" // Shield. - SmsServiceID = "sms" // Sms. - SnowballServiceID = "snowball" // Snowball. - SnsServiceID = "sns" // Sns. - SqsServiceID = "sqs" // Sqs. - SsmServiceID = "ssm" // Ssm. - StatesServiceID = "states" // States. - StoragegatewayServiceID = "storagegateway" // Storagegateway. - StreamsDynamodbServiceID = "streams.dynamodb" // StreamsDynamodb. - StsServiceID = "sts" // Sts. - SupportServiceID = "support" // Support. - SwfServiceID = "swf" // Swf. - TaggingServiceID = "tagging" // Tagging. - TransferServiceID = "transfer" // Transfer. - TranslateServiceID = "translate" // Translate. - WafServiceID = "waf" // Waf. - WafRegionalServiceID = "waf-regional" // WafRegional. - WorkdocsServiceID = "workdocs" // Workdocs. - WorkmailServiceID = "workmail" // Workmail. - WorkspacesServiceID = "workspaces" // Workspaces. - XrayServiceID = "xray" // Xray. -) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/doc.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/doc.go deleted file mode 100644 index 84316b92c..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/doc.go +++ /dev/null @@ -1,66 +0,0 @@ -// Package endpoints provides the types and functionality for defining regions -// and endpoints, as well as querying those definitions. -// -// The SDK's Regions and Endpoints metadata is code generated into the endpoints -// package, and is accessible via the DefaultResolver function. This function -// returns a endpoint Resolver will search the metadata and build an associated -// endpoint if one is found. The default resolver will search all partitions -// known by the SDK. e.g AWS Standard (aws), AWS China (aws-cn), and -// AWS GovCloud (US) (aws-us-gov). -// . -// -// Enumerating Regions and Endpoint Metadata -// -// Casting the Resolver returned by DefaultResolver to a EnumPartitions interface -// will allow you to get access to the list of underlying Partitions with the -// Partitions method. This is helpful if you want to limit the SDK's endpoint -// resolving to a single partition, or enumerate regions, services, and endpoints -// in the partition. -// -// resolver := endpoints.DefaultResolver() -// partitions := resolver.(endpoints.EnumPartitions).Partitions() -// -// for _, p := range partitions { -// fmt.Println("Regions for", p.ID()) -// for id, _ := range p.Regions() { -// fmt.Println("*", id) -// } -// -// fmt.Println("Services for", p.ID()) -// for id, _ := range p.Services() { -// fmt.Println("*", id) -// } -// } -// -// Using Custom Endpoints -// -// The endpoints package also gives you the ability to use your own logic how -// endpoints are resolved. This is a great way to define a custom endpoint -// for select services, without passing that logic down through your code. -// -// If a type implements the Resolver interface it can be used to resolve -// endpoints. To use this with the SDK's Session and Config set the value -// of the type to the EndpointsResolver field of aws.Config when initializing -// the session, or service client. -// -// In addition the ResolverFunc is a wrapper for a func matching the signature -// of Resolver.EndpointFor, converting it to a type that satisfies the -// Resolver interface. -// -// -// myCustomResolver := func(service, region string, optFns ...func(*endpoints.Options)) (endpoints.ResolvedEndpoint, error) { -// if service == endpoints.S3ServiceID { -// return endpoints.ResolvedEndpoint{ -// URL: "s3.custom.endpoint.com", -// SigningRegion: "custom-signing-region", -// }, nil -// } -// -// return endpoints.DefaultResolver().EndpointFor(service, region, optFns...) -// } -// -// sess := session.Must(session.NewSession(&aws.Config{ -// Region: aws.String("us-west-2"), -// EndpointResolver: endpoints.ResolverFunc(myCustomResolver), -// })) -package endpoints diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go deleted file mode 100644 index 9c936be6c..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go +++ /dev/null @@ -1,452 +0,0 @@ -package endpoints - -import ( - "fmt" - "regexp" - - "github.com/aws/aws-sdk-go/aws/awserr" -) - -// Options provide the configuration needed to direct how the -// endpoints will be resolved. -type Options struct { - // DisableSSL forces the endpoint to be resolved as HTTP. - // instead of HTTPS if the service supports it. - DisableSSL bool - - // Sets the resolver to resolve the endpoint as a dualstack endpoint - // for the service. If dualstack support for a service is not known and - // StrictMatching is not enabled a dualstack endpoint for the service will - // be returned. This endpoint may not be valid. If StrictMatching is - // enabled only services that are known to support dualstack will return - // dualstack endpoints. - UseDualStack bool - - // Enables strict matching of services and regions resolved endpoints. - // If the partition doesn't enumerate the exact service and region an - // error will be returned. This option will prevent returning endpoints - // that look valid, but may not resolve to any real endpoint. - StrictMatching bool - - // Enables resolving a service endpoint based on the region provided if the - // service does not exist. The service endpoint ID will be used as the service - // domain name prefix. By default the endpoint resolver requires the service - // to be known when resolving endpoints. - // - // If resolving an endpoint on the partition list the provided region will - // be used to determine which partition's domain name pattern to the service - // endpoint ID with. If both the service and region are unknown and resolving - // the endpoint on partition list an UnknownEndpointError error will be returned. - // - // If resolving and endpoint on a partition specific resolver that partition's - // domain name pattern will be used with the service endpoint ID. If both - // region and service do not exist when resolving an endpoint on a specific - // partition the partition's domain pattern will be used to combine the - // endpoint and region together. - // - // This option is ignored if StrictMatching is enabled. - ResolveUnknownService bool -} - -// Set combines all of the option functions together. -func (o *Options) Set(optFns ...func(*Options)) { - for _, fn := range optFns { - fn(o) - } -} - -// DisableSSLOption sets the DisableSSL options. Can be used as a functional -// option when resolving endpoints. -func DisableSSLOption(o *Options) { - o.DisableSSL = true -} - -// UseDualStackOption sets the UseDualStack option. Can be used as a functional -// option when resolving endpoints. -func UseDualStackOption(o *Options) { - o.UseDualStack = true -} - -// StrictMatchingOption sets the StrictMatching option. Can be used as a functional -// option when resolving endpoints. -func StrictMatchingOption(o *Options) { - o.StrictMatching = true -} - -// ResolveUnknownServiceOption sets the ResolveUnknownService option. Can be used -// as a functional option when resolving endpoints. -func ResolveUnknownServiceOption(o *Options) { - o.ResolveUnknownService = true -} - -// A Resolver provides the interface for functionality to resolve endpoints. -// The build in Partition and DefaultResolver return value satisfy this interface. -type Resolver interface { - EndpointFor(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) -} - -// ResolverFunc is a helper utility that wraps a function so it satisfies the -// Resolver interface. This is useful when you want to add additional endpoint -// resolving logic, or stub out specific endpoints with custom values. -type ResolverFunc func(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) - -// EndpointFor wraps the ResolverFunc function to satisfy the Resolver interface. -func (fn ResolverFunc) EndpointFor(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) { - return fn(service, region, opts...) -} - -var schemeRE = regexp.MustCompile("^([^:]+)://") - -// AddScheme adds the HTTP or HTTPS schemes to a endpoint URL if there is no -// scheme. If disableSSL is true HTTP will set HTTP instead of the default HTTPS. -// -// If disableSSL is set, it will only set the URL's scheme if the URL does not -// contain a scheme. -func AddScheme(endpoint string, disableSSL bool) string { - if !schemeRE.MatchString(endpoint) { - scheme := "https" - if disableSSL { - scheme = "http" - } - endpoint = fmt.Sprintf("%s://%s", scheme, endpoint) - } - - return endpoint -} - -// EnumPartitions a provides a way to retrieve the underlying partitions that -// make up the SDK's default Resolver, or any resolver decoded from a model -// file. -// -// Use this interface with DefaultResolver and DecodeModels to get the list of -// Partitions. -type EnumPartitions interface { - Partitions() []Partition -} - -// RegionsForService returns a map of regions for the partition and service. -// If either the partition or service does not exist false will be returned -// as the second parameter. -// -// This example shows how to get the regions for DynamoDB in the AWS partition. -// rs, exists := endpoints.RegionsForService(endpoints.DefaultPartitions(), endpoints.AwsPartitionID, endpoints.DynamodbServiceID) -// -// This is equivalent to using the partition directly. -// rs := endpoints.AwsPartition().Services()[endpoints.DynamodbServiceID].Regions() -func RegionsForService(ps []Partition, partitionID, serviceID string) (map[string]Region, bool) { - for _, p := range ps { - if p.ID() != partitionID { - continue - } - if _, ok := p.p.Services[serviceID]; !ok { - break - } - - s := Service{ - id: serviceID, - p: p.p, - } - return s.Regions(), true - } - - return map[string]Region{}, false -} - -// PartitionForRegion returns the first partition which includes the region -// passed in. This includes both known regions and regions which match -// a pattern supported by the partition which may include regions that are -// not explicitly known by the partition. Use the Regions method of the -// returned Partition if explicit support is needed. -func PartitionForRegion(ps []Partition, regionID string) (Partition, bool) { - for _, p := range ps { - if _, ok := p.p.Regions[regionID]; ok || p.p.RegionRegex.MatchString(regionID) { - return p, true - } - } - - return Partition{}, false -} - -// A Partition provides the ability to enumerate the partition's regions -// and services. -type Partition struct { - id, dnsSuffix string - p *partition -} - -// DNSSuffix returns the base domain name of the partition. -func (p Partition) DNSSuffix() string { return p.dnsSuffix } - -// ID returns the identifier of the partition. -func (p Partition) ID() string { return p.id } - -// EndpointFor attempts to resolve the endpoint based on service and region. -// See Options for information on configuring how the endpoint is resolved. -// -// If the service cannot be found in the metadata the UnknownServiceError -// error will be returned. This validation will occur regardless if -// StrictMatching is enabled. To enable resolving unknown services set the -// "ResolveUnknownService" option to true. When StrictMatching is disabled -// this option allows the partition resolver to resolve a endpoint based on -// the service endpoint ID provided. -// -// When resolving endpoints you can choose to enable StrictMatching. This will -// require the provided service and region to be known by the partition. -// If the endpoint cannot be strictly resolved an error will be returned. This -// mode is useful to ensure the endpoint resolved is valid. Without -// StrictMatching enabled the endpoint returned my look valid but may not work. -// StrictMatching requires the SDK to be updated if you want to take advantage -// of new regions and services expansions. -// -// Errors that can be returned. -// * UnknownServiceError -// * UnknownEndpointError -func (p Partition) EndpointFor(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) { - return p.p.EndpointFor(service, region, opts...) -} - -// Regions returns a map of Regions indexed by their ID. This is useful for -// enumerating over the regions in a partition. -func (p Partition) Regions() map[string]Region { - rs := map[string]Region{} - for id, r := range p.p.Regions { - rs[id] = Region{ - id: id, - desc: r.Description, - p: p.p, - } - } - - return rs -} - -// Services returns a map of Service indexed by their ID. This is useful for -// enumerating over the services in a partition. -func (p Partition) Services() map[string]Service { - ss := map[string]Service{} - for id := range p.p.Services { - ss[id] = Service{ - id: id, - p: p.p, - } - } - - return ss -} - -// A Region provides information about a region, and ability to resolve an -// endpoint from the context of a region, given a service. -type Region struct { - id, desc string - p *partition -} - -// ID returns the region's identifier. -func (r Region) ID() string { return r.id } - -// Description returns the region's description. The region description -// is free text, it can be empty, and it may change between SDK releases. -func (r Region) Description() string { return r.desc } - -// ResolveEndpoint resolves an endpoint from the context of the region given -// a service. See Partition.EndpointFor for usage and errors that can be returned. -func (r Region) ResolveEndpoint(service string, opts ...func(*Options)) (ResolvedEndpoint, error) { - return r.p.EndpointFor(service, r.id, opts...) -} - -// Services returns a list of all services that are known to be in this region. -func (r Region) Services() map[string]Service { - ss := map[string]Service{} - for id, s := range r.p.Services { - if _, ok := s.Endpoints[r.id]; ok { - ss[id] = Service{ - id: id, - p: r.p, - } - } - } - - return ss -} - -// A Service provides information about a service, and ability to resolve an -// endpoint from the context of a service, given a region. -type Service struct { - id string - p *partition -} - -// ID returns the identifier for the service. -func (s Service) ID() string { return s.id } - -// ResolveEndpoint resolves an endpoint from the context of a service given -// a region. See Partition.EndpointFor for usage and errors that can be returned. -func (s Service) ResolveEndpoint(region string, opts ...func(*Options)) (ResolvedEndpoint, error) { - return s.p.EndpointFor(s.id, region, opts...) -} - -// Regions returns a map of Regions that the service is present in. -// -// A region is the AWS region the service exists in. Whereas a Endpoint is -// an URL that can be resolved to a instance of a service. -func (s Service) Regions() map[string]Region { - rs := map[string]Region{} - for id := range s.p.Services[s.id].Endpoints { - if r, ok := s.p.Regions[id]; ok { - rs[id] = Region{ - id: id, - desc: r.Description, - p: s.p, - } - } - } - - return rs -} - -// Endpoints returns a map of Endpoints indexed by their ID for all known -// endpoints for a service. -// -// A region is the AWS region the service exists in. Whereas a Endpoint is -// an URL that can be resolved to a instance of a service. -func (s Service) Endpoints() map[string]Endpoint { - es := map[string]Endpoint{} - for id := range s.p.Services[s.id].Endpoints { - es[id] = Endpoint{ - id: id, - serviceID: s.id, - p: s.p, - } - } - - return es -} - -// A Endpoint provides information about endpoints, and provides the ability -// to resolve that endpoint for the service, and the region the endpoint -// represents. -type Endpoint struct { - id string - serviceID string - p *partition -} - -// ID returns the identifier for an endpoint. -func (e Endpoint) ID() string { return e.id } - -// ServiceID returns the identifier the endpoint belongs to. -func (e Endpoint) ServiceID() string { return e.serviceID } - -// ResolveEndpoint resolves an endpoint from the context of a service and -// region the endpoint represents. See Partition.EndpointFor for usage and -// errors that can be returned. -func (e Endpoint) ResolveEndpoint(opts ...func(*Options)) (ResolvedEndpoint, error) { - return e.p.EndpointFor(e.serviceID, e.id, opts...) -} - -// A ResolvedEndpoint is an endpoint that has been resolved based on a partition -// service, and region. -type ResolvedEndpoint struct { - // The endpoint URL - URL string - - // The region that should be used for signing requests. - SigningRegion string - - // The service name that should be used for signing requests. - SigningName string - - // States that the signing name for this endpoint was derived from metadata - // passed in, but was not explicitly modeled. - SigningNameDerived bool - - // The signing method that should be used for signing requests. - SigningMethod string -} - -// So that the Error interface type can be included as an anonymous field -// in the requestError struct and not conflict with the error.Error() method. -type awsError awserr.Error - -// A EndpointNotFoundError is returned when in StrictMatching mode, and the -// endpoint for the service and region cannot be found in any of the partitions. -type EndpointNotFoundError struct { - awsError - Partition string - Service string - Region string -} - -// A UnknownServiceError is returned when the service does not resolve to an -// endpoint. Includes a list of all known services for the partition. Returned -// when a partition does not support the service. -type UnknownServiceError struct { - awsError - Partition string - Service string - Known []string -} - -// NewUnknownServiceError builds and returns UnknownServiceError. -func NewUnknownServiceError(p, s string, known []string) UnknownServiceError { - return UnknownServiceError{ - awsError: awserr.New("UnknownServiceError", - "could not resolve endpoint for unknown service", nil), - Partition: p, - Service: s, - Known: known, - } -} - -// String returns the string representation of the error. -func (e UnknownServiceError) Error() string { - extra := fmt.Sprintf("partition: %q, service: %q", - e.Partition, e.Service) - if len(e.Known) > 0 { - extra += fmt.Sprintf(", known: %v", e.Known) - } - return awserr.SprintError(e.Code(), e.Message(), extra, e.OrigErr()) -} - -// String returns the string representation of the error. -func (e UnknownServiceError) String() string { - return e.Error() -} - -// A UnknownEndpointError is returned when in StrictMatching mode and the -// service is valid, but the region does not resolve to an endpoint. Includes -// a list of all known endpoints for the service. -type UnknownEndpointError struct { - awsError - Partition string - Service string - Region string - Known []string -} - -// NewUnknownEndpointError builds and returns UnknownEndpointError. -func NewUnknownEndpointError(p, s, r string, known []string) UnknownEndpointError { - return UnknownEndpointError{ - awsError: awserr.New("UnknownEndpointError", - "could not resolve endpoint", nil), - Partition: p, - Service: s, - Region: r, - Known: known, - } -} - -// String returns the string representation of the error. -func (e UnknownEndpointError) Error() string { - extra := fmt.Sprintf("partition: %q, service: %q, region: %q", - e.Partition, e.Service, e.Region) - if len(e.Known) > 0 { - extra += fmt.Sprintf(", known: %v", e.Known) - } - return awserr.SprintError(e.Code(), e.Message(), extra, e.OrigErr()) -} - -// String returns the string representation of the error. -func (e UnknownEndpointError) String() string { - return e.Error() -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go deleted file mode 100644 index 523ad79ac..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go +++ /dev/null @@ -1,308 +0,0 @@ -package endpoints - -import ( - "fmt" - "regexp" - "strconv" - "strings" -) - -type partitions []partition - -func (ps partitions) EndpointFor(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) { - var opt Options - opt.Set(opts...) - - for i := 0; i < len(ps); i++ { - if !ps[i].canResolveEndpoint(service, region, opt.StrictMatching) { - continue - } - - return ps[i].EndpointFor(service, region, opts...) - } - - // If loose matching fallback to first partition format to use - // when resolving the endpoint. - if !opt.StrictMatching && len(ps) > 0 { - return ps[0].EndpointFor(service, region, opts...) - } - - return ResolvedEndpoint{}, NewUnknownEndpointError("all partitions", service, region, []string{}) -} - -// Partitions satisfies the EnumPartitions interface and returns a list -// of Partitions representing each partition represented in the SDK's -// endpoints model. -func (ps partitions) Partitions() []Partition { - parts := make([]Partition, 0, len(ps)) - for i := 0; i < len(ps); i++ { - parts = append(parts, ps[i].Partition()) - } - - return parts -} - -type partition struct { - ID string `json:"partition"` - Name string `json:"partitionName"` - DNSSuffix string `json:"dnsSuffix"` - RegionRegex regionRegex `json:"regionRegex"` - Defaults endpoint `json:"defaults"` - Regions regions `json:"regions"` - Services services `json:"services"` -} - -func (p partition) Partition() Partition { - return Partition{ - dnsSuffix: p.DNSSuffix, - id: p.ID, - p: &p, - } -} - -func (p partition) canResolveEndpoint(service, region string, strictMatch bool) bool { - s, hasService := p.Services[service] - _, hasEndpoint := s.Endpoints[region] - - if hasEndpoint && hasService { - return true - } - - if strictMatch { - return false - } - - return p.RegionRegex.MatchString(region) -} - -func (p partition) EndpointFor(service, region string, opts ...func(*Options)) (resolved ResolvedEndpoint, err error) { - var opt Options - opt.Set(opts...) - - s, hasService := p.Services[service] - if !(hasService || opt.ResolveUnknownService) { - // Only return error if the resolver will not fallback to creating - // endpoint based on service endpoint ID passed in. - return resolved, NewUnknownServiceError(p.ID, service, serviceList(p.Services)) - } - - e, hasEndpoint := s.endpointForRegion(region) - if !hasEndpoint && opt.StrictMatching { - return resolved, NewUnknownEndpointError(p.ID, service, region, endpointList(s.Endpoints)) - } - - defs := []endpoint{p.Defaults, s.Defaults} - return e.resolve(service, region, p.DNSSuffix, defs, opt), nil -} - -func serviceList(ss services) []string { - list := make([]string, 0, len(ss)) - for k := range ss { - list = append(list, k) - } - return list -} -func endpointList(es endpoints) []string { - list := make([]string, 0, len(es)) - for k := range es { - list = append(list, k) - } - return list -} - -type regionRegex struct { - *regexp.Regexp -} - -func (rr *regionRegex) UnmarshalJSON(b []byte) (err error) { - // Strip leading and trailing quotes - regex, err := strconv.Unquote(string(b)) - if err != nil { - return fmt.Errorf("unable to strip quotes from regex, %v", err) - } - - rr.Regexp, err = regexp.Compile(regex) - if err != nil { - return fmt.Errorf("unable to unmarshal region regex, %v", err) - } - return nil -} - -type regions map[string]region - -type region struct { - Description string `json:"description"` -} - -type services map[string]service - -type service struct { - PartitionEndpoint string `json:"partitionEndpoint"` - IsRegionalized boxedBool `json:"isRegionalized,omitempty"` - Defaults endpoint `json:"defaults"` - Endpoints endpoints `json:"endpoints"` -} - -func (s *service) endpointForRegion(region string) (endpoint, bool) { - if s.IsRegionalized == boxedFalse { - return s.Endpoints[s.PartitionEndpoint], region == s.PartitionEndpoint - } - - if e, ok := s.Endpoints[region]; ok { - return e, true - } - - // Unable to find any matching endpoint, return - // blank that will be used for generic endpoint creation. - return endpoint{}, false -} - -type endpoints map[string]endpoint - -type endpoint struct { - Hostname string `json:"hostname"` - Protocols []string `json:"protocols"` - CredentialScope credentialScope `json:"credentialScope"` - - // Custom fields not modeled - HasDualStack boxedBool `json:"-"` - DualStackHostname string `json:"-"` - - // Signature Version not used - SignatureVersions []string `json:"signatureVersions"` - - // SSLCommonName not used. - SSLCommonName string `json:"sslCommonName"` -} - -const ( - defaultProtocol = "https" - defaultSigner = "v4" -) - -var ( - protocolPriority = []string{"https", "http"} - signerPriority = []string{"v4", "v2"} -) - -func getByPriority(s []string, p []string, def string) string { - if len(s) == 0 { - return def - } - - for i := 0; i < len(p); i++ { - for j := 0; j < len(s); j++ { - if s[j] == p[i] { - return s[j] - } - } - } - - return s[0] -} - -func (e endpoint) resolve(service, region, dnsSuffix string, defs []endpoint, opts Options) ResolvedEndpoint { - var merged endpoint - for _, def := range defs { - merged.mergeIn(def) - } - merged.mergeIn(e) - e = merged - - hostname := e.Hostname - - // Offset the hostname for dualstack if enabled - if opts.UseDualStack && e.HasDualStack == boxedTrue { - hostname = e.DualStackHostname - } - - u := strings.Replace(hostname, "{service}", service, 1) - u = strings.Replace(u, "{region}", region, 1) - u = strings.Replace(u, "{dnsSuffix}", dnsSuffix, 1) - - scheme := getEndpointScheme(e.Protocols, opts.DisableSSL) - u = fmt.Sprintf("%s://%s", scheme, u) - - signingRegion := e.CredentialScope.Region - if len(signingRegion) == 0 { - signingRegion = region - } - - signingName := e.CredentialScope.Service - var signingNameDerived bool - if len(signingName) == 0 { - signingName = service - signingNameDerived = true - } - - return ResolvedEndpoint{ - URL: u, - SigningRegion: signingRegion, - SigningName: signingName, - SigningNameDerived: signingNameDerived, - SigningMethod: getByPriority(e.SignatureVersions, signerPriority, defaultSigner), - } -} - -func getEndpointScheme(protocols []string, disableSSL bool) string { - if disableSSL { - return "http" - } - - return getByPriority(protocols, protocolPriority, defaultProtocol) -} - -func (e *endpoint) mergeIn(other endpoint) { - if len(other.Hostname) > 0 { - e.Hostname = other.Hostname - } - if len(other.Protocols) > 0 { - e.Protocols = other.Protocols - } - if len(other.SignatureVersions) > 0 { - e.SignatureVersions = other.SignatureVersions - } - if len(other.CredentialScope.Region) > 0 { - e.CredentialScope.Region = other.CredentialScope.Region - } - if len(other.CredentialScope.Service) > 0 { - e.CredentialScope.Service = other.CredentialScope.Service - } - if len(other.SSLCommonName) > 0 { - e.SSLCommonName = other.SSLCommonName - } - if other.HasDualStack != boxedBoolUnset { - e.HasDualStack = other.HasDualStack - } - if len(other.DualStackHostname) > 0 { - e.DualStackHostname = other.DualStackHostname - } -} - -type credentialScope struct { - Region string `json:"region"` - Service string `json:"service"` -} - -type boxedBool int - -func (b *boxedBool) UnmarshalJSON(buf []byte) error { - v, err := strconv.ParseBool(string(buf)) - if err != nil { - return err - } - - if v { - *b = boxedTrue - } else { - *b = boxedFalse - } - - return nil -} - -const ( - boxedBoolUnset boxedBool = iota - boxedFalse - boxedTrue -) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go b/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go deleted file mode 100644 index 0fdfcc56e..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go +++ /dev/null @@ -1,351 +0,0 @@ -// +build codegen - -package endpoints - -import ( - "fmt" - "io" - "reflect" - "strings" - "text/template" - "unicode" -) - -// A CodeGenOptions are the options for code generating the endpoints into -// Go code from the endpoints model definition. -type CodeGenOptions struct { - // Options for how the model will be decoded. - DecodeModelOptions DecodeModelOptions - - // Disables code generation of the service endpoint prefix IDs defined in - // the model. - DisableGenerateServiceIDs bool -} - -// Set combines all of the option functions together -func (d *CodeGenOptions) Set(optFns ...func(*CodeGenOptions)) { - for _, fn := range optFns { - fn(d) - } -} - -// CodeGenModel given a endpoints model file will decode it and attempt to -// generate Go code from the model definition. Error will be returned if -// the code is unable to be generated, or decoded. -func CodeGenModel(modelFile io.Reader, outFile io.Writer, optFns ...func(*CodeGenOptions)) error { - var opts CodeGenOptions - opts.Set(optFns...) - - resolver, err := DecodeModel(modelFile, func(d *DecodeModelOptions) { - *d = opts.DecodeModelOptions - }) - if err != nil { - return err - } - - v := struct { - Resolver - CodeGenOptions - }{ - Resolver: resolver, - CodeGenOptions: opts, - } - - tmpl := template.Must(template.New("tmpl").Funcs(funcMap).Parse(v3Tmpl)) - if err := tmpl.ExecuteTemplate(outFile, "defaults", v); err != nil { - return fmt.Errorf("failed to execute template, %v", err) - } - - return nil -} - -func toSymbol(v string) string { - out := []rune{} - for _, c := range strings.Title(v) { - if !(unicode.IsNumber(c) || unicode.IsLetter(c)) { - continue - } - - out = append(out, c) - } - - return string(out) -} - -func quoteString(v string) string { - return fmt.Sprintf("%q", v) -} - -func regionConstName(p, r string) string { - return toSymbol(p) + toSymbol(r) -} - -func partitionGetter(id string) string { - return fmt.Sprintf("%sPartition", toSymbol(id)) -} - -func partitionVarName(id string) string { - return fmt.Sprintf("%sPartition", strings.ToLower(toSymbol(id))) -} - -func listPartitionNames(ps partitions) string { - names := []string{} - switch len(ps) { - case 1: - return ps[0].Name - case 2: - return fmt.Sprintf("%s and %s", ps[0].Name, ps[1].Name) - default: - for i, p := range ps { - if i == len(ps)-1 { - names = append(names, "and "+p.Name) - } else { - names = append(names, p.Name) - } - } - return strings.Join(names, ", ") - } -} - -func boxedBoolIfSet(msg string, v boxedBool) string { - switch v { - case boxedTrue: - return fmt.Sprintf(msg, "boxedTrue") - case boxedFalse: - return fmt.Sprintf(msg, "boxedFalse") - default: - return "" - } -} - -func stringIfSet(msg, v string) string { - if len(v) == 0 { - return "" - } - - return fmt.Sprintf(msg, v) -} - -func stringSliceIfSet(msg string, vs []string) string { - if len(vs) == 0 { - return "" - } - - names := []string{} - for _, v := range vs { - names = append(names, `"`+v+`"`) - } - - return fmt.Sprintf(msg, strings.Join(names, ",")) -} - -func endpointIsSet(v endpoint) bool { - return !reflect.DeepEqual(v, endpoint{}) -} - -func serviceSet(ps partitions) map[string]struct{} { - set := map[string]struct{}{} - for _, p := range ps { - for id := range p.Services { - set[id] = struct{}{} - } - } - - return set -} - -var funcMap = template.FuncMap{ - "ToSymbol": toSymbol, - "QuoteString": quoteString, - "RegionConst": regionConstName, - "PartitionGetter": partitionGetter, - "PartitionVarName": partitionVarName, - "ListPartitionNames": listPartitionNames, - "BoxedBoolIfSet": boxedBoolIfSet, - "StringIfSet": stringIfSet, - "StringSliceIfSet": stringSliceIfSet, - "EndpointIsSet": endpointIsSet, - "ServicesSet": serviceSet, -} - -const v3Tmpl = ` -{{ define "defaults" -}} -// Code generated by aws/endpoints/v3model_codegen.go. DO NOT EDIT. - -package endpoints - -import ( - "regexp" -) - - {{ template "partition consts" $.Resolver }} - - {{ range $_, $partition := $.Resolver }} - {{ template "partition region consts" $partition }} - {{ end }} - - {{ if not $.DisableGenerateServiceIDs -}} - {{ template "service consts" $.Resolver }} - {{- end }} - - {{ template "endpoint resolvers" $.Resolver }} -{{- end }} - -{{ define "partition consts" }} - // Partition identifiers - const ( - {{ range $_, $p := . -}} - {{ ToSymbol $p.ID }}PartitionID = {{ QuoteString $p.ID }} // {{ $p.Name }} partition. - {{ end -}} - ) -{{- end }} - -{{ define "partition region consts" }} - // {{ .Name }} partition's regions. - const ( - {{ range $id, $region := .Regions -}} - {{ ToSymbol $id }}RegionID = {{ QuoteString $id }} // {{ $region.Description }}. - {{ end -}} - ) -{{- end }} - -{{ define "service consts" }} - // Service identifiers - const ( - {{ $serviceSet := ServicesSet . -}} - {{ range $id, $_ := $serviceSet -}} - {{ ToSymbol $id }}ServiceID = {{ QuoteString $id }} // {{ ToSymbol $id }}. - {{ end -}} - ) -{{- end }} - -{{ define "endpoint resolvers" }} - // DefaultResolver returns an Endpoint resolver that will be able - // to resolve endpoints for: {{ ListPartitionNames . }}. - // - // Use DefaultPartitions() to get the list of the default partitions. - func DefaultResolver() Resolver { - return defaultPartitions - } - - // DefaultPartitions returns a list of the partitions the SDK is bundled - // with. The available partitions are: {{ ListPartitionNames . }}. - // - // partitions := endpoints.DefaultPartitions - // for _, p := range partitions { - // // ... inspect partitions - // } - func DefaultPartitions() []Partition { - return defaultPartitions.Partitions() - } - - var defaultPartitions = partitions{ - {{ range $_, $partition := . -}} - {{ PartitionVarName $partition.ID }}, - {{ end }} - } - - {{ range $_, $partition := . -}} - {{ $name := PartitionGetter $partition.ID -}} - // {{ $name }} returns the Resolver for {{ $partition.Name }}. - func {{ $name }}() Partition { - return {{ PartitionVarName $partition.ID }}.Partition() - } - var {{ PartitionVarName $partition.ID }} = {{ template "gocode Partition" $partition }} - {{ end }} -{{ end }} - -{{ define "default partitions" }} - func DefaultPartitions() []Partition { - return []partition{ - {{ range $_, $partition := . -}} - // {{ ToSymbol $partition.ID}}Partition(), - {{ end }} - } - } -{{ end }} - -{{ define "gocode Partition" -}} -partition{ - {{ StringIfSet "ID: %q,\n" .ID -}} - {{ StringIfSet "Name: %q,\n" .Name -}} - {{ StringIfSet "DNSSuffix: %q,\n" .DNSSuffix -}} - RegionRegex: {{ template "gocode RegionRegex" .RegionRegex }}, - {{ if EndpointIsSet .Defaults -}} - Defaults: {{ template "gocode Endpoint" .Defaults }}, - {{- end }} - Regions: {{ template "gocode Regions" .Regions }}, - Services: {{ template "gocode Services" .Services }}, -} -{{- end }} - -{{ define "gocode RegionRegex" -}} -regionRegex{ - Regexp: func() *regexp.Regexp{ - reg, _ := regexp.Compile({{ QuoteString .Regexp.String }}) - return reg - }(), -} -{{- end }} - -{{ define "gocode Regions" -}} -regions{ - {{ range $id, $region := . -}} - "{{ $id }}": {{ template "gocode Region" $region }}, - {{ end -}} -} -{{- end }} - -{{ define "gocode Region" -}} -region{ - {{ StringIfSet "Description: %q,\n" .Description -}} -} -{{- end }} - -{{ define "gocode Services" -}} -services{ - {{ range $id, $service := . -}} - "{{ $id }}": {{ template "gocode Service" $service }}, - {{ end }} -} -{{- end }} - -{{ define "gocode Service" -}} -service{ - {{ StringIfSet "PartitionEndpoint: %q,\n" .PartitionEndpoint -}} - {{ BoxedBoolIfSet "IsRegionalized: %s,\n" .IsRegionalized -}} - {{ if EndpointIsSet .Defaults -}} - Defaults: {{ template "gocode Endpoint" .Defaults -}}, - {{- end }} - {{ if .Endpoints -}} - Endpoints: {{ template "gocode Endpoints" .Endpoints }}, - {{- end }} -} -{{- end }} - -{{ define "gocode Endpoints" -}} -endpoints{ - {{ range $id, $endpoint := . -}} - "{{ $id }}": {{ template "gocode Endpoint" $endpoint }}, - {{ end }} -} -{{- end }} - -{{ define "gocode Endpoint" -}} -endpoint{ - {{ StringIfSet "Hostname: %q,\n" .Hostname -}} - {{ StringIfSet "SSLCommonName: %q,\n" .SSLCommonName -}} - {{ StringSliceIfSet "Protocols: []string{%s},\n" .Protocols -}} - {{ StringSliceIfSet "SignatureVersions: []string{%s},\n" .SignatureVersions -}} - {{ if or .CredentialScope.Region .CredentialScope.Service -}} - CredentialScope: credentialScope{ - {{ StringIfSet "Region: %q,\n" .CredentialScope.Region -}} - {{ StringIfSet "Service: %q,\n" .CredentialScope.Service -}} - }, - {{- end }} - {{ BoxedBoolIfSet "HasDualStack: %s,\n" .HasDualStack -}} - {{ StringIfSet "DualStackHostname: %q,\n" .DualStackHostname -}} - -} -{{- end }} -` diff --git a/vendor/github.com/aws/aws-sdk-go/aws/errors.go b/vendor/github.com/aws/aws-sdk-go/aws/errors.go deleted file mode 100644 index fa06f7a8f..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/errors.go +++ /dev/null @@ -1,13 +0,0 @@ -package aws - -import "github.com/aws/aws-sdk-go/aws/awserr" - -var ( - // ErrMissingRegion is an error that is returned if region configuration is - // not found. - ErrMissingRegion = awserr.New("MissingRegion", "could not find region configuration", nil) - - // ErrMissingEndpoint is an error that is returned if an endpoint cannot be - // resolved for a service. - ErrMissingEndpoint = awserr.New("MissingEndpoint", "'Endpoint' configuration is required for this service", nil) -) diff --git a/vendor/github.com/aws/aws-sdk-go/aws/jsonvalue.go b/vendor/github.com/aws/aws-sdk-go/aws/jsonvalue.go deleted file mode 100644 index 91a6f277a..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/jsonvalue.go +++ /dev/null @@ -1,12 +0,0 @@ -package aws - -// JSONValue is a representation of a grab bag type that will be marshaled -// into a json string. This type can be used just like any other map. -// -// Example: -// -// values := aws.JSONValue{ -// "Foo": "Bar", -// } -// values["Baz"] = "Qux" -type JSONValue map[string]interface{} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/logger.go b/vendor/github.com/aws/aws-sdk-go/aws/logger.go deleted file mode 100644 index 6ed15b2ec..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/logger.go +++ /dev/null @@ -1,118 +0,0 @@ -package aws - -import ( - "log" - "os" -) - -// A LogLevelType defines the level logging should be performed at. Used to instruct -// the SDK which statements should be logged. -type LogLevelType uint - -// LogLevel returns the pointer to a LogLevel. Should be used to workaround -// not being able to take the address of a non-composite literal. -func LogLevel(l LogLevelType) *LogLevelType { - return &l -} - -// Value returns the LogLevel value or the default value LogOff if the LogLevel -// is nil. Safe to use on nil value LogLevelTypes. -func (l *LogLevelType) Value() LogLevelType { - if l != nil { - return *l - } - return LogOff -} - -// Matches returns true if the v LogLevel is enabled by this LogLevel. Should be -// used with logging sub levels. Is safe to use on nil value LogLevelTypes. If -// LogLevel is nil, will default to LogOff comparison. -func (l *LogLevelType) Matches(v LogLevelType) bool { - c := l.Value() - return c&v == v -} - -// AtLeast returns true if this LogLevel is at least high enough to satisfies v. -// Is safe to use on nil value LogLevelTypes. If LogLevel is nil, will default -// to LogOff comparison. -func (l *LogLevelType) AtLeast(v LogLevelType) bool { - c := l.Value() - return c >= v -} - -const ( - // LogOff states that no logging should be performed by the SDK. This is the - // default state of the SDK, and should be use to disable all logging. - LogOff LogLevelType = iota * 0x1000 - - // LogDebug state that debug output should be logged by the SDK. This should - // be used to inspect request made and responses received. - LogDebug -) - -// Debug Logging Sub Levels -const ( - // LogDebugWithSigning states that the SDK should log request signing and - // presigning events. This should be used to log the signing details of - // requests for debugging. Will also enable LogDebug. - LogDebugWithSigning LogLevelType = LogDebug | (1 << iota) - - // LogDebugWithHTTPBody states the SDK should log HTTP request and response - // HTTP bodys in addition to the headers and path. This should be used to - // see the body content of requests and responses made while using the SDK - // Will also enable LogDebug. - LogDebugWithHTTPBody - - // LogDebugWithRequestRetries states the SDK should log when service requests will - // be retried. This should be used to log when you want to log when service - // requests are being retried. Will also enable LogDebug. - LogDebugWithRequestRetries - - // LogDebugWithRequestErrors states the SDK should log when service requests fail - // to build, send, validate, or unmarshal. - LogDebugWithRequestErrors - - // LogDebugWithEventStreamBody states the SDK should log EventStream - // request and response bodys. This should be used to log the EventStream - // wire unmarshaled message content of requests and responses made while - // using the SDK Will also enable LogDebug. - LogDebugWithEventStreamBody -) - -// A Logger is a minimalistic interface for the SDK to log messages to. Should -// be used to provide custom logging writers for the SDK to use. -type Logger interface { - Log(...interface{}) -} - -// A LoggerFunc is a convenience type to convert a function taking a variadic -// list of arguments and wrap it so the Logger interface can be used. -// -// Example: -// s3.New(sess, &aws.Config{Logger: aws.LoggerFunc(func(args ...interface{}) { -// fmt.Fprintln(os.Stdout, args...) -// })}) -type LoggerFunc func(...interface{}) - -// Log calls the wrapped function with the arguments provided -func (f LoggerFunc) Log(args ...interface{}) { - f(args...) -} - -// NewDefaultLogger returns a Logger which will write log messages to stdout, and -// use same formatting runes as the stdlib log.Logger -func NewDefaultLogger() Logger { - return &defaultLogger{ - logger: log.New(os.Stdout, "", log.LstdFlags), - } -} - -// A defaultLogger provides a minimalistic logger satisfying the Logger interface. -type defaultLogger struct { - logger *log.Logger -} - -// Log logs the parameters to the stdlib logger. See log.Println. -func (l defaultLogger) Log(args ...interface{}) { - l.logger.Println(args...) -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go b/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go deleted file mode 100644 index d9b37f4d3..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go +++ /dev/null @@ -1,18 +0,0 @@ -package request - -import ( - "strings" -) - -func isErrConnectionReset(err error) bool { - if strings.Contains(err.Error(), "read: connection reset") { - return false - } - - if strings.Contains(err.Error(), "connection reset") || - strings.Contains(err.Error(), "broken pipe") { - return true - } - - return false -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go b/vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go deleted file mode 100644 index 627ec722c..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go +++ /dev/null @@ -1,322 +0,0 @@ -package request - -import ( - "fmt" - "strings" -) - -// A Handlers provides a collection of request handlers for various -// stages of handling requests. -type Handlers struct { - Validate HandlerList - Build HandlerList - Sign HandlerList - Send HandlerList - ValidateResponse HandlerList - Unmarshal HandlerList - UnmarshalStream HandlerList - UnmarshalMeta HandlerList - UnmarshalError HandlerList - Retry HandlerList - AfterRetry HandlerList - CompleteAttempt HandlerList - Complete HandlerList -} - -// Copy returns of this handler's lists. -func (h *Handlers) Copy() Handlers { - return Handlers{ - Validate: h.Validate.copy(), - Build: h.Build.copy(), - Sign: h.Sign.copy(), - Send: h.Send.copy(), - ValidateResponse: h.ValidateResponse.copy(), - Unmarshal: h.Unmarshal.copy(), - UnmarshalStream: h.UnmarshalStream.copy(), - UnmarshalError: h.UnmarshalError.copy(), - UnmarshalMeta: h.UnmarshalMeta.copy(), - Retry: h.Retry.copy(), - AfterRetry: h.AfterRetry.copy(), - CompleteAttempt: h.CompleteAttempt.copy(), - Complete: h.Complete.copy(), - } -} - -// Clear removes callback functions for all handlers -func (h *Handlers) Clear() { - h.Validate.Clear() - h.Build.Clear() - h.Send.Clear() - h.Sign.Clear() - h.Unmarshal.Clear() - h.UnmarshalStream.Clear() - h.UnmarshalMeta.Clear() - h.UnmarshalError.Clear() - h.ValidateResponse.Clear() - h.Retry.Clear() - h.AfterRetry.Clear() - h.CompleteAttempt.Clear() - h.Complete.Clear() -} - -// IsEmpty returns if there are no handlers in any of the handlerlists. -func (h *Handlers) IsEmpty() bool { - if h.Validate.Len() != 0 { - return false - } - if h.Build.Len() != 0 { - return false - } - if h.Send.Len() != 0 { - return false - } - if h.Sign.Len() != 0 { - return false - } - if h.Unmarshal.Len() != 0 { - return false - } - if h.UnmarshalStream.Len() != 0 { - return false - } - if h.UnmarshalMeta.Len() != 0 { - return false - } - if h.UnmarshalError.Len() != 0 { - return false - } - if h.ValidateResponse.Len() != 0 { - return false - } - if h.Retry.Len() != 0 { - return false - } - if h.AfterRetry.Len() != 0 { - return false - } - if h.CompleteAttempt.Len() != 0 { - return false - } - if h.Complete.Len() != 0 { - return false - } - - return true -} - -// A HandlerListRunItem represents an entry in the HandlerList which -// is being run. -type HandlerListRunItem struct { - Index int - Handler NamedHandler - Request *Request -} - -// A HandlerList manages zero or more handlers in a list. -type HandlerList struct { - list []NamedHandler - - // Called after each request handler in the list is called. If set - // and the func returns true the HandlerList will continue to iterate - // over the request handlers. If false is returned the HandlerList - // will stop iterating. - // - // Should be used if extra logic to be performed between each handler - // in the list. This can be used to terminate a list's iteration - // based on a condition such as error like, HandlerListStopOnError. - // Or for logging like HandlerListLogItem. - AfterEachFn func(item HandlerListRunItem) bool -} - -// A NamedHandler is a struct that contains a name and function callback. -type NamedHandler struct { - Name string - Fn func(*Request) -} - -// copy creates a copy of the handler list. -func (l *HandlerList) copy() HandlerList { - n := HandlerList{ - AfterEachFn: l.AfterEachFn, - } - if len(l.list) == 0 { - return n - } - - n.list = append(make([]NamedHandler, 0, len(l.list)), l.list...) - return n -} - -// Clear clears the handler list. -func (l *HandlerList) Clear() { - l.list = l.list[0:0] -} - -// Len returns the number of handlers in the list. -func (l *HandlerList) Len() int { - return len(l.list) -} - -// PushBack pushes handler f to the back of the handler list. -func (l *HandlerList) PushBack(f func(*Request)) { - l.PushBackNamed(NamedHandler{"__anonymous", f}) -} - -// PushBackNamed pushes named handler f to the back of the handler list. -func (l *HandlerList) PushBackNamed(n NamedHandler) { - if cap(l.list) == 0 { - l.list = make([]NamedHandler, 0, 5) - } - l.list = append(l.list, n) -} - -// PushFront pushes handler f to the front of the handler list. -func (l *HandlerList) PushFront(f func(*Request)) { - l.PushFrontNamed(NamedHandler{"__anonymous", f}) -} - -// PushFrontNamed pushes named handler f to the front of the handler list. -func (l *HandlerList) PushFrontNamed(n NamedHandler) { - if cap(l.list) == len(l.list) { - // Allocating new list required - l.list = append([]NamedHandler{n}, l.list...) - } else { - // Enough room to prepend into list. - l.list = append(l.list, NamedHandler{}) - copy(l.list[1:], l.list) - l.list[0] = n - } -} - -// Remove removes a NamedHandler n -func (l *HandlerList) Remove(n NamedHandler) { - l.RemoveByName(n.Name) -} - -// RemoveByName removes a NamedHandler by name. -func (l *HandlerList) RemoveByName(name string) { - for i := 0; i < len(l.list); i++ { - m := l.list[i] - if m.Name == name { - // Shift array preventing creating new arrays - copy(l.list[i:], l.list[i+1:]) - l.list[len(l.list)-1] = NamedHandler{} - l.list = l.list[:len(l.list)-1] - - // decrement list so next check to length is correct - i-- - } - } -} - -// SwapNamed will swap out any existing handlers with the same name as the -// passed in NamedHandler returning true if handlers were swapped. False is -// returned otherwise. -func (l *HandlerList) SwapNamed(n NamedHandler) (swapped bool) { - for i := 0; i < len(l.list); i++ { - if l.list[i].Name == n.Name { - l.list[i].Fn = n.Fn - swapped = true - } - } - - return swapped -} - -// Swap will swap out all handlers matching the name passed in. The matched -// handlers will be swapped in. True is returned if the handlers were swapped. -func (l *HandlerList) Swap(name string, replace NamedHandler) bool { - var swapped bool - - for i := 0; i < len(l.list); i++ { - if l.list[i].Name == name { - l.list[i] = replace - swapped = true - } - } - - return swapped -} - -// SetBackNamed will replace the named handler if it exists in the handler list. -// If the handler does not exist the handler will be added to the end of the list. -func (l *HandlerList) SetBackNamed(n NamedHandler) { - if !l.SwapNamed(n) { - l.PushBackNamed(n) - } -} - -// SetFrontNamed will replace the named handler if it exists in the handler list. -// If the handler does not exist the handler will be added to the beginning of -// the list. -func (l *HandlerList) SetFrontNamed(n NamedHandler) { - if !l.SwapNamed(n) { - l.PushFrontNamed(n) - } -} - -// Run executes all handlers in the list with a given request object. -func (l *HandlerList) Run(r *Request) { - for i, h := range l.list { - h.Fn(r) - item := HandlerListRunItem{ - Index: i, Handler: h, Request: r, - } - if l.AfterEachFn != nil && !l.AfterEachFn(item) { - return - } - } -} - -// HandlerListLogItem logs the request handler and the state of the -// request's Error value. Always returns true to continue iterating -// request handlers in a HandlerList. -func HandlerListLogItem(item HandlerListRunItem) bool { - if item.Request.Config.Logger == nil { - return true - } - item.Request.Config.Logger.Log("DEBUG: RequestHandler", - item.Index, item.Handler.Name, item.Request.Error) - - return true -} - -// HandlerListStopOnError returns false to stop the HandlerList iterating -// over request handlers if Request.Error is not nil. True otherwise -// to continue iterating. -func HandlerListStopOnError(item HandlerListRunItem) bool { - return item.Request.Error == nil -} - -// WithAppendUserAgent will add a string to the user agent prefixed with a -// single white space. -func WithAppendUserAgent(s string) Option { - return func(r *Request) { - r.Handlers.Build.PushBack(func(r2 *Request) { - AddToUserAgent(r, s) - }) - } -} - -// MakeAddToUserAgentHandler will add the name/version pair to the User-Agent request -// header. If the extra parameters are provided they will be added as metadata to the -// name/version pair resulting in the following format. -// "name/version (extra0; extra1; ...)" -// The user agent part will be concatenated with this current request's user agent string. -func MakeAddToUserAgentHandler(name, version string, extra ...string) func(*Request) { - ua := fmt.Sprintf("%s/%s", name, version) - if len(extra) > 0 { - ua += fmt.Sprintf(" (%s)", strings.Join(extra, "; ")) - } - return func(r *Request) { - AddToUserAgent(r, ua) - } -} - -// MakeAddToUserAgentFreeFormHandler adds the input to the User-Agent request header. -// The input string will be concatenated with the current request's user agent string. -func MakeAddToUserAgentFreeFormHandler(s string) func(*Request) { - return func(r *Request) { - AddToUserAgent(r, s) - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go b/vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go deleted file mode 100644 index 79f79602b..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/http_request.go +++ /dev/null @@ -1,24 +0,0 @@ -package request - -import ( - "io" - "net/http" - "net/url" -) - -func copyHTTPRequest(r *http.Request, body io.ReadCloser) *http.Request { - req := new(http.Request) - *req = *r - req.URL = &url.URL{} - *req.URL = *r.URL - req.Body = body - - req.Header = http.Header{} - for k, v := range r.Header { - for _, vv := range v { - req.Header.Add(k, vv) - } - } - - return req -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go b/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go deleted file mode 100644 index 9370fa50c..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/offset_reader.go +++ /dev/null @@ -1,65 +0,0 @@ -package request - -import ( - "io" - "sync" - - "github.com/aws/aws-sdk-go/internal/sdkio" -) - -// offsetReader is a thread-safe io.ReadCloser to prevent racing -// with retrying requests -type offsetReader struct { - buf io.ReadSeeker - lock sync.Mutex - closed bool -} - -func newOffsetReader(buf io.ReadSeeker, offset int64) (*offsetReader, error) { - reader := &offsetReader{} - _, err := buf.Seek(offset, sdkio.SeekStart) - if err != nil { - return nil, err - } - - reader.buf = buf - return reader, nil -} - -// Close will close the instance of the offset reader's access to -// the underlying io.ReadSeeker. -func (o *offsetReader) Close() error { - o.lock.Lock() - defer o.lock.Unlock() - o.closed = true - return nil -} - -// Read is a thread-safe read of the underlying io.ReadSeeker -func (o *offsetReader) Read(p []byte) (int, error) { - o.lock.Lock() - defer o.lock.Unlock() - - if o.closed { - return 0, io.EOF - } - - return o.buf.Read(p) -} - -// Seek is a thread-safe seeking operation. -func (o *offsetReader) Seek(offset int64, whence int) (int64, error) { - o.lock.Lock() - defer o.lock.Unlock() - - return o.buf.Seek(offset, whence) -} - -// CloseAndCopy will return a new offsetReader with a copy of the old buffer -// and close the old buffer. -func (o *offsetReader) CloseAndCopy(offset int64) (*offsetReader, error) { - if err := o.Close(); err != nil { - return nil, err - } - return newOffsetReader(o.buf, offset) -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request.go deleted file mode 100644 index 8e332cce6..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/request.go +++ /dev/null @@ -1,670 +0,0 @@ -package request - -import ( - "bytes" - "fmt" - "io" - "net/http" - "net/url" - "reflect" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/client/metadata" - "github.com/aws/aws-sdk-go/internal/sdkio" -) - -const ( - // ErrCodeSerialization is the serialization error code that is received - // during protocol unmarshaling. - ErrCodeSerialization = "SerializationError" - - // ErrCodeRead is an error that is returned during HTTP reads. - ErrCodeRead = "ReadError" - - // ErrCodeResponseTimeout is the connection timeout error that is received - // during body reads. - ErrCodeResponseTimeout = "ResponseTimeout" - - // ErrCodeInvalidPresignExpire is returned when the expire time provided to - // presign is invalid - ErrCodeInvalidPresignExpire = "InvalidPresignExpireError" - - // CanceledErrorCode is the error code that will be returned by an - // API request that was canceled. Requests given a aws.Context may - // return this error when canceled. - CanceledErrorCode = "RequestCanceled" -) - -// A Request is the service request to be made. -type Request struct { - Config aws.Config - ClientInfo metadata.ClientInfo - Handlers Handlers - - Retryer - AttemptTime time.Time - Time time.Time - Operation *Operation - HTTPRequest *http.Request - HTTPResponse *http.Response - Body io.ReadSeeker - BodyStart int64 // offset from beginning of Body that the request body starts - Params interface{} - Error error - Data interface{} - RequestID string - RetryCount int - Retryable *bool - RetryDelay time.Duration - NotHoist bool - SignedHeaderVals http.Header - LastSignedAt time.Time - DisableFollowRedirects bool - - // Additional API error codes that should be retried. IsErrorRetryable - // will consider these codes in addition to its built in cases. - RetryErrorCodes []string - - // Additional API error codes that should be retried with throttle backoff - // delay. IsErrorThrottle will consider these codes in addition to its - // built in cases. - ThrottleErrorCodes []string - - // A value greater than 0 instructs the request to be signed as Presigned URL - // You should not set this field directly. Instead use Request's - // Presign or PresignRequest methods. - ExpireTime time.Duration - - context aws.Context - - built bool - - // Need to persist an intermediate body between the input Body and HTTP - // request body because the HTTP Client's transport can maintain a reference - // to the HTTP request's body after the client has returned. This value is - // safe to use concurrently and wrap the input Body for each HTTP request. - safeBody *offsetReader -} - -// An Operation is the service API operation to be made. -type Operation struct { - Name string - HTTPMethod string - HTTPPath string - *Paginator - - BeforePresignFn func(r *Request) error -} - -// New returns a new Request pointer for the service API -// operation and parameters. -// -// Params is any value of input parameters to be the request payload. -// Data is pointer value to an object which the request's response -// payload will be deserialized to. -func New(cfg aws.Config, clientInfo metadata.ClientInfo, handlers Handlers, - retryer Retryer, operation *Operation, params interface{}, data interface{}) *Request { - - method := operation.HTTPMethod - if method == "" { - method = "POST" - } - - httpReq, _ := http.NewRequest(method, "", nil) - - var err error - httpReq.URL, err = url.Parse(clientInfo.Endpoint + operation.HTTPPath) - if err != nil { - httpReq.URL = &url.URL{} - err = awserr.New("InvalidEndpointURL", "invalid endpoint uri", err) - } - - SanitizeHostForHeader(httpReq) - - r := &Request{ - Config: cfg, - ClientInfo: clientInfo, - Handlers: handlers.Copy(), - - Retryer: retryer, - Time: time.Now(), - ExpireTime: 0, - Operation: operation, - HTTPRequest: httpReq, - Body: nil, - Params: params, - Error: err, - Data: data, - } - r.SetBufferBody([]byte{}) - - return r -} - -// A Option is a functional option that can augment or modify a request when -// using a WithContext API operation method. -type Option func(*Request) - -// WithGetResponseHeader builds a request Option which will retrieve a single -// header value from the HTTP Response. If there are multiple values for the -// header key use WithGetResponseHeaders instead to access the http.Header -// map directly. The passed in val pointer must be non-nil. -// -// This Option can be used multiple times with a single API operation. -// -// var id2, versionID string -// svc.PutObjectWithContext(ctx, params, -// request.WithGetResponseHeader("x-amz-id-2", &id2), -// request.WithGetResponseHeader("x-amz-version-id", &versionID), -// ) -func WithGetResponseHeader(key string, val *string) Option { - return func(r *Request) { - r.Handlers.Complete.PushBack(func(req *Request) { - *val = req.HTTPResponse.Header.Get(key) - }) - } -} - -// WithGetResponseHeaders builds a request Option which will retrieve the -// headers from the HTTP response and assign them to the passed in headers -// variable. The passed in headers pointer must be non-nil. -// -// var headers http.Header -// svc.PutObjectWithContext(ctx, params, request.WithGetResponseHeaders(&headers)) -func WithGetResponseHeaders(headers *http.Header) Option { - return func(r *Request) { - r.Handlers.Complete.PushBack(func(req *Request) { - *headers = req.HTTPResponse.Header - }) - } -} - -// WithLogLevel is a request option that will set the request to use a specific -// log level when the request is made. -// -// svc.PutObjectWithContext(ctx, params, request.WithLogLevel(aws.LogDebugWithHTTPBody) -func WithLogLevel(l aws.LogLevelType) Option { - return func(r *Request) { - r.Config.LogLevel = aws.LogLevel(l) - } -} - -// ApplyOptions will apply each option to the request calling them in the order -// the were provided. -func (r *Request) ApplyOptions(opts ...Option) { - for _, opt := range opts { - opt(r) - } -} - -// Context will always returns a non-nil context. If Request does not have a -// context aws.BackgroundContext will be returned. -func (r *Request) Context() aws.Context { - if r.context != nil { - return r.context - } - return aws.BackgroundContext() -} - -// SetContext adds a Context to the current request that can be used to cancel -// a in-flight request. The Context value must not be nil, or this method will -// panic. -// -// Unlike http.Request.WithContext, SetContext does not return a copy of the -// Request. It is not safe to use use a single Request value for multiple -// requests. A new Request should be created for each API operation request. -// -// Go 1.6 and below: -// The http.Request's Cancel field will be set to the Done() value of -// the context. This will overwrite the Cancel field's value. -// -// Go 1.7 and above: -// The http.Request.WithContext will be used to set the context on the underlying -// http.Request. This will create a shallow copy of the http.Request. The SDK -// may create sub contexts in the future for nested requests such as retries. -func (r *Request) SetContext(ctx aws.Context) { - if ctx == nil { - panic("context cannot be nil") - } - setRequestContext(r, ctx) -} - -// WillRetry returns if the request's can be retried. -func (r *Request) WillRetry() bool { - if !aws.IsReaderSeekable(r.Body) && r.HTTPRequest.Body != NoBody { - return false - } - return r.Error != nil && aws.BoolValue(r.Retryable) && r.RetryCount < r.MaxRetries() -} - -func fmtAttemptCount(retryCount, maxRetries int) string { - return fmt.Sprintf("attempt %v/%v", retryCount, maxRetries) -} - -// ParamsFilled returns if the request's parameters have been populated -// and the parameters are valid. False is returned if no parameters are -// provided or invalid. -func (r *Request) ParamsFilled() bool { - return r.Params != nil && reflect.ValueOf(r.Params).Elem().IsValid() -} - -// DataFilled returns true if the request's data for response deserialization -// target has been set and is a valid. False is returned if data is not -// set, or is invalid. -func (r *Request) DataFilled() bool { - return r.Data != nil && reflect.ValueOf(r.Data).Elem().IsValid() -} - -// SetBufferBody will set the request's body bytes that will be sent to -// the service API. -func (r *Request) SetBufferBody(buf []byte) { - r.SetReaderBody(bytes.NewReader(buf)) -} - -// SetStringBody sets the body of the request to be backed by a string. -func (r *Request) SetStringBody(s string) { - r.SetReaderBody(strings.NewReader(s)) -} - -// SetReaderBody will set the request's body reader. -func (r *Request) SetReaderBody(reader io.ReadSeeker) { - r.Body = reader - - if aws.IsReaderSeekable(reader) { - var err error - // Get the Bodies current offset so retries will start from the same - // initial position. - r.BodyStart, err = reader.Seek(0, sdkio.SeekCurrent) - if err != nil { - r.Error = awserr.New(ErrCodeSerialization, - "failed to determine start of request body", err) - return - } - } - r.ResetBody() -} - -// Presign returns the request's signed URL. Error will be returned -// if the signing fails. The expire parameter is only used for presigned Amazon -// S3 API requests. All other AWS services will use a fixed expiration -// time of 15 minutes. -// -// It is invalid to create a presigned URL with a expire duration 0 or less. An -// error is returned if expire duration is 0 or less. -func (r *Request) Presign(expire time.Duration) (string, error) { - r = r.copy() - - // Presign requires all headers be hoisted. There is no way to retrieve - // the signed headers not hoisted without this. Making the presigned URL - // useless. - r.NotHoist = false - - u, _, err := getPresignedURL(r, expire) - return u, err -} - -// PresignRequest behaves just like presign, with the addition of returning a -// set of headers that were signed. The expire parameter is only used for -// presigned Amazon S3 API requests. All other AWS services will use a fixed -// expiration time of 15 minutes. -// -// It is invalid to create a presigned URL with a expire duration 0 or less. An -// error is returned if expire duration is 0 or less. -// -// Returns the URL string for the API operation with signature in the query string, -// and the HTTP headers that were included in the signature. These headers must -// be included in any HTTP request made with the presigned URL. -// -// To prevent hoisting any headers to the query string set NotHoist to true on -// this Request value prior to calling PresignRequest. -func (r *Request) PresignRequest(expire time.Duration) (string, http.Header, error) { - r = r.copy() - return getPresignedURL(r, expire) -} - -// IsPresigned returns true if the request represents a presigned API url. -func (r *Request) IsPresigned() bool { - return r.ExpireTime != 0 -} - -func getPresignedURL(r *Request, expire time.Duration) (string, http.Header, error) { - if expire <= 0 { - return "", nil, awserr.New( - ErrCodeInvalidPresignExpire, - "presigned URL requires an expire duration greater than 0", - nil, - ) - } - - r.ExpireTime = expire - - if r.Operation.BeforePresignFn != nil { - if err := r.Operation.BeforePresignFn(r); err != nil { - return "", nil, err - } - } - - if err := r.Sign(); err != nil { - return "", nil, err - } - - return r.HTTPRequest.URL.String(), r.SignedHeaderVals, nil -} - -const ( - notRetrying = "not retrying" -) - -func debugLogReqError(r *Request, stage, retryStr string, err error) { - if !r.Config.LogLevel.Matches(aws.LogDebugWithRequestErrors) { - return - } - - r.Config.Logger.Log(fmt.Sprintf("DEBUG: %s %s/%s failed, %s, error %v", - stage, r.ClientInfo.ServiceName, r.Operation.Name, retryStr, err)) -} - -// Build will build the request's object so it can be signed and sent -// to the service. Build will also validate all the request's parameters. -// Any additional build Handlers set on this request will be run -// in the order they were set. -// -// The request will only be built once. Multiple calls to build will have -// no effect. -// -// If any Validate or Build errors occur the build will stop and the error -// which occurred will be returned. -func (r *Request) Build() error { - if !r.built { - r.Handlers.Validate.Run(r) - if r.Error != nil { - debugLogReqError(r, "Validate Request", notRetrying, r.Error) - return r.Error - } - r.Handlers.Build.Run(r) - if r.Error != nil { - debugLogReqError(r, "Build Request", notRetrying, r.Error) - return r.Error - } - r.built = true - } - - return r.Error -} - -// Sign will sign the request, returning error if errors are encountered. -// -// Sign will build the request prior to signing. All Sign Handlers will -// be executed in the order they were set. -func (r *Request) Sign() error { - r.Build() - if r.Error != nil { - debugLogReqError(r, "Build Request", notRetrying, r.Error) - return r.Error - } - - r.Handlers.Sign.Run(r) - return r.Error -} - -func (r *Request) getNextRequestBody() (body io.ReadCloser, err error) { - if r.safeBody != nil { - r.safeBody.Close() - } - - r.safeBody, err = newOffsetReader(r.Body, r.BodyStart) - if err != nil { - return nil, awserr.New(ErrCodeSerialization, - "failed to get next request body reader", err) - } - - // Go 1.8 tightened and clarified the rules code needs to use when building - // requests with the http package. Go 1.8 removed the automatic detection - // of if the Request.Body was empty, or actually had bytes in it. The SDK - // always sets the Request.Body even if it is empty and should not actually - // be sent. This is incorrect. - // - // Go 1.8 did add a http.NoBody value that the SDK can use to tell the http - // client that the request really should be sent without a body. The - // Request.Body cannot be set to nil, which is preferable, because the - // field is exported and could introduce nil pointer dereferences for users - // of the SDK if they used that field. - // - // Related golang/go#18257 - l, err := aws.SeekerLen(r.Body) - if err != nil { - return nil, awserr.New(ErrCodeSerialization, - "failed to compute request body size", err) - } - - if l == 0 { - body = NoBody - } else if l > 0 { - body = r.safeBody - } else { - // Hack to prevent sending bodies for methods where the body - // should be ignored by the server. Sending bodies on these - // methods without an associated ContentLength will cause the - // request to socket timeout because the server does not handle - // Transfer-Encoding: chunked bodies for these methods. - // - // This would only happen if a aws.ReaderSeekerCloser was used with - // a io.Reader that was not also an io.Seeker, or did not implement - // Len() method. - switch r.Operation.HTTPMethod { - case "GET", "HEAD", "DELETE": - body = NoBody - default: - body = r.safeBody - } - } - - return body, nil -} - -// GetBody will return an io.ReadSeeker of the Request's underlying -// input body with a concurrency safe wrapper. -func (r *Request) GetBody() io.ReadSeeker { - return r.safeBody -} - -// Send will send the request, returning error if errors are encountered. -// -// Send will sign the request prior to sending. All Send Handlers will -// be executed in the order they were set. -// -// Canceling a request is non-deterministic. If a request has been canceled, -// then the transport will choose, randomly, one of the state channels during -// reads or getting the connection. -// -// readLoop() and getConn(req *Request, cm connectMethod) -// https://github.com/golang/go/blob/master/src/net/http/transport.go -// -// Send will not close the request.Request's body. -func (r *Request) Send() error { - defer func() { - // Regardless of success or failure of the request trigger the Complete - // request handlers. - r.Handlers.Complete.Run(r) - }() - - if err := r.Error; err != nil { - return err - } - - for { - r.Error = nil - r.AttemptTime = time.Now() - - if err := r.Sign(); err != nil { - debugLogReqError(r, "Sign Request", notRetrying, err) - return err - } - - if err := r.sendRequest(); err == nil { - return nil - } - r.Handlers.Retry.Run(r) - r.Handlers.AfterRetry.Run(r) - - if r.Error != nil || !aws.BoolValue(r.Retryable) { - return r.Error - } - - if err := r.prepareRetry(); err != nil { - r.Error = err - return err - } - } -} - -func (r *Request) prepareRetry() error { - if r.Config.LogLevel.Matches(aws.LogDebugWithRequestRetries) { - r.Config.Logger.Log(fmt.Sprintf("DEBUG: Retrying Request %s/%s, attempt %d", - r.ClientInfo.ServiceName, r.Operation.Name, r.RetryCount)) - } - - // The previous http.Request will have a reference to the r.Body - // and the HTTP Client's Transport may still be reading from - // the request's body even though the Client's Do returned. - r.HTTPRequest = copyHTTPRequest(r.HTTPRequest, nil) - r.ResetBody() - if err := r.Error; err != nil { - return awserr.New(ErrCodeSerialization, - "failed to prepare body for retry", err) - - } - - // Closing response body to ensure that no response body is leaked - // between retry attempts. - if r.HTTPResponse != nil && r.HTTPResponse.Body != nil { - r.HTTPResponse.Body.Close() - } - - return nil -} - -func (r *Request) sendRequest() (sendErr error) { - defer r.Handlers.CompleteAttempt.Run(r) - - r.Retryable = nil - r.Handlers.Send.Run(r) - if r.Error != nil { - debugLogReqError(r, "Send Request", - fmtAttemptCount(r.RetryCount, r.MaxRetries()), - r.Error) - return r.Error - } - - r.Handlers.UnmarshalMeta.Run(r) - r.Handlers.ValidateResponse.Run(r) - if r.Error != nil { - r.Handlers.UnmarshalError.Run(r) - debugLogReqError(r, "Validate Response", - fmtAttemptCount(r.RetryCount, r.MaxRetries()), - r.Error) - return r.Error - } - - r.Handlers.Unmarshal.Run(r) - if r.Error != nil { - debugLogReqError(r, "Unmarshal Response", - fmtAttemptCount(r.RetryCount, r.MaxRetries()), - r.Error) - return r.Error - } - - return nil -} - -// copy will copy a request which will allow for local manipulation of the -// request. -func (r *Request) copy() *Request { - req := &Request{} - *req = *r - req.Handlers = r.Handlers.Copy() - op := *r.Operation - req.Operation = &op - return req -} - -// AddToUserAgent adds the string to the end of the request's current user agent. -func AddToUserAgent(r *Request, s string) { - curUA := r.HTTPRequest.Header.Get("User-Agent") - if len(curUA) > 0 { - s = curUA + " " + s - } - r.HTTPRequest.Header.Set("User-Agent", s) -} - -// SanitizeHostForHeader removes default port from host and updates request.Host -func SanitizeHostForHeader(r *http.Request) { - host := getHost(r) - port := portOnly(host) - if port != "" && isDefaultPort(r.URL.Scheme, port) { - r.Host = stripPort(host) - } -} - -// Returns host from request -func getHost(r *http.Request) string { - if r.Host != "" { - return r.Host - } - - return r.URL.Host -} - -// Hostname returns u.Host, without any port number. -// -// If Host is an IPv6 literal with a port number, Hostname returns the -// IPv6 literal without the square brackets. IPv6 literals may include -// a zone identifier. -// -// Copied from the Go 1.8 standard library (net/url) -func stripPort(hostport string) string { - colon := strings.IndexByte(hostport, ':') - if colon == -1 { - return hostport - } - if i := strings.IndexByte(hostport, ']'); i != -1 { - return strings.TrimPrefix(hostport[:i], "[") - } - return hostport[:colon] -} - -// Port returns the port part of u.Host, without the leading colon. -// If u.Host doesn't contain a port, Port returns an empty string. -// -// Copied from the Go 1.8 standard library (net/url) -func portOnly(hostport string) string { - colon := strings.IndexByte(hostport, ':') - if colon == -1 { - return "" - } - if i := strings.Index(hostport, "]:"); i != -1 { - return hostport[i+len("]:"):] - } - if strings.Contains(hostport, "]") { - return "" - } - return hostport[colon+len(":"):] -} - -// Returns true if the specified URI is using the standard port -// (i.e. port 80 for HTTP URIs or 443 for HTTPS URIs) -func isDefaultPort(scheme, port string) bool { - if port == "" { - return true - } - - lowerCaseScheme := strings.ToLower(scheme) - if (lowerCaseScheme == "http" && port == "80") || (lowerCaseScheme == "https" && port == "443") { - return true - } - - return false -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go deleted file mode 100644 index e36e468b7..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go +++ /dev/null @@ -1,39 +0,0 @@ -// +build !go1.8 - -package request - -import "io" - -// NoBody is an io.ReadCloser with no bytes. Read always returns EOF -// and Close always returns nil. It can be used in an outgoing client -// request to explicitly signal that a request has zero bytes. -// An alternative, however, is to simply set Request.Body to nil. -// -// Copy of Go 1.8 NoBody type from net/http/http.go -type noBody struct{} - -func (noBody) Read([]byte) (int, error) { return 0, io.EOF } -func (noBody) Close() error { return nil } -func (noBody) WriteTo(io.Writer) (int64, error) { return 0, nil } - -// NoBody is an empty reader that will trigger the Go HTTP client to not include -// and body in the HTTP request. -var NoBody = noBody{} - -// ResetBody rewinds the request body back to its starting position, and -// sets the HTTP Request body reference. When the body is read prior -// to being sent in the HTTP request it will need to be rewound. -// -// ResetBody will automatically be called by the SDK's build handler, but if -// the request is being used directly ResetBody must be called before the request -// is Sent. SetStringBody, SetBufferBody, and SetReaderBody will automatically -// call ResetBody. -func (r *Request) ResetBody() { - body, err := r.getNextRequestBody() - if err != nil { - r.Error = err - return - } - - r.HTTPRequest.Body = body -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go deleted file mode 100644 index de1292f45..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go +++ /dev/null @@ -1,36 +0,0 @@ -// +build go1.8 - -package request - -import ( - "net/http" - - "github.com/aws/aws-sdk-go/aws/awserr" -) - -// NoBody is a http.NoBody reader instructing Go HTTP client to not include -// and body in the HTTP request. -var NoBody = http.NoBody - -// ResetBody rewinds the request body back to its starting position, and -// sets the HTTP Request body reference. When the body is read prior -// to being sent in the HTTP request it will need to be rewound. -// -// ResetBody will automatically be called by the SDK's build handler, but if -// the request is being used directly ResetBody must be called before the request -// is Sent. SetStringBody, SetBufferBody, and SetReaderBody will automatically -// call ResetBody. -// -// Will also set the Go 1.8's http.Request.GetBody member to allow retrying -// PUT/POST redirects. -func (r *Request) ResetBody() { - body, err := r.getNextRequestBody() - if err != nil { - r.Error = awserr.New(ErrCodeSerialization, - "failed to reset request body", err) - return - } - - r.HTTPRequest.Body = body - r.HTTPRequest.GetBody = r.getNextRequestBody -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_context.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_context.go deleted file mode 100644 index a7365cd1e..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/request_context.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build go1.7 - -package request - -import "github.com/aws/aws-sdk-go/aws" - -// setContext updates the Request to use the passed in context for cancellation. -// Context will also be used for request retry delay. -// -// Creates shallow copy of the http.Request with the WithContext method. -func setRequestContext(r *Request, ctx aws.Context) { - r.context = ctx - r.HTTPRequest = r.HTTPRequest.WithContext(ctx) -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_context_1_6.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_context_1_6.go deleted file mode 100644 index 307fa0705..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/request_context_1_6.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !go1.7 - -package request - -import "github.com/aws/aws-sdk-go/aws" - -// setContext updates the Request to use the passed in context for cancellation. -// Context will also be used for request retry delay. -// -// Creates shallow copy of the http.Request with the WithContext method. -func setRequestContext(r *Request, ctx aws.Context) { - r.context = ctx - r.HTTPRequest.Cancel = ctx.Done() -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go b/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go deleted file mode 100644 index f093fc542..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go +++ /dev/null @@ -1,264 +0,0 @@ -package request - -import ( - "reflect" - "sync/atomic" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awsutil" -) - -// A Pagination provides paginating of SDK API operations which are paginatable. -// Generally you should not use this type directly, but use the "Pages" API -// operations method to automatically perform pagination for you. Such as, -// "S3.ListObjectsPages", and "S3.ListObjectsPagesWithContext" methods. -// -// Pagination differs from a Paginator type in that pagination is the type that -// does the pagination between API operations, and Paginator defines the -// configuration that will be used per page request. -// -// cont := true -// for p.Next() && cont { -// data := p.Page().(*s3.ListObjectsOutput) -// // process the page's data -// } -// return p.Err() -// -// See service client API operation Pages methods for examples how the SDK will -// use the Pagination type. -type Pagination struct { - // Function to return a Request value for each pagination request. - // Any configuration or handlers that need to be applied to the request - // prior to getting the next page should be done here before the request - // returned. - // - // NewRequest should always be built from the same API operations. It is - // undefined if different API operations are returned on subsequent calls. - NewRequest func() (*Request, error) - // EndPageOnSameToken, when enabled, will allow the paginator to stop on - // token that are the same as its previous tokens. - EndPageOnSameToken bool - - started bool - prevTokens []interface{} - nextTokens []interface{} - - err error - curPage interface{} -} - -// HasNextPage will return true if Pagination is able to determine that the API -// operation has additional pages. False will be returned if there are no more -// pages remaining. -// -// Will always return true if Next has not been called yet. -func (p *Pagination) HasNextPage() bool { - if !p.started { - return true - } - - hasNextPage := len(p.nextTokens) != 0 - if p.EndPageOnSameToken { - return hasNextPage && !awsutil.DeepEqual(p.nextTokens, p.prevTokens) - } - return hasNextPage -} - -// Err returns the error Pagination encountered when retrieving the next page. -func (p *Pagination) Err() error { - return p.err -} - -// Page returns the current page. Page should only be called after a successful -// call to Next. It is undefined what Page will return if Page is called after -// Next returns false. -func (p *Pagination) Page() interface{} { - return p.curPage -} - -// Next will attempt to retrieve the next page for the API operation. When a page -// is retrieved true will be returned. If the page cannot be retrieved, or there -// are no more pages false will be returned. -// -// Use the Page method to retrieve the current page data. The data will need -// to be cast to the API operation's output type. -// -// Use the Err method to determine if an error occurred if Page returns false. -func (p *Pagination) Next() bool { - if !p.HasNextPage() { - return false - } - - req, err := p.NewRequest() - if err != nil { - p.err = err - return false - } - - if p.started { - for i, intok := range req.Operation.InputTokens { - awsutil.SetValueAtPath(req.Params, intok, p.nextTokens[i]) - } - } - p.started = true - - err = req.Send() - if err != nil { - p.err = err - return false - } - - p.prevTokens = p.nextTokens - p.nextTokens = req.nextPageTokens() - p.curPage = req.Data - - return true -} - -// A Paginator is the configuration data that defines how an API operation -// should be paginated. This type is used by the API service models to define -// the generated pagination config for service APIs. -// -// The Pagination type is what provides iterating between pages of an API. It -// is only used to store the token metadata the SDK should use for performing -// pagination. -type Paginator struct { - InputTokens []string - OutputTokens []string - LimitToken string - TruncationToken string -} - -// nextPageTokens returns the tokens to use when asking for the next page of data. -func (r *Request) nextPageTokens() []interface{} { - if r.Operation.Paginator == nil { - return nil - } - if r.Operation.TruncationToken != "" { - tr, _ := awsutil.ValuesAtPath(r.Data, r.Operation.TruncationToken) - if len(tr) == 0 { - return nil - } - - switch v := tr[0].(type) { - case *bool: - if !aws.BoolValue(v) { - return nil - } - case bool: - if !v { - return nil - } - } - } - - tokens := []interface{}{} - tokenAdded := false - for _, outToken := range r.Operation.OutputTokens { - vs, _ := awsutil.ValuesAtPath(r.Data, outToken) - if len(vs) == 0 { - tokens = append(tokens, nil) - continue - } - v := vs[0] - - switch tv := v.(type) { - case *string: - if len(aws.StringValue(tv)) == 0 { - tokens = append(tokens, nil) - continue - } - case string: - if len(tv) == 0 { - tokens = append(tokens, nil) - continue - } - } - - tokenAdded = true - tokens = append(tokens, v) - } - if !tokenAdded { - return nil - } - - return tokens -} - -// Ensure a deprecated item is only logged once instead of each time its used. -func logDeprecatedf(logger aws.Logger, flag *int32, msg string) { - if logger == nil { - return - } - if atomic.CompareAndSwapInt32(flag, 0, 1) { - logger.Log(msg) - } -} - -var ( - logDeprecatedHasNextPage int32 - logDeprecatedNextPage int32 - logDeprecatedEachPage int32 -) - -// HasNextPage returns true if this request has more pages of data available. -// -// Deprecated Use Pagination type for configurable pagination of API operations -func (r *Request) HasNextPage() bool { - logDeprecatedf(r.Config.Logger, &logDeprecatedHasNextPage, - "Request.HasNextPage deprecated. Use Pagination type for configurable pagination of API operations") - - return len(r.nextPageTokens()) > 0 -} - -// NextPage returns a new Request that can be executed to return the next -// page of result data. Call .Send() on this request to execute it. -// -// Deprecated Use Pagination type for configurable pagination of API operations -func (r *Request) NextPage() *Request { - logDeprecatedf(r.Config.Logger, &logDeprecatedNextPage, - "Request.NextPage deprecated. Use Pagination type for configurable pagination of API operations") - - tokens := r.nextPageTokens() - if len(tokens) == 0 { - return nil - } - - data := reflect.New(reflect.TypeOf(r.Data).Elem()).Interface() - nr := New(r.Config, r.ClientInfo, r.Handlers, r.Retryer, r.Operation, awsutil.CopyOf(r.Params), data) - for i, intok := range nr.Operation.InputTokens { - awsutil.SetValueAtPath(nr.Params, intok, tokens[i]) - } - return nr -} - -// EachPage iterates over each page of a paginated request object. The fn -// parameter should be a function with the following sample signature: -// -// func(page *T, lastPage bool) bool { -// return true // return false to stop iterating -// } -// -// Where "T" is the structure type matching the output structure of the given -// operation. For example, a request object generated by -// DynamoDB.ListTablesRequest() would expect to see dynamodb.ListTablesOutput -// as the structure "T". The lastPage value represents whether the page is -// the last page of data or not. The return value of this function should -// return true to keep iterating or false to stop. -// -// Deprecated Use Pagination type for configurable pagination of API operations -func (r *Request) EachPage(fn func(data interface{}, isLastPage bool) (shouldContinue bool)) error { - logDeprecatedf(r.Config.Logger, &logDeprecatedEachPage, - "Request.EachPage deprecated. Use Pagination type for configurable pagination of API operations") - - for page := r; page != nil; page = page.NextPage() { - if err := page.Send(); err != nil { - return err - } - if getNextPage := fn(page.Data, !page.HasNextPage()); !getNextPage { - return page.Error - } - } - - return nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go b/vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go deleted file mode 100644 index c4e659b01..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go +++ /dev/null @@ -1,266 +0,0 @@ -package request - -import ( - "net" - "net/url" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" -) - -// Retryer provides the interface drive the SDK's request retry behavior. The -// Retryer implementation is responsible for implementing exponential backoff, -// and determine if a request API error should be retried. -// -// client.DefaultRetryer is the SDK's default implementation of the Retryer. It -// uses the which uses the Request.IsErrorRetryable and Request.IsErrorThrottle -// methods to determine if the request is retried. -type Retryer interface { - // RetryRules return the retry delay that should be used by the SDK before - // making another request attempt for the failed request. - RetryRules(*Request) time.Duration - - // ShouldRetry returns if the failed request is retryable. - // - // Implementations may consider request attempt count when determining if a - // request is retryable, but the SDK will use MaxRetries to limit the - // number of attempts a request are made. - ShouldRetry(*Request) bool - - // MaxRetries is the number of times a request may be retried before - // failing. - MaxRetries() int -} - -// WithRetryer sets a Retryer value to the given Config returning the Config -// value for chaining. -func WithRetryer(cfg *aws.Config, retryer Retryer) *aws.Config { - cfg.Retryer = retryer - return cfg -} - -// retryableCodes is a collection of service response codes which are retry-able -// without any further action. -var retryableCodes = map[string]struct{}{ - "RequestError": {}, - "RequestTimeout": {}, - ErrCodeResponseTimeout: {}, - "RequestTimeoutException": {}, // Glacier's flavor of RequestTimeout -} - -var throttleCodes = map[string]struct{}{ - "ProvisionedThroughputExceededException": {}, - "Throttling": {}, - "ThrottlingException": {}, - "RequestLimitExceeded": {}, - "RequestThrottled": {}, - "RequestThrottledException": {}, - "TooManyRequestsException": {}, // Lambda functions - "PriorRequestNotComplete": {}, // Route53 - "TransactionInProgressException": {}, -} - -// credsExpiredCodes is a collection of error codes which signify the credentials -// need to be refreshed. Expired tokens require refreshing of credentials, and -// resigning before the request can be retried. -var credsExpiredCodes = map[string]struct{}{ - "ExpiredToken": {}, - "ExpiredTokenException": {}, - "RequestExpired": {}, // EC2 Only -} - -func isCodeThrottle(code string) bool { - _, ok := throttleCodes[code] - return ok -} - -func isCodeRetryable(code string) bool { - if _, ok := retryableCodes[code]; ok { - return true - } - - return isCodeExpiredCreds(code) -} - -func isCodeExpiredCreds(code string) bool { - _, ok := credsExpiredCodes[code] - return ok -} - -var validParentCodes = map[string]struct{}{ - ErrCodeSerialization: {}, - ErrCodeRead: {}, -} - -type temporaryError interface { - Temporary() bool -} - -func isNestedErrorRetryable(parentErr awserr.Error) bool { - if parentErr == nil { - return false - } - - if _, ok := validParentCodes[parentErr.Code()]; !ok { - return false - } - - err := parentErr.OrigErr() - if err == nil { - return false - } - - if aerr, ok := err.(awserr.Error); ok { - return isCodeRetryable(aerr.Code()) - } - - if t, ok := err.(temporaryError); ok { - return t.Temporary() || isErrConnectionReset(err) - } - - return isErrConnectionReset(err) -} - -// IsErrorRetryable returns whether the error is retryable, based on its Code. -// Returns false if error is nil. -func IsErrorRetryable(err error) bool { - if err == nil { - return false - } - return shouldRetryError(err) -} - -type temporary interface { - Temporary() bool -} - -func shouldRetryError(origErr error) bool { - switch err := origErr.(type) { - case awserr.Error: - if err.Code() == CanceledErrorCode { - return false - } - if isNestedErrorRetryable(err) { - return true - } - - origErr := err.OrigErr() - var shouldRetry bool - if origErr != nil { - shouldRetry := shouldRetryError(origErr) - if err.Code() == "RequestError" && !shouldRetry { - return false - } - } - if isCodeRetryable(err.Code()) { - return true - } - return shouldRetry - - case *url.Error: - if strings.Contains(err.Error(), "connection refused") { - // Refused connections should be retried as the service may not yet - // be running on the port. Go TCP dial considers refused - // connections as not temporary. - return true - } - // *url.Error only implements Temporary after golang 1.6 but since - // url.Error only wraps the error: - return shouldRetryError(err.Err) - - case temporary: - if netErr, ok := err.(*net.OpError); ok && netErr.Op == "dial" { - return true - } - // If the error is temporary, we want to allow continuation of the - // retry process - return err.Temporary() || isErrConnectionReset(origErr) - - case nil: - // `awserr.Error.OrigErr()` can be nil, meaning there was an error but - // because we don't know the cause, it is marked as retryable. See - // TestRequest4xxUnretryable for an example. - return true - - default: - switch err.Error() { - case "net/http: request canceled", - "net/http: request canceled while waiting for connection": - // known 1.5 error case when an http request is cancelled - return false - } - // here we don't know the error; so we allow a retry. - return true - } -} - -// IsErrorThrottle returns whether the error is to be throttled based on its code. -// Returns false if error is nil. -func IsErrorThrottle(err error) bool { - if aerr, ok := err.(awserr.Error); ok && aerr != nil { - return isCodeThrottle(aerr.Code()) - } - return false -} - -// IsErrorExpiredCreds returns whether the error code is a credential expiry -// error. Returns false if error is nil. -func IsErrorExpiredCreds(err error) bool { - if aerr, ok := err.(awserr.Error); ok && aerr != nil { - return isCodeExpiredCreds(aerr.Code()) - } - return false -} - -// IsErrorRetryable returns whether the error is retryable, based on its Code. -// Returns false if the request has no Error set. -// -// Alias for the utility function IsErrorRetryable -func (r *Request) IsErrorRetryable() bool { - if isErrCode(r.Error, r.RetryErrorCodes) { - return true - } - - return IsErrorRetryable(r.Error) -} - -// IsErrorThrottle returns whether the error is to be throttled based on its -// code. Returns false if the request has no Error set. -// -// Alias for the utility function IsErrorThrottle -func (r *Request) IsErrorThrottle() bool { - if isErrCode(r.Error, r.ThrottleErrorCodes) { - return true - } - - if r.HTTPResponse != nil { - switch r.HTTPResponse.StatusCode { - case 429, 502, 503, 504: - return true - } - } - - return IsErrorThrottle(r.Error) -} - -func isErrCode(err error, codes []string) bool { - if aerr, ok := err.(awserr.Error); ok && aerr != nil { - for _, code := range codes { - if code == aerr.Code() { - return true - } - } - } - - return false -} - -// IsErrorExpired returns whether the error code is a credential expiry error. -// Returns false if the request has no Error set. -// -// Alias for the utility function IsErrorExpiredCreds -func (r *Request) IsErrorExpired() bool { - return IsErrorExpiredCreds(r.Error) -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/timeout_read_closer.go b/vendor/github.com/aws/aws-sdk-go/aws/request/timeout_read_closer.go deleted file mode 100644 index 09a44eb98..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/timeout_read_closer.go +++ /dev/null @@ -1,94 +0,0 @@ -package request - -import ( - "io" - "time" - - "github.com/aws/aws-sdk-go/aws/awserr" -) - -var timeoutErr = awserr.New( - ErrCodeResponseTimeout, - "read on body has reached the timeout limit", - nil, -) - -type readResult struct { - n int - err error -} - -// timeoutReadCloser will handle body reads that take too long. -// We will return a ErrReadTimeout error if a timeout occurs. -type timeoutReadCloser struct { - reader io.ReadCloser - duration time.Duration -} - -// Read will spin off a goroutine to call the reader's Read method. We will -// select on the timer's channel or the read's channel. Whoever completes first -// will be returned. -func (r *timeoutReadCloser) Read(b []byte) (int, error) { - timer := time.NewTimer(r.duration) - c := make(chan readResult, 1) - - go func() { - n, err := r.reader.Read(b) - timer.Stop() - c <- readResult{n: n, err: err} - }() - - select { - case data := <-c: - return data.n, data.err - case <-timer.C: - return 0, timeoutErr - } -} - -func (r *timeoutReadCloser) Close() error { - return r.reader.Close() -} - -const ( - // HandlerResponseTimeout is what we use to signify the name of the - // response timeout handler. - HandlerResponseTimeout = "ResponseTimeoutHandler" -) - -// adaptToResponseTimeoutError is a handler that will replace any top level error -// to a ErrCodeResponseTimeout, if its child is that. -func adaptToResponseTimeoutError(req *Request) { - if err, ok := req.Error.(awserr.Error); ok { - aerr, ok := err.OrigErr().(awserr.Error) - if ok && aerr.Code() == ErrCodeResponseTimeout { - req.Error = aerr - } - } -} - -// WithResponseReadTimeout is a request option that will wrap the body in a timeout read closer. -// This will allow for per read timeouts. If a timeout occurred, we will return the -// ErrCodeResponseTimeout. -// -// svc.PutObjectWithContext(ctx, params, request.WithTimeoutReadCloser(30 * time.Second) -func WithResponseReadTimeout(duration time.Duration) Option { - return func(r *Request) { - - var timeoutHandler = NamedHandler{ - HandlerResponseTimeout, - func(req *Request) { - req.HTTPResponse.Body = &timeoutReadCloser{ - reader: req.HTTPResponse.Body, - duration: duration, - } - }} - - // remove the handler so we are not stomping over any new durations. - r.Handlers.Send.RemoveByName(HandlerResponseTimeout) - r.Handlers.Send.PushBackNamed(timeoutHandler) - - r.Handlers.Unmarshal.PushBack(adaptToResponseTimeoutError) - r.Handlers.UnmarshalError.PushBack(adaptToResponseTimeoutError) - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/validation.go b/vendor/github.com/aws/aws-sdk-go/aws/request/validation.go deleted file mode 100644 index 8630683f3..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/validation.go +++ /dev/null @@ -1,286 +0,0 @@ -package request - -import ( - "bytes" - "fmt" - - "github.com/aws/aws-sdk-go/aws/awserr" -) - -const ( - // InvalidParameterErrCode is the error code for invalid parameters errors - InvalidParameterErrCode = "InvalidParameter" - // ParamRequiredErrCode is the error code for required parameter errors - ParamRequiredErrCode = "ParamRequiredError" - // ParamMinValueErrCode is the error code for fields with too low of a - // number value. - ParamMinValueErrCode = "ParamMinValueError" - // ParamMinLenErrCode is the error code for fields without enough elements. - ParamMinLenErrCode = "ParamMinLenError" - // ParamMaxLenErrCode is the error code for value being too long. - ParamMaxLenErrCode = "ParamMaxLenError" - - // ParamFormatErrCode is the error code for a field with invalid - // format or characters. - ParamFormatErrCode = "ParamFormatInvalidError" -) - -// Validator provides a way for types to perform validation logic on their -// input values that external code can use to determine if a type's values -// are valid. -type Validator interface { - Validate() error -} - -// An ErrInvalidParams provides wrapping of invalid parameter errors found when -// validating API operation input parameters. -type ErrInvalidParams struct { - // Context is the base context of the invalid parameter group. - Context string - errs []ErrInvalidParam -} - -// Add adds a new invalid parameter error to the collection of invalid -// parameters. The context of the invalid parameter will be updated to reflect -// this collection. -func (e *ErrInvalidParams) Add(err ErrInvalidParam) { - err.SetContext(e.Context) - e.errs = append(e.errs, err) -} - -// AddNested adds the invalid parameter errors from another ErrInvalidParams -// value into this collection. The nested errors will have their nested context -// updated and base context to reflect the merging. -// -// Use for nested validations errors. -func (e *ErrInvalidParams) AddNested(nestedCtx string, nested ErrInvalidParams) { - for _, err := range nested.errs { - err.SetContext(e.Context) - err.AddNestedContext(nestedCtx) - e.errs = append(e.errs, err) - } -} - -// Len returns the number of invalid parameter errors -func (e ErrInvalidParams) Len() int { - return len(e.errs) -} - -// Code returns the code of the error -func (e ErrInvalidParams) Code() string { - return InvalidParameterErrCode -} - -// Message returns the message of the error -func (e ErrInvalidParams) Message() string { - return fmt.Sprintf("%d validation error(s) found.", len(e.errs)) -} - -// Error returns the string formatted form of the invalid parameters. -func (e ErrInvalidParams) Error() string { - w := &bytes.Buffer{} - fmt.Fprintf(w, "%s: %s\n", e.Code(), e.Message()) - - for _, err := range e.errs { - fmt.Fprintf(w, "- %s\n", err.Message()) - } - - return w.String() -} - -// OrigErr returns the invalid parameters as a awserr.BatchedErrors value -func (e ErrInvalidParams) OrigErr() error { - return awserr.NewBatchError( - InvalidParameterErrCode, e.Message(), e.OrigErrs()) -} - -// OrigErrs returns a slice of the invalid parameters -func (e ErrInvalidParams) OrigErrs() []error { - errs := make([]error, len(e.errs)) - for i := 0; i < len(errs); i++ { - errs[i] = e.errs[i] - } - - return errs -} - -// An ErrInvalidParam represents an invalid parameter error type. -type ErrInvalidParam interface { - awserr.Error - - // Field name the error occurred on. - Field() string - - // SetContext updates the context of the error. - SetContext(string) - - // AddNestedContext updates the error's context to include a nested level. - AddNestedContext(string) -} - -type errInvalidParam struct { - context string - nestedContext string - field string - code string - msg string -} - -// Code returns the error code for the type of invalid parameter. -func (e *errInvalidParam) Code() string { - return e.code -} - -// Message returns the reason the parameter was invalid, and its context. -func (e *errInvalidParam) Message() string { - return fmt.Sprintf("%s, %s.", e.msg, e.Field()) -} - -// Error returns the string version of the invalid parameter error. -func (e *errInvalidParam) Error() string { - return fmt.Sprintf("%s: %s", e.code, e.Message()) -} - -// OrigErr returns nil, Implemented for awserr.Error interface. -func (e *errInvalidParam) OrigErr() error { - return nil -} - -// Field Returns the field and context the error occurred. -func (e *errInvalidParam) Field() string { - field := e.context - if len(field) > 0 { - field += "." - } - if len(e.nestedContext) > 0 { - field += fmt.Sprintf("%s.", e.nestedContext) - } - field += e.field - - return field -} - -// SetContext updates the base context of the error. -func (e *errInvalidParam) SetContext(ctx string) { - e.context = ctx -} - -// AddNestedContext prepends a context to the field's path. -func (e *errInvalidParam) AddNestedContext(ctx string) { - if len(e.nestedContext) == 0 { - e.nestedContext = ctx - } else { - e.nestedContext = fmt.Sprintf("%s.%s", ctx, e.nestedContext) - } - -} - -// An ErrParamRequired represents an required parameter error. -type ErrParamRequired struct { - errInvalidParam -} - -// NewErrParamRequired creates a new required parameter error. -func NewErrParamRequired(field string) *ErrParamRequired { - return &ErrParamRequired{ - errInvalidParam{ - code: ParamRequiredErrCode, - field: field, - msg: fmt.Sprintf("missing required field"), - }, - } -} - -// An ErrParamMinValue represents a minimum value parameter error. -type ErrParamMinValue struct { - errInvalidParam - min float64 -} - -// NewErrParamMinValue creates a new minimum value parameter error. -func NewErrParamMinValue(field string, min float64) *ErrParamMinValue { - return &ErrParamMinValue{ - errInvalidParam: errInvalidParam{ - code: ParamMinValueErrCode, - field: field, - msg: fmt.Sprintf("minimum field value of %v", min), - }, - min: min, - } -} - -// MinValue returns the field's require minimum value. -// -// float64 is returned for both int and float min values. -func (e *ErrParamMinValue) MinValue() float64 { - return e.min -} - -// An ErrParamMinLen represents a minimum length parameter error. -type ErrParamMinLen struct { - errInvalidParam - min int -} - -// NewErrParamMinLen creates a new minimum length parameter error. -func NewErrParamMinLen(field string, min int) *ErrParamMinLen { - return &ErrParamMinLen{ - errInvalidParam: errInvalidParam{ - code: ParamMinLenErrCode, - field: field, - msg: fmt.Sprintf("minimum field size of %v", min), - }, - min: min, - } -} - -// MinLen returns the field's required minimum length. -func (e *ErrParamMinLen) MinLen() int { - return e.min -} - -// An ErrParamMaxLen represents a maximum length parameter error. -type ErrParamMaxLen struct { - errInvalidParam - max int -} - -// NewErrParamMaxLen creates a new maximum length parameter error. -func NewErrParamMaxLen(field string, max int, value string) *ErrParamMaxLen { - return &ErrParamMaxLen{ - errInvalidParam: errInvalidParam{ - code: ParamMaxLenErrCode, - field: field, - msg: fmt.Sprintf("maximum size of %v, %v", max, value), - }, - max: max, - } -} - -// MaxLen returns the field's required minimum length. -func (e *ErrParamMaxLen) MaxLen() int { - return e.max -} - -// An ErrParamFormat represents a invalid format parameter error. -type ErrParamFormat struct { - errInvalidParam - format string -} - -// NewErrParamFormat creates a new invalid format parameter error. -func NewErrParamFormat(field string, format, value string) *ErrParamFormat { - return &ErrParamFormat{ - errInvalidParam: errInvalidParam{ - code: ParamFormatErrCode, - field: field, - msg: fmt.Sprintf("format %v, %v", format, value), - }, - format: format, - } -} - -// Format returns the field's required format. -func (e *ErrParamFormat) Format() string { - return e.format -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/request/waiter.go b/vendor/github.com/aws/aws-sdk-go/aws/request/waiter.go deleted file mode 100644 index 4601f883c..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/request/waiter.go +++ /dev/null @@ -1,295 +0,0 @@ -package request - -import ( - "fmt" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/awsutil" -) - -// WaiterResourceNotReadyErrorCode is the error code returned by a waiter when -// the waiter's max attempts have been exhausted. -const WaiterResourceNotReadyErrorCode = "ResourceNotReady" - -// A WaiterOption is a function that will update the Waiter value's fields to -// configure the waiter. -type WaiterOption func(*Waiter) - -// WithWaiterMaxAttempts returns the maximum number of times the waiter should -// attempt to check the resource for the target state. -func WithWaiterMaxAttempts(max int) WaiterOption { - return func(w *Waiter) { - w.MaxAttempts = max - } -} - -// WaiterDelay will return a delay the waiter should pause between attempts to -// check the resource state. The passed in attempt is the number of times the -// Waiter has checked the resource state. -// -// Attempt is the number of attempts the Waiter has made checking the resource -// state. -type WaiterDelay func(attempt int) time.Duration - -// ConstantWaiterDelay returns a WaiterDelay that will always return a constant -// delay the waiter should use between attempts. It ignores the number of -// attempts made. -func ConstantWaiterDelay(delay time.Duration) WaiterDelay { - return func(attempt int) time.Duration { - return delay - } -} - -// WithWaiterDelay will set the Waiter to use the WaiterDelay passed in. -func WithWaiterDelay(delayer WaiterDelay) WaiterOption { - return func(w *Waiter) { - w.Delay = delayer - } -} - -// WithWaiterLogger returns a waiter option to set the logger a waiter -// should use to log warnings and errors to. -func WithWaiterLogger(logger aws.Logger) WaiterOption { - return func(w *Waiter) { - w.Logger = logger - } -} - -// WithWaiterRequestOptions returns a waiter option setting the request -// options for each request the waiter makes. Appends to waiter's request -// options already set. -func WithWaiterRequestOptions(opts ...Option) WaiterOption { - return func(w *Waiter) { - w.RequestOptions = append(w.RequestOptions, opts...) - } -} - -// A Waiter provides the functionality to perform a blocking call which will -// wait for a resource state to be satisfied by a service. -// -// This type should not be used directly. The API operations provided in the -// service packages prefixed with "WaitUntil" should be used instead. -type Waiter struct { - Name string - Acceptors []WaiterAcceptor - Logger aws.Logger - - MaxAttempts int - Delay WaiterDelay - - RequestOptions []Option - NewRequest func([]Option) (*Request, error) - SleepWithContext func(aws.Context, time.Duration) error -} - -// ApplyOptions updates the waiter with the list of waiter options provided. -func (w *Waiter) ApplyOptions(opts ...WaiterOption) { - for _, fn := range opts { - fn(w) - } -} - -// WaiterState are states the waiter uses based on WaiterAcceptor definitions -// to identify if the resource state the waiter is waiting on has occurred. -type WaiterState int - -// String returns the string representation of the waiter state. -func (s WaiterState) String() string { - switch s { - case SuccessWaiterState: - return "success" - case FailureWaiterState: - return "failure" - case RetryWaiterState: - return "retry" - default: - return "unknown waiter state" - } -} - -// States the waiter acceptors will use to identify target resource states. -const ( - SuccessWaiterState WaiterState = iota // waiter successful - FailureWaiterState // waiter failed - RetryWaiterState // waiter needs to be retried -) - -// WaiterMatchMode is the mode that the waiter will use to match the WaiterAcceptor -// definition's Expected attribute. -type WaiterMatchMode int - -// Modes the waiter will use when inspecting API response to identify target -// resource states. -const ( - PathAllWaiterMatch WaiterMatchMode = iota // match on all paths - PathWaiterMatch // match on specific path - PathAnyWaiterMatch // match on any path - PathListWaiterMatch // match on list of paths - StatusWaiterMatch // match on status code - ErrorWaiterMatch // match on error -) - -// String returns the string representation of the waiter match mode. -func (m WaiterMatchMode) String() string { - switch m { - case PathAllWaiterMatch: - return "pathAll" - case PathWaiterMatch: - return "path" - case PathAnyWaiterMatch: - return "pathAny" - case PathListWaiterMatch: - return "pathList" - case StatusWaiterMatch: - return "status" - case ErrorWaiterMatch: - return "error" - default: - return "unknown waiter match mode" - } -} - -// WaitWithContext will make requests for the API operation using NewRequest to -// build API requests. The request's response will be compared against the -// Waiter's Acceptors to determine the successful state of the resource the -// waiter is inspecting. -// -// The passed in context must not be nil. If it is nil a panic will occur. The -// Context will be used to cancel the waiter's pending requests and retry delays. -// Use aws.BackgroundContext if no context is available. -// -// The waiter will continue until the target state defined by the Acceptors, -// or the max attempts expires. -// -// Will return the WaiterResourceNotReadyErrorCode error code if the waiter's -// retryer ShouldRetry returns false. This normally will happen when the max -// wait attempts expires. -func (w Waiter) WaitWithContext(ctx aws.Context) error { - - for attempt := 1; ; attempt++ { - req, err := w.NewRequest(w.RequestOptions) - if err != nil { - waiterLogf(w.Logger, "unable to create request %v", err) - return err - } - req.Handlers.Build.PushBack(MakeAddToUserAgentFreeFormHandler("Waiter")) - err = req.Send() - - // See if any of the acceptors match the request's response, or error - for _, a := range w.Acceptors { - if matched, matchErr := a.match(w.Name, w.Logger, req, err); matched { - return matchErr - } - } - - // The Waiter should only check the resource state MaxAttempts times - // This is here instead of in the for loop above to prevent delaying - // unnecessary when the waiter will not retry. - if attempt == w.MaxAttempts { - break - } - - // Delay to wait before inspecting the resource again - delay := w.Delay(attempt) - if sleepFn := req.Config.SleepDelay; sleepFn != nil { - // Support SleepDelay for backwards compatibility and testing - sleepFn(delay) - } else { - sleepCtxFn := w.SleepWithContext - if sleepCtxFn == nil { - sleepCtxFn = aws.SleepWithContext - } - - if err := sleepCtxFn(ctx, delay); err != nil { - return awserr.New(CanceledErrorCode, "waiter context canceled", err) - } - } - } - - return awserr.New(WaiterResourceNotReadyErrorCode, "exceeded wait attempts", nil) -} - -// A WaiterAcceptor provides the information needed to wait for an API operation -// to complete. -type WaiterAcceptor struct { - State WaiterState - Matcher WaiterMatchMode - Argument string - Expected interface{} -} - -// match returns if the acceptor found a match with the passed in request -// or error. True is returned if the acceptor made a match, error is returned -// if there was an error attempting to perform the match. -func (a *WaiterAcceptor) match(name string, l aws.Logger, req *Request, err error) (bool, error) { - result := false - var vals []interface{} - - switch a.Matcher { - case PathAllWaiterMatch, PathWaiterMatch: - // Require all matches to be equal for result to match - vals, _ = awsutil.ValuesAtPath(req.Data, a.Argument) - if len(vals) == 0 { - break - } - result = true - for _, val := range vals { - if !awsutil.DeepEqual(val, a.Expected) { - result = false - break - } - } - case PathAnyWaiterMatch: - // Only a single match needs to equal for the result to match - vals, _ = awsutil.ValuesAtPath(req.Data, a.Argument) - for _, val := range vals { - if awsutil.DeepEqual(val, a.Expected) { - result = true - break - } - } - case PathListWaiterMatch: - // ignored matcher - case StatusWaiterMatch: - s := a.Expected.(int) - result = s == req.HTTPResponse.StatusCode - case ErrorWaiterMatch: - if aerr, ok := err.(awserr.Error); ok { - result = aerr.Code() == a.Expected.(string) - } - default: - waiterLogf(l, "WARNING: Waiter %s encountered unexpected matcher: %s", - name, a.Matcher) - } - - if !result { - // If there was no matching result found there is nothing more to do - // for this response, retry the request. - return false, nil - } - - switch a.State { - case SuccessWaiterState: - // waiter completed - return true, nil - case FailureWaiterState: - // Waiter failure state triggered - return true, awserr.New(WaiterResourceNotReadyErrorCode, - "failed waiting for successful resource state", err) - case RetryWaiterState: - // clear the error and retry the operation - return false, nil - default: - waiterLogf(l, "WARNING: Waiter %s encountered unexpected state: %s", - name, a.State) - return false, nil - } -} - -func waiterLogf(logger aws.Logger, msg string, args ...interface{}) { - if logger != nil { - logger.Log(fmt.Sprintf(msg, args...)) - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport.go b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport.go deleted file mode 100644 index ea9ebb6f6..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport.go +++ /dev/null @@ -1,26 +0,0 @@ -// +build go1.7 - -package session - -import ( - "net" - "net/http" - "time" -) - -// Transport that should be used when a custom CA bundle is specified with the -// SDK. -func getCABundleTransport() *http.Transport { - return &http.Transport{ - Proxy: http.ProxyFromEnvironment, - DialContext: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - DualStack: true, - }).DialContext, - MaxIdleConns: 100, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_5.go b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_5.go deleted file mode 100644 index fec39dfc1..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_5.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build !go1.6,go1.5 - -package session - -import ( - "net" - "net/http" - "time" -) - -// Transport that should be used when a custom CA bundle is specified with the -// SDK. -func getCABundleTransport() *http.Transport { - return &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - TLSHandshakeTimeout: 10 * time.Second, - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_6.go b/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_6.go deleted file mode 100644 index 1c5a5391e..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/cabundle_transport_1_6.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build !go1.7,go1.6 - -package session - -import ( - "net" - "net/http" - "time" -) - -// Transport that should be used when a custom CA bundle is specified with the -// SDK. -func getCABundleTransport() *http.Transport { - return &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/credentials.go b/vendor/github.com/aws/aws-sdk-go/aws/session/credentials.go deleted file mode 100644 index 7713ccfca..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/credentials.go +++ /dev/null @@ -1,259 +0,0 @@ -package session - -import ( - "fmt" - "os" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/credentials/processcreds" - "github.com/aws/aws-sdk-go/aws/credentials/stscreds" - "github.com/aws/aws-sdk-go/aws/defaults" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/internal/shareddefaults" -) - -func resolveCredentials(cfg *aws.Config, - envCfg envConfig, sharedCfg sharedConfig, - handlers request.Handlers, - sessOpts Options, -) (*credentials.Credentials, error) { - - switch { - case len(sessOpts.Profile) != 0: - // User explicitly provided an Profile in the session's configuration - // so load that profile from shared config first. - // Github(aws/aws-sdk-go#2727) - return resolveCredsFromProfile(cfg, envCfg, sharedCfg, handlers, sessOpts) - - case envCfg.Creds.HasKeys(): - // Environment credentials - return credentials.NewStaticCredentialsFromCreds(envCfg.Creds), nil - - case len(envCfg.WebIdentityTokenFilePath) != 0: - // Web identity token from environment, RoleARN required to also be - // set. - return assumeWebIdentity(cfg, handlers, - envCfg.WebIdentityTokenFilePath, - envCfg.RoleARN, - envCfg.RoleSessionName, - ) - - default: - // Fallback to the "default" credential resolution chain. - return resolveCredsFromProfile(cfg, envCfg, sharedCfg, handlers, sessOpts) - } -} - -// WebIdentityEmptyRoleARNErr will occur if 'AWS_WEB_IDENTITY_TOKEN_FILE' was set but -// 'AWS_IAM_ROLE_ARN' was not set. -var WebIdentityEmptyRoleARNErr = awserr.New(stscreds.ErrCodeWebIdentity, "role ARN is not set", nil) - -// WebIdentityEmptyTokenFilePathErr will occur if 'AWS_IAM_ROLE_ARN' was set but -// 'AWS_WEB_IDENTITY_TOKEN_FILE' was not set. -var WebIdentityEmptyTokenFilePathErr = awserr.New(stscreds.ErrCodeWebIdentity, "token file path is not set", nil) - -func assumeWebIdentity(cfg *aws.Config, handlers request.Handlers, - filepath string, - roleARN, sessionName string, -) (*credentials.Credentials, error) { - - if len(filepath) == 0 { - return nil, WebIdentityEmptyTokenFilePathErr - } - - if len(roleARN) == 0 { - return nil, WebIdentityEmptyRoleARNErr - } - - creds := stscreds.NewWebIdentityCredentials( - &Session{ - Config: cfg, - Handlers: handlers.Copy(), - }, - roleARN, - sessionName, - filepath, - ) - - return creds, nil -} - -func resolveCredsFromProfile(cfg *aws.Config, - envCfg envConfig, sharedCfg sharedConfig, - handlers request.Handlers, - sessOpts Options, -) (creds *credentials.Credentials, err error) { - - switch { - case sharedCfg.SourceProfile != nil: - // Assume IAM role with credentials source from a different profile. - creds, err = resolveCredsFromProfile(cfg, envCfg, - *sharedCfg.SourceProfile, handlers, sessOpts, - ) - - case sharedCfg.Creds.HasKeys(): - // Static Credentials from Shared Config/Credentials file. - creds = credentials.NewStaticCredentialsFromCreds( - sharedCfg.Creds, - ) - - case len(sharedCfg.CredentialProcess) != 0: - // Get credentials from CredentialProcess - creds = processcreds.NewCredentials(sharedCfg.CredentialProcess) - - case len(sharedCfg.CredentialSource) != 0: - creds, err = resolveCredsFromSource(cfg, envCfg, - sharedCfg, handlers, sessOpts, - ) - - case len(sharedCfg.WebIdentityTokenFile) != 0: - // Credentials from Assume Web Identity token require an IAM Role, and - // that roll will be assumed. May be wrapped with another assume role - // via SourceProfile. - return assumeWebIdentity(cfg, handlers, - sharedCfg.WebIdentityTokenFile, - sharedCfg.RoleARN, - sharedCfg.RoleSessionName, - ) - - default: - // Fallback to default credentials provider, include mock errors for - // the credential chain so user can identify why credentials failed to - // be retrieved. - creds = credentials.NewCredentials(&credentials.ChainProvider{ - VerboseErrors: aws.BoolValue(cfg.CredentialsChainVerboseErrors), - Providers: []credentials.Provider{ - &credProviderError{ - Err: awserr.New("EnvAccessKeyNotFound", - "failed to find credentials in the environment.", nil), - }, - &credProviderError{ - Err: awserr.New("SharedCredsLoad", - fmt.Sprintf("failed to load profile, %s.", envCfg.Profile), nil), - }, - defaults.RemoteCredProvider(*cfg, handlers), - }, - }) - } - if err != nil { - return nil, err - } - - if len(sharedCfg.RoleARN) > 0 { - cfgCp := *cfg - cfgCp.Credentials = creds - return credsFromAssumeRole(cfgCp, handlers, sharedCfg, sessOpts) - } - - return creds, nil -} - -// valid credential source values -const ( - credSourceEc2Metadata = "Ec2InstanceMetadata" - credSourceEnvironment = "Environment" - credSourceECSContainer = "EcsContainer" -) - -func resolveCredsFromSource(cfg *aws.Config, - envCfg envConfig, sharedCfg sharedConfig, - handlers request.Handlers, - sessOpts Options, -) (creds *credentials.Credentials, err error) { - - switch sharedCfg.CredentialSource { - case credSourceEc2Metadata: - p := defaults.RemoteCredProvider(*cfg, handlers) - creds = credentials.NewCredentials(p) - - case credSourceEnvironment: - creds = credentials.NewStaticCredentialsFromCreds(envCfg.Creds) - - case credSourceECSContainer: - if len(os.Getenv(shareddefaults.ECSCredsProviderEnvVar)) == 0 { - return nil, ErrSharedConfigECSContainerEnvVarEmpty - } - - p := defaults.RemoteCredProvider(*cfg, handlers) - creds = credentials.NewCredentials(p) - - default: - return nil, ErrSharedConfigInvalidCredSource - } - - return creds, nil -} - -func credsFromAssumeRole(cfg aws.Config, - handlers request.Handlers, - sharedCfg sharedConfig, - sessOpts Options, -) (*credentials.Credentials, error) { - - if len(sharedCfg.MFASerial) != 0 && sessOpts.AssumeRoleTokenProvider == nil { - // AssumeRole Token provider is required if doing Assume Role - // with MFA. - return nil, AssumeRoleTokenProviderNotSetError{} - } - - return stscreds.NewCredentials( - &Session{ - Config: &cfg, - Handlers: handlers.Copy(), - }, - sharedCfg.RoleARN, - func(opt *stscreds.AssumeRoleProvider) { - opt.RoleSessionName = sharedCfg.RoleSessionName - opt.Duration = sessOpts.AssumeRoleDuration - - // Assume role with external ID - if len(sharedCfg.ExternalID) > 0 { - opt.ExternalID = aws.String(sharedCfg.ExternalID) - } - - // Assume role with MFA - if len(sharedCfg.MFASerial) > 0 { - opt.SerialNumber = aws.String(sharedCfg.MFASerial) - opt.TokenProvider = sessOpts.AssumeRoleTokenProvider - } - }, - ), nil -} - -// AssumeRoleTokenProviderNotSetError is an error returned when creating a -// session when the MFAToken option is not set when shared config is configured -// load assume a role with an MFA token. -type AssumeRoleTokenProviderNotSetError struct{} - -// Code is the short id of the error. -func (e AssumeRoleTokenProviderNotSetError) Code() string { - return "AssumeRoleTokenProviderNotSetError" -} - -// Message is the description of the error -func (e AssumeRoleTokenProviderNotSetError) Message() string { - return fmt.Sprintf("assume role with MFA enabled, but AssumeRoleTokenProvider session option not set.") -} - -// OrigErr is the underlying error that caused the failure. -func (e AssumeRoleTokenProviderNotSetError) OrigErr() error { - return nil -} - -// Error satisfies the error interface. -func (e AssumeRoleTokenProviderNotSetError) Error() string { - return awserr.SprintError(e.Code(), e.Message(), "", nil) -} - -type credProviderError struct { - Err error -} - -func (c credProviderError) Retrieve() (credentials.Value, error) { - return credentials.Value{}, c.Err -} -func (c credProviderError) IsExpired() bool { - return true -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/doc.go b/vendor/github.com/aws/aws-sdk-go/aws/session/doc.go deleted file mode 100644 index 7ec66e7e5..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/doc.go +++ /dev/null @@ -1,245 +0,0 @@ -/* -Package session provides configuration for the SDK's service clients. Sessions -can be shared across service clients that share the same base configuration. - -Sessions are safe to use concurrently as long as the Session is not being -modified. Sessions should be cached when possible, because creating a new -Session will load all configuration values from the environment, and config -files each time the Session is created. Sharing the Session value across all of -your service clients will ensure the configuration is loaded the fewest number -of times possible. - -Sessions options from Shared Config - -By default NewSession will only load credentials from the shared credentials -file (~/.aws/credentials). If the AWS_SDK_LOAD_CONFIG environment variable is -set to a truthy value the Session will be created from the configuration -values from the shared config (~/.aws/config) and shared credentials -(~/.aws/credentials) files. Using the NewSessionWithOptions with -SharedConfigState set to SharedConfigEnable will create the session as if the -AWS_SDK_LOAD_CONFIG environment variable was set. - -Credential and config loading order - -The Session will attempt to load configuration and credentials from the -environment, configuration files, and other credential sources. The order -configuration is loaded in is: - - * Environment Variables - * Shared Credentials file - * Shared Configuration file (if SharedConfig is enabled) - * EC2 Instance Metadata (credentials only) - -The Environment variables for credentials will have precedence over shared -config even if SharedConfig is enabled. To override this behavior, and use -shared config credentials instead specify the session.Options.Profile, (e.g. -when using credential_source=Environment to assume a role). - - sess, err := session.NewSessionWithOptions(session.Options{ - Profile: "myProfile", - }) - -Creating Sessions - -Creating a Session without additional options will load credentials region, and -profile loaded from the environment and shared config automatically. See, -"Environment Variables" section for information on environment variables used -by Session. - - // Create Session - sess, err := session.NewSession() - - -When creating Sessions optional aws.Config values can be passed in that will -override the default, or loaded, config values the Session is being created -with. This allows you to provide additional, or case based, configuration -as needed. - - // Create a Session with a custom region - sess, err := session.NewSession(&aws.Config{ - Region: aws.String("us-west-2"), - }) - -Use NewSessionWithOptions to provide additional configuration driving how the -Session's configuration will be loaded. Such as, specifying shared config -profile, or override the shared config state, (AWS_SDK_LOAD_CONFIG). - - // Equivalent to session.NewSession() - sess, err := session.NewSessionWithOptions(session.Options{ - // Options - }) - - sess, err := session.NewSessionWithOptions(session.Options{ - // Specify profile to load for the session's config - Profile: "profile_name", - - // Provide SDK Config options, such as Region. - Config: aws.Config{ - Region: aws.String("us-west-2"), - }, - - // Force enable Shared Config support - SharedConfigState: session.SharedConfigEnable, - }) - -Adding Handlers - -You can add handlers to a session to decorate API operation, (e.g. adding HTTP -headers). All clients that use the Session receive a copy of the Session's -handlers. For example, the following request handler added to the Session logs -every requests made. - - // Create a session, and add additional handlers for all service - // clients created with the Session to inherit. Adds logging handler. - sess := session.Must(session.NewSession()) - - sess.Handlers.Send.PushFront(func(r *request.Request) { - // Log every request made and its payload - logger.Printf("Request: %s/%s, Params: %s", - r.ClientInfo.ServiceName, r.Operation, r.Params) - }) - -Shared Config Fields - -By default the SDK will only load the shared credentials file's -(~/.aws/credentials) credentials values, and all other config is provided by -the environment variables, SDK defaults, and user provided aws.Config values. - -If the AWS_SDK_LOAD_CONFIG environment variable is set, or SharedConfigEnable -option is used to create the Session the full shared config values will be -loaded. This includes credentials, region, and support for assume role. In -addition the Session will load its configuration from both the shared config -file (~/.aws/config) and shared credentials file (~/.aws/credentials). Both -files have the same format. - -If both config files are present the configuration from both files will be -read. The Session will be created from configuration values from the shared -credentials file (~/.aws/credentials) over those in the shared config file -(~/.aws/config). - -Credentials are the values the SDK uses to authenticating requests with AWS -Services. When specified in a file, both aws_access_key_id and -aws_secret_access_key must be provided together in the same file to be -considered valid. They will be ignored if both are not present. -aws_session_token is an optional field that can be provided in addition to the -other two fields. - - aws_access_key_id = AKID - aws_secret_access_key = SECRET - aws_session_token = TOKEN - - ; region only supported if SharedConfigEnabled. - region = us-east-1 - -Assume Role configuration - -The role_arn field allows you to configure the SDK to assume an IAM role using -a set of credentials from another source. Such as when paired with static -credentials, "profile_source", "credential_process", or "credential_source" -fields. If "role_arn" is provided, a source of credentials must also be -specified, such as "source_profile", "credential_source", or -"credential_process". - - role_arn = arn:aws:iam:::role/ - source_profile = profile_with_creds - external_id = 1234 - mfa_serial = - role_session_name = session_name - - -The SDK supports assuming a role with MFA token. If "mfa_serial" is set, you -must also set the Session Option.AssumeRoleTokenProvider. The Session will fail -to load if the AssumeRoleTokenProvider is not specified. - - sess := session.Must(session.NewSessionWithOptions(session.Options{ - AssumeRoleTokenProvider: stscreds.StdinTokenProvider, - })) - -To setup Assume Role outside of a session see the stscreds.AssumeRoleProvider -documentation. - -Environment Variables - -When a Session is created several environment variables can be set to adjust -how the SDK functions, and what configuration data it loads when creating -Sessions. All environment values are optional, but some values like credentials -require multiple of the values to set or the partial values will be ignored. -All environment variable values are strings unless otherwise noted. - -Environment configuration values. If set both Access Key ID and Secret Access -Key must be provided. Session Token and optionally also be provided, but is -not required. - - # Access Key ID - AWS_ACCESS_KEY_ID=AKID - AWS_ACCESS_KEY=AKID # only read if AWS_ACCESS_KEY_ID is not set. - - # Secret Access Key - AWS_SECRET_ACCESS_KEY=SECRET - AWS_SECRET_KEY=SECRET=SECRET # only read if AWS_SECRET_ACCESS_KEY is not set. - - # Session Token - AWS_SESSION_TOKEN=TOKEN - -Region value will instruct the SDK where to make service API requests to. If is -not provided in the environment the region must be provided before a service -client request is made. - - AWS_REGION=us-east-1 - - # AWS_DEFAULT_REGION is only read if AWS_SDK_LOAD_CONFIG is also set, - # and AWS_REGION is not also set. - AWS_DEFAULT_REGION=us-east-1 - -Profile name the SDK should load use when loading shared config from the -configuration files. If not provided "default" will be used as the profile name. - - AWS_PROFILE=my_profile - - # AWS_DEFAULT_PROFILE is only read if AWS_SDK_LOAD_CONFIG is also set, - # and AWS_PROFILE is not also set. - AWS_DEFAULT_PROFILE=my_profile - -SDK load config instructs the SDK to load the shared config in addition to -shared credentials. This also expands the configuration loaded so the shared -credentials will have parity with the shared config file. This also enables -Region and Profile support for the AWS_DEFAULT_REGION and AWS_DEFAULT_PROFILE -env values as well. - - AWS_SDK_LOAD_CONFIG=1 - -Shared credentials file path can be set to instruct the SDK to use an alternative -file for the shared credentials. If not set the file will be loaded from -$HOME/.aws/credentials on Linux/Unix based systems, and -%USERPROFILE%\.aws\credentials on Windows. - - AWS_SHARED_CREDENTIALS_FILE=$HOME/my_shared_credentials - -Shared config file path can be set to instruct the SDK to use an alternative -file for the shared config. If not set the file will be loaded from -$HOME/.aws/config on Linux/Unix based systems, and -%USERPROFILE%\.aws\config on Windows. - - AWS_CONFIG_FILE=$HOME/my_shared_config - -Path to a custom Credentials Authority (CA) bundle PEM file that the SDK -will use instead of the default system's root CA bundle. Use this only -if you want to replace the CA bundle the SDK uses for TLS requests. - - AWS_CA_BUNDLE=$HOME/my_custom_ca_bundle - -Enabling this option will attempt to merge the Transport into the SDK's HTTP -client. If the client's Transport is not a http.Transport an error will be -returned. If the Transport's TLS config is set this option will cause the SDK -to overwrite the Transport's TLS config's RootCAs value. If the CA bundle file -contains multiple certificates all of them will be loaded. - -The Session option CustomCABundle is also available when creating sessions -to also enable this feature. CustomCABundle session option field has priority -over the AWS_CA_BUNDLE environment variable, and will be used if both are set. - -Setting a custom HTTPClient in the aws.Config options will override this setting. -To use this option and custom HTTP client, the HTTP client needs to be provided -when creating the session. Not the service client. -*/ -package session diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go b/vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go deleted file mode 100644 index 60a6f9ce2..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go +++ /dev/null @@ -1,277 +0,0 @@ -package session - -import ( - "os" - "strconv" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/defaults" -) - -// EnvProviderName provides a name of the provider when config is loaded from environment. -const EnvProviderName = "EnvConfigCredentials" - -// envConfig is a collection of environment values the SDK will read -// setup config from. All environment values are optional. But some values -// such as credentials require multiple values to be complete or the values -// will be ignored. -type envConfig struct { - // Environment configuration values. If set both Access Key ID and Secret Access - // Key must be provided. Session Token and optionally also be provided, but is - // not required. - // - // # Access Key ID - // AWS_ACCESS_KEY_ID=AKID - // AWS_ACCESS_KEY=AKID # only read if AWS_ACCESS_KEY_ID is not set. - // - // # Secret Access Key - // AWS_SECRET_ACCESS_KEY=SECRET - // AWS_SECRET_KEY=SECRET=SECRET # only read if AWS_SECRET_ACCESS_KEY is not set. - // - // # Session Token - // AWS_SESSION_TOKEN=TOKEN - Creds credentials.Value - - // Region value will instruct the SDK where to make service API requests to. If is - // not provided in the environment the region must be provided before a service - // client request is made. - // - // AWS_REGION=us-east-1 - // - // # AWS_DEFAULT_REGION is only read if AWS_SDK_LOAD_CONFIG is also set, - // # and AWS_REGION is not also set. - // AWS_DEFAULT_REGION=us-east-1 - Region string - - // Profile name the SDK should load use when loading shared configuration from the - // shared configuration files. If not provided "default" will be used as the - // profile name. - // - // AWS_PROFILE=my_profile - // - // # AWS_DEFAULT_PROFILE is only read if AWS_SDK_LOAD_CONFIG is also set, - // # and AWS_PROFILE is not also set. - // AWS_DEFAULT_PROFILE=my_profile - Profile string - - // SDK load config instructs the SDK to load the shared config in addition to - // shared credentials. This also expands the configuration loaded from the shared - // credentials to have parity with the shared config file. This also enables - // Region and Profile support for the AWS_DEFAULT_REGION and AWS_DEFAULT_PROFILE - // env values as well. - // - // AWS_SDK_LOAD_CONFIG=1 - EnableSharedConfig bool - - // Shared credentials file path can be set to instruct the SDK to use an alternate - // file for the shared credentials. If not set the file will be loaded from - // $HOME/.aws/credentials on Linux/Unix based systems, and - // %USERPROFILE%\.aws\credentials on Windows. - // - // AWS_SHARED_CREDENTIALS_FILE=$HOME/my_shared_credentials - SharedCredentialsFile string - - // Shared config file path can be set to instruct the SDK to use an alternate - // file for the shared config. If not set the file will be loaded from - // $HOME/.aws/config on Linux/Unix based systems, and - // %USERPROFILE%\.aws\config on Windows. - // - // AWS_CONFIG_FILE=$HOME/my_shared_config - SharedConfigFile string - - // Sets the path to a custom Credentials Authority (CA) Bundle PEM file - // that the SDK will use instead of the system's root CA bundle. - // Only use this if you want to configure the SDK to use a custom set - // of CAs. - // - // Enabling this option will attempt to merge the Transport - // into the SDK's HTTP client. If the client's Transport is - // not a http.Transport an error will be returned. If the - // Transport's TLS config is set this option will cause the - // SDK to overwrite the Transport's TLS config's RootCAs value. - // - // Setting a custom HTTPClient in the aws.Config options will override this setting. - // To use this option and custom HTTP client, the HTTP client needs to be provided - // when creating the session. Not the service client. - // - // AWS_CA_BUNDLE=$HOME/my_custom_ca_bundle - CustomCABundle string - - csmEnabled string - CSMEnabled *bool - CSMPort string - CSMHost string - CSMClientID string - - // Enables endpoint discovery via environment variables. - // - // AWS_ENABLE_ENDPOINT_DISCOVERY=true - EnableEndpointDiscovery *bool - enableEndpointDiscovery string - - // Specifies the WebIdentity token the SDK should use to assume a role - // with. - // - // AWS_WEB_IDENTITY_TOKEN_FILE=file_path - WebIdentityTokenFilePath string - - // Specifies the IAM role arn to use when assuming an role. - // - // AWS_ROLE_ARN=role_arn - RoleARN string - - // Specifies the IAM role session name to use when assuming a role. - // - // AWS_ROLE_SESSION_NAME=session_name - RoleSessionName string -} - -var ( - csmEnabledEnvKey = []string{ - "AWS_CSM_ENABLED", - } - csmHostEnvKey = []string{ - "AWS_CSM_HOST", - } - csmPortEnvKey = []string{ - "AWS_CSM_PORT", - } - csmClientIDEnvKey = []string{ - "AWS_CSM_CLIENT_ID", - } - credAccessEnvKey = []string{ - "AWS_ACCESS_KEY_ID", - "AWS_ACCESS_KEY", - } - credSecretEnvKey = []string{ - "AWS_SECRET_ACCESS_KEY", - "AWS_SECRET_KEY", - } - credSessionEnvKey = []string{ - "AWS_SESSION_TOKEN", - } - - enableEndpointDiscoveryEnvKey = []string{ - "AWS_ENABLE_ENDPOINT_DISCOVERY", - } - - regionEnvKeys = []string{ - "AWS_REGION", - "AWS_DEFAULT_REGION", // Only read if AWS_SDK_LOAD_CONFIG is also set - } - profileEnvKeys = []string{ - "AWS_PROFILE", - "AWS_DEFAULT_PROFILE", // Only read if AWS_SDK_LOAD_CONFIG is also set - } - sharedCredsFileEnvKey = []string{ - "AWS_SHARED_CREDENTIALS_FILE", - } - sharedConfigFileEnvKey = []string{ - "AWS_CONFIG_FILE", - } - webIdentityTokenFilePathEnvKey = []string{ - "AWS_WEB_IDENTITY_TOKEN_FILE", - } - roleARNEnvKey = []string{ - "AWS_ROLE_ARN", - } - roleSessionNameEnvKey = []string{ - "AWS_ROLE_SESSION_NAME", - } -) - -// loadEnvConfig retrieves the SDK's environment configuration. -// See `envConfig` for the values that will be retrieved. -// -// If the environment variable `AWS_SDK_LOAD_CONFIG` is set to a truthy value -// the shared SDK config will be loaded in addition to the SDK's specific -// configuration values. -func loadEnvConfig() envConfig { - enableSharedConfig, _ := strconv.ParseBool(os.Getenv("AWS_SDK_LOAD_CONFIG")) - return envConfigLoad(enableSharedConfig) -} - -// loadEnvSharedConfig retrieves the SDK's environment configuration, and the -// SDK shared config. See `envConfig` for the values that will be retrieved. -// -// Loads the shared configuration in addition to the SDK's specific configuration. -// This will load the same values as `loadEnvConfig` if the `AWS_SDK_LOAD_CONFIG` -// environment variable is set. -func loadSharedEnvConfig() envConfig { - return envConfigLoad(true) -} - -func envConfigLoad(enableSharedConfig bool) envConfig { - cfg := envConfig{} - - cfg.EnableSharedConfig = enableSharedConfig - - // Static environment credentials - var creds credentials.Value - setFromEnvVal(&creds.AccessKeyID, credAccessEnvKey) - setFromEnvVal(&creds.SecretAccessKey, credSecretEnvKey) - setFromEnvVal(&creds.SessionToken, credSessionEnvKey) - if creds.HasKeys() { - // Require logical grouping of credentials - creds.ProviderName = EnvProviderName - cfg.Creds = creds - } - - // Role Metadata - setFromEnvVal(&cfg.RoleARN, roleARNEnvKey) - setFromEnvVal(&cfg.RoleSessionName, roleSessionNameEnvKey) - - // Web identity environment variables - setFromEnvVal(&cfg.WebIdentityTokenFilePath, webIdentityTokenFilePathEnvKey) - - // CSM environment variables - setFromEnvVal(&cfg.csmEnabled, csmEnabledEnvKey) - setFromEnvVal(&cfg.CSMHost, csmHostEnvKey) - setFromEnvVal(&cfg.CSMPort, csmPortEnvKey) - setFromEnvVal(&cfg.CSMClientID, csmClientIDEnvKey) - - if len(cfg.csmEnabled) != 0 { - v, _ := strconv.ParseBool(cfg.csmEnabled) - cfg.CSMEnabled = &v - } - - regionKeys := regionEnvKeys - profileKeys := profileEnvKeys - if !cfg.EnableSharedConfig { - regionKeys = regionKeys[:1] - profileKeys = profileKeys[:1] - } - - setFromEnvVal(&cfg.Region, regionKeys) - setFromEnvVal(&cfg.Profile, profileKeys) - - // endpoint discovery is in reference to it being enabled. - setFromEnvVal(&cfg.enableEndpointDiscovery, enableEndpointDiscoveryEnvKey) - if len(cfg.enableEndpointDiscovery) > 0 { - cfg.EnableEndpointDiscovery = aws.Bool(cfg.enableEndpointDiscovery != "false") - } - - setFromEnvVal(&cfg.SharedCredentialsFile, sharedCredsFileEnvKey) - setFromEnvVal(&cfg.SharedConfigFile, sharedConfigFileEnvKey) - - if len(cfg.SharedCredentialsFile) == 0 { - cfg.SharedCredentialsFile = defaults.SharedCredentialsFilename() - } - if len(cfg.SharedConfigFile) == 0 { - cfg.SharedConfigFile = defaults.SharedConfigFilename() - } - - cfg.CustomCABundle = os.Getenv("AWS_CA_BUNDLE") - - return cfg -} - -func setFromEnvVal(dst *string, keys []string) { - for _, k := range keys { - if v := os.Getenv(k); len(v) > 0 { - *dst = v - break - } - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/session.go b/vendor/github.com/aws/aws-sdk-go/aws/session/session.go deleted file mode 100644 index fa1362ff7..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/session.go +++ /dev/null @@ -1,660 +0,0 @@ -package session - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/client" - "github.com/aws/aws-sdk-go/aws/corehandlers" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/csm" - "github.com/aws/aws-sdk-go/aws/defaults" - "github.com/aws/aws-sdk-go/aws/endpoints" - "github.com/aws/aws-sdk-go/aws/request" -) - -const ( - // ErrCodeSharedConfig represents an error that occurs in the shared - // configuration logic - ErrCodeSharedConfig = "SharedConfigErr" -) - -// ErrSharedConfigSourceCollision will be returned if a section contains both -// source_profile and credential_source -var ErrSharedConfigSourceCollision = awserr.New(ErrCodeSharedConfig, "only source profile or credential source can be specified, not both", nil) - -// ErrSharedConfigECSContainerEnvVarEmpty will be returned if the environment -// variables are empty and Environment was set as the credential source -var ErrSharedConfigECSContainerEnvVarEmpty = awserr.New(ErrCodeSharedConfig, "EcsContainer was specified as the credential_source, but 'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' was not set", nil) - -// ErrSharedConfigInvalidCredSource will be returned if an invalid credential source was provided -var ErrSharedConfigInvalidCredSource = awserr.New(ErrCodeSharedConfig, "credential source values must be EcsContainer, Ec2InstanceMetadata, or Environment", nil) - -// A Session provides a central location to create service clients from and -// store configurations and request handlers for those services. -// -// Sessions are safe to create service clients concurrently, but it is not safe -// to mutate the Session concurrently. -// -// The Session satisfies the service client's client.ConfigProvider. -type Session struct { - Config *aws.Config - Handlers request.Handlers -} - -// New creates a new instance of the handlers merging in the provided configs -// on top of the SDK's default configurations. Once the Session is created it -// can be mutated to modify the Config or Handlers. The Session is safe to be -// read concurrently, but it should not be written to concurrently. -// -// If the AWS_SDK_LOAD_CONFIG environment is set to a truthy value, the New -// method could now encounter an error when loading the configuration. When -// The environment variable is set, and an error occurs, New will return a -// session that will fail all requests reporting the error that occurred while -// loading the session. Use NewSession to get the error when creating the -// session. -// -// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value -// the shared config file (~/.aws/config) will also be loaded, in addition to -// the shared credentials file (~/.aws/credentials). Values set in both the -// shared config, and shared credentials will be taken from the shared -// credentials file. -// -// Deprecated: Use NewSession functions to create sessions instead. NewSession -// has the same functionality as New except an error can be returned when the -// func is called instead of waiting to receive an error until a request is made. -func New(cfgs ...*aws.Config) *Session { - // load initial config from environment - envCfg := loadEnvConfig() - - if envCfg.EnableSharedConfig { - var cfg aws.Config - cfg.MergeIn(cfgs...) - s, err := NewSessionWithOptions(Options{ - Config: cfg, - SharedConfigState: SharedConfigEnable, - }) - if err != nil { - // Old session.New expected all errors to be discovered when - // a request is made, and would report the errors then. This - // needs to be replicated if an error occurs while creating - // the session. - msg := "failed to create session with AWS_SDK_LOAD_CONFIG enabled. " + - "Use session.NewSession to handle errors occurring during session creation." - - // Session creation failed, need to report the error and prevent - // any requests from succeeding. - s = &Session{Config: defaults.Config()} - s.Config.MergeIn(cfgs...) - s.Config.Logger.Log("ERROR:", msg, "Error:", err) - s.Handlers.Validate.PushBack(func(r *request.Request) { - r.Error = err - }) - } - - return s - } - - s := deprecatedNewSession(cfgs...) - - if csmCfg, err := loadCSMConfig(envCfg, []string{}); err != nil { - if l := s.Config.Logger; l != nil { - l.Log(fmt.Sprintf("ERROR: failed to load CSM configuration, %v", err)) - } - } else if csmCfg.Enabled { - err := enableCSM(&s.Handlers, csmCfg, s.Config.Logger) - if err != nil { - err = fmt.Errorf("failed to enable CSM, %v", err) - s.Config.Logger.Log("ERROR:", err.Error()) - s.Handlers.Validate.PushBack(func(r *request.Request) { - r.Error = err - }) - } - } - - return s -} - -// NewSession returns a new Session created from SDK defaults, config files, -// environment, and user provided config files. Once the Session is created -// it can be mutated to modify the Config or Handlers. The Session is safe to -// be read concurrently, but it should not be written to concurrently. -// -// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value -// the shared config file (~/.aws/config) will also be loaded in addition to -// the shared credentials file (~/.aws/credentials). Values set in both the -// shared config, and shared credentials will be taken from the shared -// credentials file. Enabling the Shared Config will also allow the Session -// to be built with retrieving credentials with AssumeRole set in the config. -// -// See the NewSessionWithOptions func for information on how to override or -// control through code how the Session will be created. Such as specifying the -// config profile, and controlling if shared config is enabled or not. -func NewSession(cfgs ...*aws.Config) (*Session, error) { - opts := Options{} - opts.Config.MergeIn(cfgs...) - - return NewSessionWithOptions(opts) -} - -// SharedConfigState provides the ability to optionally override the state -// of the session's creation based on the shared config being enabled or -// disabled. -type SharedConfigState int - -const ( - // SharedConfigStateFromEnv does not override any state of the - // AWS_SDK_LOAD_CONFIG env var. It is the default value of the - // SharedConfigState type. - SharedConfigStateFromEnv SharedConfigState = iota - - // SharedConfigDisable overrides the AWS_SDK_LOAD_CONFIG env var value - // and disables the shared config functionality. - SharedConfigDisable - - // SharedConfigEnable overrides the AWS_SDK_LOAD_CONFIG env var value - // and enables the shared config functionality. - SharedConfigEnable -) - -// Options provides the means to control how a Session is created and what -// configuration values will be loaded. -// -type Options struct { - // Provides config values for the SDK to use when creating service clients - // and making API requests to services. Any value set in with this field - // will override the associated value provided by the SDK defaults, - // environment or config files where relevant. - // - // If not set, configuration values from from SDK defaults, environment, - // config will be used. - Config aws.Config - - // Overrides the config profile the Session should be created from. If not - // set the value of the environment variable will be loaded (AWS_PROFILE, - // or AWS_DEFAULT_PROFILE if the Shared Config is enabled). - // - // If not set and environment variables are not set the "default" - // (DefaultSharedConfigProfile) will be used as the profile to load the - // session config from. - Profile string - - // Instructs how the Session will be created based on the AWS_SDK_LOAD_CONFIG - // environment variable. By default a Session will be created using the - // value provided by the AWS_SDK_LOAD_CONFIG environment variable. - // - // Setting this value to SharedConfigEnable or SharedConfigDisable - // will allow you to override the AWS_SDK_LOAD_CONFIG environment variable - // and enable or disable the shared config functionality. - SharedConfigState SharedConfigState - - // Ordered list of files the session will load configuration from. - // It will override environment variable AWS_SHARED_CREDENTIALS_FILE, AWS_CONFIG_FILE. - SharedConfigFiles []string - - // When the SDK's shared config is configured to assume a role with MFA - // this option is required in order to provide the mechanism that will - // retrieve the MFA token. There is no default value for this field. If - // it is not set an error will be returned when creating the session. - // - // This token provider will be called when ever the assumed role's - // credentials need to be refreshed. Within the context of service clients - // all sharing the same session the SDK will ensure calls to the token - // provider are atomic. When sharing a token provider across multiple - // sessions additional synchronization logic is needed to ensure the - // token providers do not introduce race conditions. It is recommend to - // share the session where possible. - // - // stscreds.StdinTokenProvider is a basic implementation that will prompt - // from stdin for the MFA token code. - // - // This field is only used if the shared configuration is enabled, and - // the config enables assume role wit MFA via the mfa_serial field. - AssumeRoleTokenProvider func() (string, error) - - // When the SDK's shared config is configured to assume a role this option - // may be provided to set the expiry duration of the STS credentials. - // Defaults to 15 minutes if not set as documented in the - // stscreds.AssumeRoleProvider. - AssumeRoleDuration time.Duration - - // Reader for a custom Credentials Authority (CA) bundle in PEM format that - // the SDK will use instead of the default system's root CA bundle. Use this - // only if you want to replace the CA bundle the SDK uses for TLS requests. - // - // Enabling this option will attempt to merge the Transport into the SDK's HTTP - // client. If the client's Transport is not a http.Transport an error will be - // returned. If the Transport's TLS config is set this option will cause the SDK - // to overwrite the Transport's TLS config's RootCAs value. If the CA - // bundle reader contains multiple certificates all of them will be loaded. - // - // The Session option CustomCABundle is also available when creating sessions - // to also enable this feature. CustomCABundle session option field has priority - // over the AWS_CA_BUNDLE environment variable, and will be used if both are set. - CustomCABundle io.Reader - - // The handlers that the session and all API clients will be created with. - // This must be a complete set of handlers. Use the defaults.Handlers() - // function to initialize this value before changing the handlers to be - // used by the SDK. - Handlers request.Handlers -} - -// NewSessionWithOptions returns a new Session created from SDK defaults, config files, -// environment, and user provided config files. This func uses the Options -// values to configure how the Session is created. -// -// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value -// the shared config file (~/.aws/config) will also be loaded in addition to -// the shared credentials file (~/.aws/credentials). Values set in both the -// shared config, and shared credentials will be taken from the shared -// credentials file. Enabling the Shared Config will also allow the Session -// to be built with retrieving credentials with AssumeRole set in the config. -// -// // Equivalent to session.New -// sess := session.Must(session.NewSessionWithOptions(session.Options{})) -// -// // Specify profile to load for the session's config -// sess := session.Must(session.NewSessionWithOptions(session.Options{ -// Profile: "profile_name", -// })) -// -// // Specify profile for config and region for requests -// sess := session.Must(session.NewSessionWithOptions(session.Options{ -// Config: aws.Config{Region: aws.String("us-east-1")}, -// Profile: "profile_name", -// })) -// -// // Force enable Shared Config support -// sess := session.Must(session.NewSessionWithOptions(session.Options{ -// SharedConfigState: session.SharedConfigEnable, -// })) -func NewSessionWithOptions(opts Options) (*Session, error) { - var envCfg envConfig - if opts.SharedConfigState == SharedConfigEnable { - envCfg = loadSharedEnvConfig() - } else { - envCfg = loadEnvConfig() - } - - if len(opts.Profile) != 0 { - envCfg.Profile = opts.Profile - } - - switch opts.SharedConfigState { - case SharedConfigDisable: - envCfg.EnableSharedConfig = false - case SharedConfigEnable: - envCfg.EnableSharedConfig = true - } - - // Only use AWS_CA_BUNDLE if session option is not provided. - if len(envCfg.CustomCABundle) != 0 && opts.CustomCABundle == nil { - f, err := os.Open(envCfg.CustomCABundle) - if err != nil { - return nil, awserr.New("LoadCustomCABundleError", - "failed to open custom CA bundle PEM file", err) - } - defer f.Close() - opts.CustomCABundle = f - } - - return newSession(opts, envCfg, &opts.Config) -} - -// Must is a helper function to ensure the Session is valid and there was no -// error when calling a NewSession function. -// -// This helper is intended to be used in variable initialization to load the -// Session and configuration at startup. Such as: -// -// var sess = session.Must(session.NewSession()) -func Must(sess *Session, err error) *Session { - if err != nil { - panic(err) - } - - return sess -} - -func deprecatedNewSession(cfgs ...*aws.Config) *Session { - cfg := defaults.Config() - handlers := defaults.Handlers() - - // Apply the passed in configs so the configuration can be applied to the - // default credential chain - cfg.MergeIn(cfgs...) - if cfg.EndpointResolver == nil { - // An endpoint resolver is required for a session to be able to provide - // endpoints for service client configurations. - cfg.EndpointResolver = endpoints.DefaultResolver() - } - cfg.Credentials = defaults.CredChain(cfg, handlers) - - // Reapply any passed in configs to override credentials if set - cfg.MergeIn(cfgs...) - - s := &Session{ - Config: cfg, - Handlers: handlers, - } - - initHandlers(s) - return s -} - -func enableCSM(handlers *request.Handlers, cfg csmConfig, logger aws.Logger) error { - if logger != nil { - logger.Log("Enabling CSM") - } - - r, err := csm.Start(cfg.ClientID, csm.AddressWithDefaults(cfg.Host, cfg.Port)) - if err != nil { - return err - } - r.InjectHandlers(handlers) - - return nil -} - -func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session, error) { - cfg := defaults.Config() - - handlers := opts.Handlers - if handlers.IsEmpty() { - handlers = defaults.Handlers() - } - - // Get a merged version of the user provided config to determine if - // credentials were. - userCfg := &aws.Config{} - userCfg.MergeIn(cfgs...) - cfg.MergeIn(userCfg) - - // Ordered config files will be loaded in with later files overwriting - // previous config file values. - var cfgFiles []string - if opts.SharedConfigFiles != nil { - cfgFiles = opts.SharedConfigFiles - } else { - cfgFiles = []string{envCfg.SharedConfigFile, envCfg.SharedCredentialsFile} - if !envCfg.EnableSharedConfig { - // The shared config file (~/.aws/config) is only loaded if instructed - // to load via the envConfig.EnableSharedConfig (AWS_SDK_LOAD_CONFIG). - cfgFiles = cfgFiles[1:] - } - } - - // Load additional config from file(s) - sharedCfg, err := loadSharedConfig(envCfg.Profile, cfgFiles, envCfg.EnableSharedConfig) - if err != nil { - if len(envCfg.Profile) == 0 && !envCfg.EnableSharedConfig && (envCfg.Creds.HasKeys() || userCfg.Credentials != nil) { - // Special case where the user has not explicitly specified an AWS_PROFILE, - // or session.Options.profile, shared config is not enabled, and the - // environment has credentials, allow the shared config file to fail to - // load since the user has already provided credentials, and nothing else - // is required to be read file. Github(aws/aws-sdk-go#2455) - } else if _, ok := err.(SharedConfigProfileNotExistsError); !ok { - return nil, err - } - } - - if err := mergeConfigSrcs(cfg, userCfg, envCfg, sharedCfg, handlers, opts); err != nil { - return nil, err - } - - s := &Session{ - Config: cfg, - Handlers: handlers, - } - - initHandlers(s) - - if csmCfg, err := loadCSMConfig(envCfg, cfgFiles); err != nil { - if l := s.Config.Logger; l != nil { - l.Log(fmt.Sprintf("ERROR: failed to load CSM configuration, %v", err)) - } - } else if csmCfg.Enabled { - err = enableCSM(&s.Handlers, csmCfg, s.Config.Logger) - if err != nil { - return nil, err - } - } - - // Setup HTTP client with custom cert bundle if enabled - if opts.CustomCABundle != nil { - if err := loadCustomCABundle(s, opts.CustomCABundle); err != nil { - return nil, err - } - } - - return s, nil -} - -type csmConfig struct { - Enabled bool - Host string - Port string - ClientID string -} - -var csmProfileName = "aws_csm" - -func loadCSMConfig(envCfg envConfig, cfgFiles []string) (csmConfig, error) { - if envCfg.CSMEnabled != nil { - if *envCfg.CSMEnabled { - return csmConfig{ - Enabled: true, - ClientID: envCfg.CSMClientID, - Host: envCfg.CSMHost, - Port: envCfg.CSMPort, - }, nil - } - return csmConfig{}, nil - } - - sharedCfg, err := loadSharedConfig(csmProfileName, cfgFiles, false) - if err != nil { - if _, ok := err.(SharedConfigProfileNotExistsError); !ok { - return csmConfig{}, err - } - } - if sharedCfg.CSMEnabled != nil && *sharedCfg.CSMEnabled == true { - return csmConfig{ - Enabled: true, - ClientID: sharedCfg.CSMClientID, - Host: sharedCfg.CSMHost, - Port: sharedCfg.CSMPort, - }, nil - } - - return csmConfig{}, nil -} - -func loadCustomCABundle(s *Session, bundle io.Reader) error { - var t *http.Transport - switch v := s.Config.HTTPClient.Transport.(type) { - case *http.Transport: - t = v - default: - if s.Config.HTTPClient.Transport != nil { - return awserr.New("LoadCustomCABundleError", - "unable to load custom CA bundle, HTTPClient's transport unsupported type", nil) - } - } - if t == nil { - // Nil transport implies `http.DefaultTransport` should be used. Since - // the SDK cannot modify, nor copy the `DefaultTransport` specifying - // the values the next closest behavior. - t = getCABundleTransport() - } - - p, err := loadCertPool(bundle) - if err != nil { - return err - } - if t.TLSClientConfig == nil { - t.TLSClientConfig = &tls.Config{} - } - t.TLSClientConfig.RootCAs = p - - s.Config.HTTPClient.Transport = t - - return nil -} - -func loadCertPool(r io.Reader) (*x509.CertPool, error) { - b, err := ioutil.ReadAll(r) - if err != nil { - return nil, awserr.New("LoadCustomCABundleError", - "failed to read custom CA bundle PEM file", err) - } - - p := x509.NewCertPool() - if !p.AppendCertsFromPEM(b) { - return nil, awserr.New("LoadCustomCABundleError", - "failed to load custom CA bundle PEM file", err) - } - - return p, nil -} - -func mergeConfigSrcs(cfg, userCfg *aws.Config, - envCfg envConfig, sharedCfg sharedConfig, - handlers request.Handlers, - sessOpts Options, -) error { - - // Region if not already set by user - if len(aws.StringValue(cfg.Region)) == 0 { - if len(envCfg.Region) > 0 { - cfg.WithRegion(envCfg.Region) - } else if envCfg.EnableSharedConfig && len(sharedCfg.Region) > 0 { - cfg.WithRegion(sharedCfg.Region) - } - } - - if cfg.EnableEndpointDiscovery == nil { - if envCfg.EnableEndpointDiscovery != nil { - cfg.WithEndpointDiscovery(*envCfg.EnableEndpointDiscovery) - } else if envCfg.EnableSharedConfig && sharedCfg.EnableEndpointDiscovery != nil { - cfg.WithEndpointDiscovery(*sharedCfg.EnableEndpointDiscovery) - } - } - - // Configure credentials if not already set by the user when creating the - // Session. - if cfg.Credentials == credentials.AnonymousCredentials && userCfg.Credentials == nil { - creds, err := resolveCredentials(cfg, envCfg, sharedCfg, handlers, sessOpts) - if err != nil { - return err - } - cfg.Credentials = creds - } - - return nil -} - -func initHandlers(s *Session) { - // Add the Validate parameter handler if it is not disabled. - s.Handlers.Validate.Remove(corehandlers.ValidateParametersHandler) - if !aws.BoolValue(s.Config.DisableParamValidation) { - s.Handlers.Validate.PushBackNamed(corehandlers.ValidateParametersHandler) - } -} - -// Copy creates and returns a copy of the current Session, coping the config -// and handlers. If any additional configs are provided they will be merged -// on top of the Session's copied config. -// -// // Create a copy of the current Session, configured for the us-west-2 region. -// sess.Copy(&aws.Config{Region: aws.String("us-west-2")}) -func (s *Session) Copy(cfgs ...*aws.Config) *Session { - newSession := &Session{ - Config: s.Config.Copy(cfgs...), - Handlers: s.Handlers.Copy(), - } - - initHandlers(newSession) - - return newSession -} - -// ClientConfig satisfies the client.ConfigProvider interface and is used to -// configure the service client instances. Passing the Session to the service -// client's constructor (New) will use this method to configure the client. -func (s *Session) ClientConfig(serviceName string, cfgs ...*aws.Config) client.Config { - // Backwards compatibility, the error will be eaten if user calls ClientConfig - // directly. All SDK services will use ClientconfigWithError. - cfg, _ := s.clientConfigWithErr(serviceName, cfgs...) - - return cfg -} - -func (s *Session) clientConfigWithErr(serviceName string, cfgs ...*aws.Config) (client.Config, error) { - s = s.Copy(cfgs...) - - var resolved endpoints.ResolvedEndpoint - var err error - - region := aws.StringValue(s.Config.Region) - - if endpoint := aws.StringValue(s.Config.Endpoint); len(endpoint) != 0 { - resolved.URL = endpoints.AddScheme(endpoint, aws.BoolValue(s.Config.DisableSSL)) - resolved.SigningRegion = region - } else { - resolved, err = s.Config.EndpointResolver.EndpointFor( - serviceName, region, - func(opt *endpoints.Options) { - opt.DisableSSL = aws.BoolValue(s.Config.DisableSSL) - opt.UseDualStack = aws.BoolValue(s.Config.UseDualStack) - - // Support the condition where the service is modeled but its - // endpoint metadata is not available. - opt.ResolveUnknownService = true - }, - ) - } - - return client.Config{ - Config: s.Config, - Handlers: s.Handlers, - Endpoint: resolved.URL, - SigningRegion: resolved.SigningRegion, - SigningNameDerived: resolved.SigningNameDerived, - SigningName: resolved.SigningName, - }, err -} - -// ClientConfigNoResolveEndpoint is the same as ClientConfig with the exception -// that the EndpointResolver will not be used to resolve the endpoint. The only -// endpoint set must come from the aws.Config.Endpoint field. -func (s *Session) ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) client.Config { - s = s.Copy(cfgs...) - - var resolved endpoints.ResolvedEndpoint - - region := aws.StringValue(s.Config.Region) - - if ep := aws.StringValue(s.Config.Endpoint); len(ep) > 0 { - resolved.URL = endpoints.AddScheme(ep, aws.BoolValue(s.Config.DisableSSL)) - resolved.SigningRegion = region - } - - return client.Config{ - Config: s.Config, - Handlers: s.Handlers, - Endpoint: resolved.URL, - SigningRegion: resolved.SigningRegion, - SigningNameDerived: resolved.SigningNameDerived, - SigningName: resolved.SigningName, - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go b/vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go deleted file mode 100644 index d91ac93a5..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go +++ /dev/null @@ -1,491 +0,0 @@ -package session - -import ( - "fmt" - - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/internal/ini" -) - -const ( - // Static Credentials group - accessKeyIDKey = `aws_access_key_id` // group required - secretAccessKey = `aws_secret_access_key` // group required - sessionTokenKey = `aws_session_token` // optional - - // Assume Role Credentials group - roleArnKey = `role_arn` // group required - sourceProfileKey = `source_profile` // group required (or credential_source) - credentialSourceKey = `credential_source` // group required (or source_profile) - externalIDKey = `external_id` // optional - mfaSerialKey = `mfa_serial` // optional - roleSessionNameKey = `role_session_name` // optional - - // CSM options - csmEnabledKey = `csm_enabled` - csmHostKey = `csm_host` - csmPortKey = `csm_port` - csmClientIDKey = `csm_client_id` - - // Additional Config fields - regionKey = `region` - - // endpoint discovery group - enableEndpointDiscoveryKey = `endpoint_discovery_enabled` // optional - - // External Credential Process - credentialProcessKey = `credential_process` // optional - - // Web Identity Token File - webIdentityTokenFileKey = `web_identity_token_file` // optional - - // DefaultSharedConfigProfile is the default profile to be used when - // loading configuration from the config files if another profile name - // is not provided. - DefaultSharedConfigProfile = `default` -) - -// sharedConfig represents the configuration fields of the SDK config files. -type sharedConfig struct { - // Credentials values from the config file. Both aws_access_key_id and - // aws_secret_access_key must be provided together in the same file to be - // considered valid. The values will be ignored if not a complete group. - // aws_session_token is an optional field that can be provided if both of - // the other two fields are also provided. - // - // aws_access_key_id - // aws_secret_access_key - // aws_session_token - Creds credentials.Value - - CredentialSource string - CredentialProcess string - WebIdentityTokenFile string - - RoleARN string - RoleSessionName string - ExternalID string - MFASerial string - - SourceProfileName string - SourceProfile *sharedConfig - - // Region is the region the SDK should use for looking up AWS service - // endpoints and signing requests. - // - // region - Region string - - // EnableEndpointDiscovery can be enabled in the shared config by setting - // endpoint_discovery_enabled to true - // - // endpoint_discovery_enabled = true - EnableEndpointDiscovery *bool - - // CSM Options - CSMEnabled *bool - CSMHost string - CSMPort string - CSMClientID string -} - -type sharedConfigFile struct { - Filename string - IniData ini.Sections -} - -// loadSharedConfig retrieves the configuration from the list of files using -// the profile provided. The order the files are listed will determine -// precedence. Values in subsequent files will overwrite values defined in -// earlier files. -// -// For example, given two files A and B. Both define credentials. If the order -// of the files are A then B, B's credential values will be used instead of -// A's. -// -// See sharedConfig.setFromFile for information how the config files -// will be loaded. -func loadSharedConfig(profile string, filenames []string, exOpts bool) (sharedConfig, error) { - if len(profile) == 0 { - profile = DefaultSharedConfigProfile - } - - files, err := loadSharedConfigIniFiles(filenames) - if err != nil { - return sharedConfig{}, err - } - - cfg := sharedConfig{} - profiles := map[string]struct{}{} - if err = cfg.setFromIniFiles(profiles, profile, files, exOpts); err != nil { - return sharedConfig{}, err - } - - return cfg, nil -} - -func loadSharedConfigIniFiles(filenames []string) ([]sharedConfigFile, error) { - files := make([]sharedConfigFile, 0, len(filenames)) - - for _, filename := range filenames { - sections, err := ini.OpenFile(filename) - if aerr, ok := err.(awserr.Error); ok && aerr.Code() == ini.ErrCodeUnableToReadFile { - // Skip files which can't be opened and read for whatever reason - continue - } else if err != nil { - return nil, SharedConfigLoadError{Filename: filename, Err: err} - } - - files = append(files, sharedConfigFile{ - Filename: filename, IniData: sections, - }) - } - - return files, nil -} - -func (cfg *sharedConfig) setFromIniFiles(profiles map[string]struct{}, profile string, files []sharedConfigFile, exOpts bool) error { - // Trim files from the list that don't exist. - var skippedFiles int - var profileNotFoundErr error - for _, f := range files { - if err := cfg.setFromIniFile(profile, f, exOpts); err != nil { - if _, ok := err.(SharedConfigProfileNotExistsError); ok { - // Ignore profiles not defined in individual files. - profileNotFoundErr = err - skippedFiles++ - continue - } - return err - } - } - if skippedFiles == len(files) { - // If all files were skipped because the profile is not found, return - // the original profile not found error. - return profileNotFoundErr - } - - if _, ok := profiles[profile]; ok { - // if this is the second instance of the profile the Assume Role - // options must be cleared because they are only valid for the - // first reference of a profile. The self linked instance of the - // profile only have credential provider options. - cfg.clearAssumeRoleOptions() - } else { - // First time a profile has been seen, It must either be a assume role - // or credentials. Assert if the credential type requires a role ARN, - // the ARN is also set. - if err := cfg.validateCredentialsRequireARN(profile); err != nil { - return err - } - } - profiles[profile] = struct{}{} - - if err := cfg.validateCredentialType(); err != nil { - return err - } - - // Link source profiles for assume roles - if len(cfg.SourceProfileName) != 0 { - // Linked profile via source_profile ignore credential provider - // options, the source profile must provide the credentials. - cfg.clearCredentialOptions() - - srcCfg := &sharedConfig{} - err := srcCfg.setFromIniFiles(profiles, cfg.SourceProfileName, files, exOpts) - if err != nil { - // SourceProfile that doesn't exist is an error in configuration. - if _, ok := err.(SharedConfigProfileNotExistsError); ok { - err = SharedConfigAssumeRoleError{ - RoleARN: cfg.RoleARN, - SourceProfile: cfg.SourceProfileName, - } - } - return err - } - - if !srcCfg.hasCredentials() { - return SharedConfigAssumeRoleError{ - RoleARN: cfg.RoleARN, - SourceProfile: cfg.SourceProfileName, - } - } - - cfg.SourceProfile = srcCfg - } - - return nil -} - -// setFromFile loads the configuration from the file using the profile -// provided. A sharedConfig pointer type value is used so that multiple config -// file loadings can be chained. -// -// Only loads complete logically grouped values, and will not set fields in cfg -// for incomplete grouped values in the config. Such as credentials. For -// example if a config file only includes aws_access_key_id but no -// aws_secret_access_key the aws_access_key_id will be ignored. -func (cfg *sharedConfig) setFromIniFile(profile string, file sharedConfigFile, exOpts bool) error { - section, ok := file.IniData.GetSection(profile) - if !ok { - // Fallback to to alternate profile name: profile - section, ok = file.IniData.GetSection(fmt.Sprintf("profile %s", profile)) - if !ok { - return SharedConfigProfileNotExistsError{Profile: profile, Err: nil} - } - } - - if exOpts { - // Assume Role Parameters - updateString(&cfg.RoleARN, section, roleArnKey) - updateString(&cfg.ExternalID, section, externalIDKey) - updateString(&cfg.MFASerial, section, mfaSerialKey) - updateString(&cfg.RoleSessionName, section, roleSessionNameKey) - updateString(&cfg.SourceProfileName, section, sourceProfileKey) - updateString(&cfg.CredentialSource, section, credentialSourceKey) - - updateString(&cfg.Region, section, regionKey) - } - - updateString(&cfg.CredentialProcess, section, credentialProcessKey) - updateString(&cfg.WebIdentityTokenFile, section, webIdentityTokenFileKey) - - // Shared Credentials - creds := credentials.Value{ - AccessKeyID: section.String(accessKeyIDKey), - SecretAccessKey: section.String(secretAccessKey), - SessionToken: section.String(sessionTokenKey), - ProviderName: fmt.Sprintf("SharedConfigCredentials: %s", file.Filename), - } - if creds.HasKeys() { - cfg.Creds = creds - } - - // Endpoint discovery - updateBoolPtr(&cfg.EnableEndpointDiscovery, section, enableEndpointDiscoveryKey) - - // CSM options - updateBoolPtr(&cfg.CSMEnabled, section, csmEnabledKey) - updateString(&cfg.CSMHost, section, csmHostKey) - updateString(&cfg.CSMPort, section, csmPortKey) - updateString(&cfg.CSMClientID, section, csmClientIDKey) - - return nil -} - -func (cfg *sharedConfig) validateCredentialsRequireARN(profile string) error { - var credSource string - - switch { - case len(cfg.SourceProfileName) != 0: - credSource = sourceProfileKey - case len(cfg.CredentialSource) != 0: - credSource = credentialSourceKey - case len(cfg.WebIdentityTokenFile) != 0: - credSource = webIdentityTokenFileKey - } - - if len(credSource) != 0 && len(cfg.RoleARN) == 0 { - return CredentialRequiresARNError{ - Type: credSource, - Profile: profile, - } - } - - return nil -} - -func (cfg *sharedConfig) validateCredentialType() error { - // Only one or no credential type can be defined. - if !oneOrNone( - len(cfg.SourceProfileName) != 0, - len(cfg.CredentialSource) != 0, - len(cfg.CredentialProcess) != 0, - len(cfg.WebIdentityTokenFile) != 0, - ) { - return ErrSharedConfigSourceCollision - } - - return nil -} - -func (cfg *sharedConfig) hasCredentials() bool { - switch { - case len(cfg.SourceProfileName) != 0: - case len(cfg.CredentialSource) != 0: - case len(cfg.CredentialProcess) != 0: - case len(cfg.WebIdentityTokenFile) != 0: - case cfg.Creds.HasKeys(): - default: - return false - } - - return true -} - -func (cfg *sharedConfig) clearCredentialOptions() { - cfg.CredentialSource = "" - cfg.CredentialProcess = "" - cfg.WebIdentityTokenFile = "" - cfg.Creds = credentials.Value{} -} - -func (cfg *sharedConfig) clearAssumeRoleOptions() { - cfg.RoleARN = "" - cfg.ExternalID = "" - cfg.MFASerial = "" - cfg.RoleSessionName = "" - cfg.SourceProfileName = "" -} - -func oneOrNone(bs ...bool) bool { - var count int - - for _, b := range bs { - if b { - count++ - if count > 1 { - return false - } - } - } - - return true -} - -// updateString will only update the dst with the value in the section key, key -// is present in the section. -func updateString(dst *string, section ini.Section, key string) { - if !section.Has(key) { - return - } - *dst = section.String(key) -} - -// updateBoolPtr will only update the dst with the value in the section key, -// key is present in the section. -func updateBoolPtr(dst **bool, section ini.Section, key string) { - if !section.Has(key) { - return - } - *dst = new(bool) - **dst = section.Bool(key) -} - -// SharedConfigLoadError is an error for the shared config file failed to load. -type SharedConfigLoadError struct { - Filename string - Err error -} - -// Code is the short id of the error. -func (e SharedConfigLoadError) Code() string { - return "SharedConfigLoadError" -} - -// Message is the description of the error -func (e SharedConfigLoadError) Message() string { - return fmt.Sprintf("failed to load config file, %s", e.Filename) -} - -// OrigErr is the underlying error that caused the failure. -func (e SharedConfigLoadError) OrigErr() error { - return e.Err -} - -// Error satisfies the error interface. -func (e SharedConfigLoadError) Error() string { - return awserr.SprintError(e.Code(), e.Message(), "", e.Err) -} - -// SharedConfigProfileNotExistsError is an error for the shared config when -// the profile was not find in the config file. -type SharedConfigProfileNotExistsError struct { - Profile string - Err error -} - -// Code is the short id of the error. -func (e SharedConfigProfileNotExistsError) Code() string { - return "SharedConfigProfileNotExistsError" -} - -// Message is the description of the error -func (e SharedConfigProfileNotExistsError) Message() string { - return fmt.Sprintf("failed to get profile, %s", e.Profile) -} - -// OrigErr is the underlying error that caused the failure. -func (e SharedConfigProfileNotExistsError) OrigErr() error { - return e.Err -} - -// Error satisfies the error interface. -func (e SharedConfigProfileNotExistsError) Error() string { - return awserr.SprintError(e.Code(), e.Message(), "", e.Err) -} - -// SharedConfigAssumeRoleError is an error for the shared config when the -// profile contains assume role information, but that information is invalid -// or not complete. -type SharedConfigAssumeRoleError struct { - RoleARN string - SourceProfile string -} - -// Code is the short id of the error. -func (e SharedConfigAssumeRoleError) Code() string { - return "SharedConfigAssumeRoleError" -} - -// Message is the description of the error -func (e SharedConfigAssumeRoleError) Message() string { - return fmt.Sprintf( - "failed to load assume role for %s, source profile %s has no shared credentials", - e.RoleARN, e.SourceProfile, - ) -} - -// OrigErr is the underlying error that caused the failure. -func (e SharedConfigAssumeRoleError) OrigErr() error { - return nil -} - -// Error satisfies the error interface. -func (e SharedConfigAssumeRoleError) Error() string { - return awserr.SprintError(e.Code(), e.Message(), "", nil) -} - -// CredentialRequiresARNError provides the error for shared config credentials -// that are incorrectly configured in the shared config or credentials file. -type CredentialRequiresARNError struct { - // type of credentials that were configured. - Type string - - // Profile name the credentials were in. - Profile string -} - -// Code is the short id of the error. -func (e CredentialRequiresARNError) Code() string { - return "CredentialRequiresARNError" -} - -// Message is the description of the error -func (e CredentialRequiresARNError) Message() string { - return fmt.Sprintf( - "credential type %s requires role_arn, profile %s", - e.Type, e.Profile, - ) -} - -// OrigErr is the underlying error that caused the failure. -func (e CredentialRequiresARNError) OrigErr() error { - return nil -} - -// Error satisfies the error interface. -func (e CredentialRequiresARNError) Error() string { - return awserr.SprintError(e.Code(), e.Message(), "", nil) -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go deleted file mode 100644 index 244c86da0..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/header_rules.go +++ /dev/null @@ -1,82 +0,0 @@ -package v4 - -import ( - "net/http" - "strings" -) - -// validator houses a set of rule needed for validation of a -// string value -type rules []rule - -// rule interface allows for more flexible rules and just simply -// checks whether or not a value adheres to that rule -type rule interface { - IsValid(value string) bool -} - -// IsValid will iterate through all rules and see if any rules -// apply to the value and supports nested rules -func (r rules) IsValid(value string) bool { - for _, rule := range r { - if rule.IsValid(value) { - return true - } - } - return false -} - -// mapRule generic rule for maps -type mapRule map[string]struct{} - -// IsValid for the map rule satisfies whether it exists in the map -func (m mapRule) IsValid(value string) bool { - _, ok := m[value] - return ok -} - -// whitelist is a generic rule for whitelisting -type whitelist struct { - rule -} - -// IsValid for whitelist checks if the value is within the whitelist -func (w whitelist) IsValid(value string) bool { - return w.rule.IsValid(value) -} - -// blacklist is a generic rule for blacklisting -type blacklist struct { - rule -} - -// IsValid for whitelist checks if the value is within the whitelist -func (b blacklist) IsValid(value string) bool { - return !b.rule.IsValid(value) -} - -type patterns []string - -// IsValid for patterns checks each pattern and returns if a match has -// been found -func (p patterns) IsValid(value string) bool { - for _, pattern := range p { - if strings.HasPrefix(http.CanonicalHeaderKey(value), pattern) { - return true - } - } - return false -} - -// inclusiveRules rules allow for rules to depend on one another -type inclusiveRules []rule - -// IsValid will return true if all rules are true -func (r inclusiveRules) IsValid(value string) bool { - for _, rule := range r { - if !rule.IsValid(value) { - return false - } - } - return true -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/options.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/options.go deleted file mode 100644 index 6aa2ed241..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/options.go +++ /dev/null @@ -1,7 +0,0 @@ -package v4 - -// WithUnsignedPayload will enable and set the UnsignedPayload field to -// true of the signer. -func WithUnsignedPayload(v4 *Signer) { - v4.UnsignedPayload = true -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/uri_path.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/uri_path.go deleted file mode 100644 index bd082e9d1..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/uri_path.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build go1.5 - -package v4 - -import ( - "net/url" - "strings" -) - -func getURIPath(u *url.URL) string { - var uri string - - if len(u.Opaque) > 0 { - uri = "/" + strings.Join(strings.Split(u.Opaque, "/")[3:], "/") - } else { - uri = u.EscapedPath() - } - - if len(uri) == 0 { - uri = "/" - } - - return uri -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go b/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go deleted file mode 100644 index 8104793aa..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go +++ /dev/null @@ -1,806 +0,0 @@ -// Package v4 implements signing for AWS V4 signer -// -// Provides request signing for request that need to be signed with -// AWS V4 Signatures. -// -// Standalone Signer -// -// Generally using the signer outside of the SDK should not require any additional -// logic when using Go v1.5 or higher. The signer does this by taking advantage -// of the URL.EscapedPath method. If your request URI requires additional escaping -// you many need to use the URL.Opaque to define what the raw URI should be sent -// to the service as. -// -// The signer will first check the URL.Opaque field, and use its value if set. -// The signer does require the URL.Opaque field to be set in the form of: -// -// "///" -// -// // e.g. -// "//example.com/some/path" -// -// The leading "//" and hostname are required or the URL.Opaque escaping will -// not work correctly. -// -// If URL.Opaque is not set the signer will fallback to the URL.EscapedPath() -// method and using the returned value. If you're using Go v1.4 you must set -// URL.Opaque if the URI path needs escaping. If URL.Opaque is not set with -// Go v1.5 the signer will fallback to URL.Path. -// -// AWS v4 signature validation requires that the canonical string's URI path -// element must be the URI escaped form of the HTTP request's path. -// http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html -// -// The Go HTTP client will perform escaping automatically on the request. Some -// of these escaping may cause signature validation errors because the HTTP -// request differs from the URI path or query that the signature was generated. -// https://golang.org/pkg/net/url/#URL.EscapedPath -// -// Because of this, it is recommended that when using the signer outside of the -// SDK that explicitly escaping the request prior to being signed is preferable, -// and will help prevent signature validation errors. This can be done by setting -// the URL.Opaque or URL.RawPath. The SDK will use URL.Opaque first and then -// call URL.EscapedPath() if Opaque is not set. -// -// If signing a request intended for HTTP2 server, and you're using Go 1.6.2 -// through 1.7.4 you should use the URL.RawPath as the pre-escaped form of the -// request URL. https://github.com/golang/go/issues/16847 points to a bug in -// Go pre 1.8 that fails to make HTTP2 requests using absolute URL in the HTTP -// message. URL.Opaque generally will force Go to make requests with absolute URL. -// URL.RawPath does not do this, but RawPath must be a valid escaping of Path -// or url.EscapedPath will ignore the RawPath escaping. -// -// Test `TestStandaloneSign` provides a complete example of using the signer -// outside of the SDK and pre-escaping the URI path. -package v4 - -import ( - "crypto/hmac" - "crypto/sha256" - "encoding/hex" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "sort" - "strconv" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/internal/sdkio" - "github.com/aws/aws-sdk-go/private/protocol/rest" -) - -const ( - authHeaderPrefix = "AWS4-HMAC-SHA256" - timeFormat = "20060102T150405Z" - shortTimeFormat = "20060102" - - // emptyStringSHA256 is a SHA256 of an empty string - emptyStringSHA256 = `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855` -) - -var ignoredHeaders = rules{ - blacklist{ - mapRule{ - "Authorization": struct{}{}, - "User-Agent": struct{}{}, - "X-Amzn-Trace-Id": struct{}{}, - }, - }, -} - -// requiredSignedHeaders is a whitelist for build canonical headers. -var requiredSignedHeaders = rules{ - whitelist{ - mapRule{ - "Cache-Control": struct{}{}, - "Content-Disposition": struct{}{}, - "Content-Encoding": struct{}{}, - "Content-Language": struct{}{}, - "Content-Md5": struct{}{}, - "Content-Type": struct{}{}, - "Expires": struct{}{}, - "If-Match": struct{}{}, - "If-Modified-Since": struct{}{}, - "If-None-Match": struct{}{}, - "If-Unmodified-Since": struct{}{}, - "Range": struct{}{}, - "X-Amz-Acl": struct{}{}, - "X-Amz-Copy-Source": struct{}{}, - "X-Amz-Copy-Source-If-Match": struct{}{}, - "X-Amz-Copy-Source-If-Modified-Since": struct{}{}, - "X-Amz-Copy-Source-If-None-Match": struct{}{}, - "X-Amz-Copy-Source-If-Unmodified-Since": struct{}{}, - "X-Amz-Copy-Source-Range": struct{}{}, - "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Algorithm": struct{}{}, - "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key": struct{}{}, - "X-Amz-Copy-Source-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, - "X-Amz-Grant-Full-control": struct{}{}, - "X-Amz-Grant-Read": struct{}{}, - "X-Amz-Grant-Read-Acp": struct{}{}, - "X-Amz-Grant-Write": struct{}{}, - "X-Amz-Grant-Write-Acp": struct{}{}, - "X-Amz-Metadata-Directive": struct{}{}, - "X-Amz-Mfa": struct{}{}, - "X-Amz-Request-Payer": struct{}{}, - "X-Amz-Server-Side-Encryption": struct{}{}, - "X-Amz-Server-Side-Encryption-Aws-Kms-Key-Id": struct{}{}, - "X-Amz-Server-Side-Encryption-Customer-Algorithm": struct{}{}, - "X-Amz-Server-Side-Encryption-Customer-Key": struct{}{}, - "X-Amz-Server-Side-Encryption-Customer-Key-Md5": struct{}{}, - "X-Amz-Storage-Class": struct{}{}, - "X-Amz-Tagging": struct{}{}, - "X-Amz-Website-Redirect-Location": struct{}{}, - "X-Amz-Content-Sha256": struct{}{}, - }, - }, - patterns{"X-Amz-Meta-"}, -} - -// allowedHoisting is a whitelist for build query headers. The boolean value -// represents whether or not it is a pattern. -var allowedQueryHoisting = inclusiveRules{ - blacklist{requiredSignedHeaders}, - patterns{"X-Amz-"}, -} - -// Signer applies AWS v4 signing to given request. Use this to sign requests -// that need to be signed with AWS V4 Signatures. -type Signer struct { - // The authentication credentials the request will be signed against. - // This value must be set to sign requests. - Credentials *credentials.Credentials - - // Sets the log level the signer should use when reporting information to - // the logger. If the logger is nil nothing will be logged. See - // aws.LogLevelType for more information on available logging levels - // - // By default nothing will be logged. - Debug aws.LogLevelType - - // The logger loging information will be written to. If there the logger - // is nil, nothing will be logged. - Logger aws.Logger - - // Disables the Signer's moving HTTP header key/value pairs from the HTTP - // request header to the request's query string. This is most commonly used - // with pre-signed requests preventing headers from being added to the - // request's query string. - DisableHeaderHoisting bool - - // Disables the automatic escaping of the URI path of the request for the - // siganture's canonical string's path. For services that do not need additional - // escaping then use this to disable the signer escaping the path. - // - // S3 is an example of a service that does not need additional escaping. - // - // http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html - DisableURIPathEscaping bool - - // Disables the automatical setting of the HTTP request's Body field with the - // io.ReadSeeker passed in to the signer. This is useful if you're using a - // custom wrapper around the body for the io.ReadSeeker and want to preserve - // the Body value on the Request.Body. - // - // This does run the risk of signing a request with a body that will not be - // sent in the request. Need to ensure that the underlying data of the Body - // values are the same. - DisableRequestBodyOverwrite bool - - // currentTimeFn returns the time value which represents the current time. - // This value should only be used for testing. If it is nil the default - // time.Now will be used. - currentTimeFn func() time.Time - - // UnsignedPayload will prevent signing of the payload. This will only - // work for services that have support for this. - UnsignedPayload bool -} - -// NewSigner returns a Signer pointer configured with the credentials and optional -// option values provided. If not options are provided the Signer will use its -// default configuration. -func NewSigner(credentials *credentials.Credentials, options ...func(*Signer)) *Signer { - v4 := &Signer{ - Credentials: credentials, - } - - for _, option := range options { - option(v4) - } - - return v4 -} - -type signingCtx struct { - ServiceName string - Region string - Request *http.Request - Body io.ReadSeeker - Query url.Values - Time time.Time - ExpireTime time.Duration - SignedHeaderVals http.Header - - DisableURIPathEscaping bool - - credValues credentials.Value - isPresign bool - formattedTime string - formattedShortTime string - unsignedPayload bool - - bodyDigest string - signedHeaders string - canonicalHeaders string - canonicalString string - credentialString string - stringToSign string - signature string - authorization string -} - -// Sign signs AWS v4 requests with the provided body, service name, region the -// request is made to, and time the request is signed at. The signTime allows -// you to specify that a request is signed for the future, and cannot be -// used until then. -// -// Returns a list of HTTP headers that were included in the signature or an -// error if signing the request failed. Generally for signed requests this value -// is not needed as the full request context will be captured by the http.Request -// value. It is included for reference though. -// -// Sign will set the request's Body to be the `body` parameter passed in. If -// the body is not already an io.ReadCloser, it will be wrapped within one. If -// a `nil` body parameter passed to Sign, the request's Body field will be -// also set to nil. Its important to note that this functionality will not -// change the request's ContentLength of the request. -// -// Sign differs from Presign in that it will sign the request using HTTP -// header values. This type of signing is intended for http.Request values that -// will not be shared, or are shared in a way the header values on the request -// will not be lost. -// -// The requests body is an io.ReadSeeker so the SHA256 of the body can be -// generated. To bypass the signer computing the hash you can set the -// "X-Amz-Content-Sha256" header with a precomputed value. The signer will -// only compute the hash if the request header value is empty. -func (v4 Signer) Sign(r *http.Request, body io.ReadSeeker, service, region string, signTime time.Time) (http.Header, error) { - return v4.signWithBody(r, body, service, region, 0, false, signTime) -} - -// Presign signs AWS v4 requests with the provided body, service name, region -// the request is made to, and time the request is signed at. The signTime -// allows you to specify that a request is signed for the future, and cannot -// be used until then. -// -// Returns a list of HTTP headers that were included in the signature or an -// error if signing the request failed. For presigned requests these headers -// and their values must be included on the HTTP request when it is made. This -// is helpful to know what header values need to be shared with the party the -// presigned request will be distributed to. -// -// Presign differs from Sign in that it will sign the request using query string -// instead of header values. This allows you to share the Presigned Request's -// URL with third parties, or distribute it throughout your system with minimal -// dependencies. -// -// Presign also takes an exp value which is the duration the -// signed request will be valid after the signing time. This is allows you to -// set when the request will expire. -// -// The requests body is an io.ReadSeeker so the SHA256 of the body can be -// generated. To bypass the signer computing the hash you can set the -// "X-Amz-Content-Sha256" header with a precomputed value. The signer will -// only compute the hash if the request header value is empty. -// -// Presigning a S3 request will not compute the body's SHA256 hash by default. -// This is done due to the general use case for S3 presigned URLs is to share -// PUT/GET capabilities. If you would like to include the body's SHA256 in the -// presigned request's signature you can set the "X-Amz-Content-Sha256" -// HTTP header and that will be included in the request's signature. -func (v4 Signer) Presign(r *http.Request, body io.ReadSeeker, service, region string, exp time.Duration, signTime time.Time) (http.Header, error) { - return v4.signWithBody(r, body, service, region, exp, true, signTime) -} - -func (v4 Signer) signWithBody(r *http.Request, body io.ReadSeeker, service, region string, exp time.Duration, isPresign bool, signTime time.Time) (http.Header, error) { - currentTimeFn := v4.currentTimeFn - if currentTimeFn == nil { - currentTimeFn = time.Now - } - - ctx := &signingCtx{ - Request: r, - Body: body, - Query: r.URL.Query(), - Time: signTime, - ExpireTime: exp, - isPresign: isPresign, - ServiceName: service, - Region: region, - DisableURIPathEscaping: v4.DisableURIPathEscaping, - unsignedPayload: v4.UnsignedPayload, - } - - for key := range ctx.Query { - sort.Strings(ctx.Query[key]) - } - - if ctx.isRequestSigned() { - ctx.Time = currentTimeFn() - ctx.handlePresignRemoval() - } - - var err error - ctx.credValues, err = v4.Credentials.Get() - if err != nil { - return http.Header{}, err - } - - ctx.sanitizeHostForHeader() - ctx.assignAmzQueryValues() - if err := ctx.build(v4.DisableHeaderHoisting); err != nil { - return nil, err - } - - // If the request is not presigned the body should be attached to it. This - // prevents the confusion of wanting to send a signed request without - // the body the request was signed for attached. - if !(v4.DisableRequestBodyOverwrite || ctx.isPresign) { - var reader io.ReadCloser - if body != nil { - var ok bool - if reader, ok = body.(io.ReadCloser); !ok { - reader = ioutil.NopCloser(body) - } - } - r.Body = reader - } - - if v4.Debug.Matches(aws.LogDebugWithSigning) { - v4.logSigningInfo(ctx) - } - - return ctx.SignedHeaderVals, nil -} - -func (ctx *signingCtx) sanitizeHostForHeader() { - request.SanitizeHostForHeader(ctx.Request) -} - -func (ctx *signingCtx) handlePresignRemoval() { - if !ctx.isPresign { - return - } - - // The credentials have expired for this request. The current signing - // is invalid, and needs to be request because the request will fail. - ctx.removePresign() - - // Update the request's query string to ensure the values stays in - // sync in the case retrieving the new credentials fails. - ctx.Request.URL.RawQuery = ctx.Query.Encode() -} - -func (ctx *signingCtx) assignAmzQueryValues() { - if ctx.isPresign { - ctx.Query.Set("X-Amz-Algorithm", authHeaderPrefix) - if ctx.credValues.SessionToken != "" { - ctx.Query.Set("X-Amz-Security-Token", ctx.credValues.SessionToken) - } else { - ctx.Query.Del("X-Amz-Security-Token") - } - - return - } - - if ctx.credValues.SessionToken != "" { - ctx.Request.Header.Set("X-Amz-Security-Token", ctx.credValues.SessionToken) - } -} - -// SignRequestHandler is a named request handler the SDK will use to sign -// service client request with using the V4 signature. -var SignRequestHandler = request.NamedHandler{ - Name: "v4.SignRequestHandler", Fn: SignSDKRequest, -} - -// SignSDKRequest signs an AWS request with the V4 signature. This -// request handler should only be used with the SDK's built in service client's -// API operation requests. -// -// This function should not be used on its on its own, but in conjunction with -// an AWS service client's API operation call. To sign a standalone request -// not created by a service client's API operation method use the "Sign" or -// "Presign" functions of the "Signer" type. -// -// If the credentials of the request's config are set to -// credentials.AnonymousCredentials the request will not be signed. -func SignSDKRequest(req *request.Request) { - SignSDKRequestWithCurrentTime(req, time.Now) -} - -// BuildNamedHandler will build a generic handler for signing. -func BuildNamedHandler(name string, opts ...func(*Signer)) request.NamedHandler { - return request.NamedHandler{ - Name: name, - Fn: func(req *request.Request) { - SignSDKRequestWithCurrentTime(req, time.Now, opts...) - }, - } -} - -// SignSDKRequestWithCurrentTime will sign the SDK's request using the time -// function passed in. Behaves the same as SignSDKRequest with the exception -// the request is signed with the value returned by the current time function. -func SignSDKRequestWithCurrentTime(req *request.Request, curTimeFn func() time.Time, opts ...func(*Signer)) { - // If the request does not need to be signed ignore the signing of the - // request if the AnonymousCredentials object is used. - if req.Config.Credentials == credentials.AnonymousCredentials { - return - } - - region := req.ClientInfo.SigningRegion - if region == "" { - region = aws.StringValue(req.Config.Region) - } - - name := req.ClientInfo.SigningName - if name == "" { - name = req.ClientInfo.ServiceName - } - - v4 := NewSigner(req.Config.Credentials, func(v4 *Signer) { - v4.Debug = req.Config.LogLevel.Value() - v4.Logger = req.Config.Logger - v4.DisableHeaderHoisting = req.NotHoist - v4.currentTimeFn = curTimeFn - if name == "s3" { - // S3 service should not have any escaping applied - v4.DisableURIPathEscaping = true - } - // Prevents setting the HTTPRequest's Body. Since the Body could be - // wrapped in a custom io.Closer that we do not want to be stompped - // on top of by the signer. - v4.DisableRequestBodyOverwrite = true - }) - - for _, opt := range opts { - opt(v4) - } - - curTime := curTimeFn() - signedHeaders, err := v4.signWithBody(req.HTTPRequest, req.GetBody(), - name, region, req.ExpireTime, req.ExpireTime > 0, curTime, - ) - if err != nil { - req.Error = err - req.SignedHeaderVals = nil - return - } - - req.SignedHeaderVals = signedHeaders - req.LastSignedAt = curTime -} - -const logSignInfoMsg = `DEBUG: Request Signature: ----[ CANONICAL STRING ]----------------------------- -%s ----[ STRING TO SIGN ]-------------------------------- -%s%s ------------------------------------------------------` -const logSignedURLMsg = ` ----[ SIGNED URL ]------------------------------------ -%s` - -func (v4 *Signer) logSigningInfo(ctx *signingCtx) { - signedURLMsg := "" - if ctx.isPresign { - signedURLMsg = fmt.Sprintf(logSignedURLMsg, ctx.Request.URL.String()) - } - msg := fmt.Sprintf(logSignInfoMsg, ctx.canonicalString, ctx.stringToSign, signedURLMsg) - v4.Logger.Log(msg) -} - -func (ctx *signingCtx) build(disableHeaderHoisting bool) error { - ctx.buildTime() // no depends - ctx.buildCredentialString() // no depends - - if err := ctx.buildBodyDigest(); err != nil { - return err - } - - unsignedHeaders := ctx.Request.Header - if ctx.isPresign { - if !disableHeaderHoisting { - urlValues := url.Values{} - urlValues, unsignedHeaders = buildQuery(allowedQueryHoisting, unsignedHeaders) // no depends - for k := range urlValues { - ctx.Query[k] = urlValues[k] - } - } - } - - ctx.buildCanonicalHeaders(ignoredHeaders, unsignedHeaders) - ctx.buildCanonicalString() // depends on canon headers / signed headers - ctx.buildStringToSign() // depends on canon string - ctx.buildSignature() // depends on string to sign - - if ctx.isPresign { - ctx.Request.URL.RawQuery += "&X-Amz-Signature=" + ctx.signature - } else { - parts := []string{ - authHeaderPrefix + " Credential=" + ctx.credValues.AccessKeyID + "/" + ctx.credentialString, - "SignedHeaders=" + ctx.signedHeaders, - "Signature=" + ctx.signature, - } - ctx.Request.Header.Set("Authorization", strings.Join(parts, ", ")) - } - - return nil -} - -func (ctx *signingCtx) buildTime() { - ctx.formattedTime = ctx.Time.UTC().Format(timeFormat) - ctx.formattedShortTime = ctx.Time.UTC().Format(shortTimeFormat) - - if ctx.isPresign { - duration := int64(ctx.ExpireTime / time.Second) - ctx.Query.Set("X-Amz-Date", ctx.formattedTime) - ctx.Query.Set("X-Amz-Expires", strconv.FormatInt(duration, 10)) - } else { - ctx.Request.Header.Set("X-Amz-Date", ctx.formattedTime) - } -} - -func (ctx *signingCtx) buildCredentialString() { - ctx.credentialString = strings.Join([]string{ - ctx.formattedShortTime, - ctx.Region, - ctx.ServiceName, - "aws4_request", - }, "/") - - if ctx.isPresign { - ctx.Query.Set("X-Amz-Credential", ctx.credValues.AccessKeyID+"/"+ctx.credentialString) - } -} - -func buildQuery(r rule, header http.Header) (url.Values, http.Header) { - query := url.Values{} - unsignedHeaders := http.Header{} - for k, h := range header { - if r.IsValid(k) { - query[k] = h - } else { - unsignedHeaders[k] = h - } - } - - return query, unsignedHeaders -} -func (ctx *signingCtx) buildCanonicalHeaders(r rule, header http.Header) { - var headers []string - headers = append(headers, "host") - for k, v := range header { - canonicalKey := http.CanonicalHeaderKey(k) - if !r.IsValid(canonicalKey) { - continue // ignored header - } - if ctx.SignedHeaderVals == nil { - ctx.SignedHeaderVals = make(http.Header) - } - - lowerCaseKey := strings.ToLower(k) - if _, ok := ctx.SignedHeaderVals[lowerCaseKey]; ok { - // include additional values - ctx.SignedHeaderVals[lowerCaseKey] = append(ctx.SignedHeaderVals[lowerCaseKey], v...) - continue - } - - headers = append(headers, lowerCaseKey) - ctx.SignedHeaderVals[lowerCaseKey] = v - } - sort.Strings(headers) - - ctx.signedHeaders = strings.Join(headers, ";") - - if ctx.isPresign { - ctx.Query.Set("X-Amz-SignedHeaders", ctx.signedHeaders) - } - - headerValues := make([]string, len(headers)) - for i, k := range headers { - if k == "host" { - if ctx.Request.Host != "" { - headerValues[i] = "host:" + ctx.Request.Host - } else { - headerValues[i] = "host:" + ctx.Request.URL.Host - } - } else { - headerValues[i] = k + ":" + - strings.Join(ctx.SignedHeaderVals[k], ",") - } - } - stripExcessSpaces(headerValues) - ctx.canonicalHeaders = strings.Join(headerValues, "\n") -} - -func (ctx *signingCtx) buildCanonicalString() { - ctx.Request.URL.RawQuery = strings.Replace(ctx.Query.Encode(), "+", "%20", -1) - - uri := getURIPath(ctx.Request.URL) - - if !ctx.DisableURIPathEscaping { - uri = rest.EscapePath(uri, false) - } - - ctx.canonicalString = strings.Join([]string{ - ctx.Request.Method, - uri, - ctx.Request.URL.RawQuery, - ctx.canonicalHeaders + "\n", - ctx.signedHeaders, - ctx.bodyDigest, - }, "\n") -} - -func (ctx *signingCtx) buildStringToSign() { - ctx.stringToSign = strings.Join([]string{ - authHeaderPrefix, - ctx.formattedTime, - ctx.credentialString, - hex.EncodeToString(makeSha256([]byte(ctx.canonicalString))), - }, "\n") -} - -func (ctx *signingCtx) buildSignature() { - secret := ctx.credValues.SecretAccessKey - date := makeHmac([]byte("AWS4"+secret), []byte(ctx.formattedShortTime)) - region := makeHmac(date, []byte(ctx.Region)) - service := makeHmac(region, []byte(ctx.ServiceName)) - credentials := makeHmac(service, []byte("aws4_request")) - signature := makeHmac(credentials, []byte(ctx.stringToSign)) - ctx.signature = hex.EncodeToString(signature) -} - -func (ctx *signingCtx) buildBodyDigest() error { - hash := ctx.Request.Header.Get("X-Amz-Content-Sha256") - if hash == "" { - includeSHA256Header := ctx.unsignedPayload || - ctx.ServiceName == "s3" || - ctx.ServiceName == "glacier" - - s3Presign := ctx.isPresign && ctx.ServiceName == "s3" - - if ctx.unsignedPayload || s3Presign { - hash = "UNSIGNED-PAYLOAD" - includeSHA256Header = !s3Presign - } else if ctx.Body == nil { - hash = emptyStringSHA256 - } else { - if !aws.IsReaderSeekable(ctx.Body) { - return fmt.Errorf("cannot use unseekable request body %T, for signed request with body", ctx.Body) - } - hashBytes, err := makeSha256Reader(ctx.Body) - if err != nil { - return err - } - hash = hex.EncodeToString(hashBytes) - } - - if includeSHA256Header { - ctx.Request.Header.Set("X-Amz-Content-Sha256", hash) - } - } - ctx.bodyDigest = hash - - return nil -} - -// isRequestSigned returns if the request is currently signed or presigned -func (ctx *signingCtx) isRequestSigned() bool { - if ctx.isPresign && ctx.Query.Get("X-Amz-Signature") != "" { - return true - } - if ctx.Request.Header.Get("Authorization") != "" { - return true - } - - return false -} - -// unsign removes signing flags for both signed and presigned requests. -func (ctx *signingCtx) removePresign() { - ctx.Query.Del("X-Amz-Algorithm") - ctx.Query.Del("X-Amz-Signature") - ctx.Query.Del("X-Amz-Security-Token") - ctx.Query.Del("X-Amz-Date") - ctx.Query.Del("X-Amz-Expires") - ctx.Query.Del("X-Amz-Credential") - ctx.Query.Del("X-Amz-SignedHeaders") -} - -func makeHmac(key []byte, data []byte) []byte { - hash := hmac.New(sha256.New, key) - hash.Write(data) - return hash.Sum(nil) -} - -func makeSha256(data []byte) []byte { - hash := sha256.New() - hash.Write(data) - return hash.Sum(nil) -} - -func makeSha256Reader(reader io.ReadSeeker) (hashBytes []byte, err error) { - hash := sha256.New() - start, err := reader.Seek(0, sdkio.SeekCurrent) - if err != nil { - return nil, err - } - defer func() { - // ensure error is return if unable to seek back to start of payload. - _, err = reader.Seek(start, sdkio.SeekStart) - }() - - // Use CopyN to avoid allocating the 32KB buffer in io.Copy for bodies - // smaller than 32KB. Fall back to io.Copy if we fail to determine the size. - size, err := aws.SeekerLen(reader) - if err != nil { - io.Copy(hash, reader) - } else { - io.CopyN(hash, reader, size) - } - - return hash.Sum(nil), nil -} - -const doubleSpace = " " - -// stripExcessSpaces will rewrite the passed in slice's string values to not -// contain multiple side-by-side spaces. -func stripExcessSpaces(vals []string) { - var j, k, l, m, spaces int - for i, str := range vals { - // Trim trailing spaces - for j = len(str) - 1; j >= 0 && str[j] == ' '; j-- { - } - - // Trim leading spaces - for k = 0; k < j && str[k] == ' '; k++ { - } - str = str[k : j+1] - - // Strip multiple spaces. - j = strings.Index(str, doubleSpace) - if j < 0 { - vals[i] = str - continue - } - - buf := []byte(str) - for k, m, l = j, j, len(buf); k < l; k++ { - if buf[k] == ' ' { - if spaces == 0 { - // First space. - buf[m] = buf[k] - m++ - } - spaces++ - } else { - // End of multiple spaces. - spaces = 0 - buf[m] = buf[k] - m++ - } - } - - vals[i] = string(buf[:m]) - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/types.go b/vendor/github.com/aws/aws-sdk-go/aws/types.go deleted file mode 100644 index 455091540..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/types.go +++ /dev/null @@ -1,207 +0,0 @@ -package aws - -import ( - "io" - "sync" - - "github.com/aws/aws-sdk-go/internal/sdkio" -) - -// ReadSeekCloser wraps a io.Reader returning a ReaderSeekerCloser. Allows the -// SDK to accept an io.Reader that is not also an io.Seeker for unsigned -// streaming payload API operations. -// -// A ReadSeekCloser wrapping an nonseekable io.Reader used in an API -// operation's input will prevent that operation being retried in the case of -// network errors, and cause operation requests to fail if the operation -// requires payload signing. -// -// Note: If using With S3 PutObject to stream an object upload The SDK's S3 -// Upload manager (s3manager.Uploader) provides support for streaming with the -// ability to retry network errors. -func ReadSeekCloser(r io.Reader) ReaderSeekerCloser { - return ReaderSeekerCloser{r} -} - -// ReaderSeekerCloser represents a reader that can also delegate io.Seeker and -// io.Closer interfaces to the underlying object if they are available. -type ReaderSeekerCloser struct { - r io.Reader -} - -// IsReaderSeekable returns if the underlying reader type can be seeked. A -// io.Reader might not actually be seekable if it is the ReaderSeekerCloser -// type. -func IsReaderSeekable(r io.Reader) bool { - switch v := r.(type) { - case ReaderSeekerCloser: - return v.IsSeeker() - case *ReaderSeekerCloser: - return v.IsSeeker() - case io.ReadSeeker: - return true - default: - return false - } -} - -// Read reads from the reader up to size of p. The number of bytes read, and -// error if it occurred will be returned. -// -// If the reader is not an io.Reader zero bytes read, and nil error will be -// returned. -// -// Performs the same functionality as io.Reader Read -func (r ReaderSeekerCloser) Read(p []byte) (int, error) { - switch t := r.r.(type) { - case io.Reader: - return t.Read(p) - } - return 0, nil -} - -// Seek sets the offset for the next Read to offset, interpreted according to -// whence: 0 means relative to the origin of the file, 1 means relative to the -// current offset, and 2 means relative to the end. Seek returns the new offset -// and an error, if any. -// -// If the ReaderSeekerCloser is not an io.Seeker nothing will be done. -func (r ReaderSeekerCloser) Seek(offset int64, whence int) (int64, error) { - switch t := r.r.(type) { - case io.Seeker: - return t.Seek(offset, whence) - } - return int64(0), nil -} - -// IsSeeker returns if the underlying reader is also a seeker. -func (r ReaderSeekerCloser) IsSeeker() bool { - _, ok := r.r.(io.Seeker) - return ok -} - -// HasLen returns the length of the underlying reader if the value implements -// the Len() int method. -func (r ReaderSeekerCloser) HasLen() (int, bool) { - type lenner interface { - Len() int - } - - if lr, ok := r.r.(lenner); ok { - return lr.Len(), true - } - - return 0, false -} - -// GetLen returns the length of the bytes remaining in the underlying reader. -// Checks first for Len(), then io.Seeker to determine the size of the -// underlying reader. -// -// Will return -1 if the length cannot be determined. -func (r ReaderSeekerCloser) GetLen() (int64, error) { - if l, ok := r.HasLen(); ok { - return int64(l), nil - } - - if s, ok := r.r.(io.Seeker); ok { - return seekerLen(s) - } - - return -1, nil -} - -// SeekerLen attempts to get the number of bytes remaining at the seeker's -// current position. Returns the number of bytes remaining or error. -func SeekerLen(s io.Seeker) (int64, error) { - // Determine if the seeker is actually seekable. ReaderSeekerCloser - // hides the fact that a io.Readers might not actually be seekable. - switch v := s.(type) { - case ReaderSeekerCloser: - return v.GetLen() - case *ReaderSeekerCloser: - return v.GetLen() - } - - return seekerLen(s) -} - -func seekerLen(s io.Seeker) (int64, error) { - curOffset, err := s.Seek(0, sdkio.SeekCurrent) - if err != nil { - return 0, err - } - - endOffset, err := s.Seek(0, sdkio.SeekEnd) - if err != nil { - return 0, err - } - - _, err = s.Seek(curOffset, sdkio.SeekStart) - if err != nil { - return 0, err - } - - return endOffset - curOffset, nil -} - -// Close closes the ReaderSeekerCloser. -// -// If the ReaderSeekerCloser is not an io.Closer nothing will be done. -func (r ReaderSeekerCloser) Close() error { - switch t := r.r.(type) { - case io.Closer: - return t.Close() - } - return nil -} - -// A WriteAtBuffer provides a in memory buffer supporting the io.WriterAt interface -// Can be used with the s3manager.Downloader to download content to a buffer -// in memory. Safe to use concurrently. -type WriteAtBuffer struct { - buf []byte - m sync.Mutex - - // GrowthCoeff defines the growth rate of the internal buffer. By - // default, the growth rate is 1, where expanding the internal - // buffer will allocate only enough capacity to fit the new expected - // length. - GrowthCoeff float64 -} - -// NewWriteAtBuffer creates a WriteAtBuffer with an internal buffer -// provided by buf. -func NewWriteAtBuffer(buf []byte) *WriteAtBuffer { - return &WriteAtBuffer{buf: buf} -} - -// WriteAt writes a slice of bytes to a buffer starting at the position provided -// The number of bytes written will be returned, or error. Can overwrite previous -// written slices if the write ats overlap. -func (b *WriteAtBuffer) WriteAt(p []byte, pos int64) (n int, err error) { - pLen := len(p) - expLen := pos + int64(pLen) - b.m.Lock() - defer b.m.Unlock() - if int64(len(b.buf)) < expLen { - if int64(cap(b.buf)) < expLen { - if b.GrowthCoeff < 1 { - b.GrowthCoeff = 1 - } - newBuf := make([]byte, expLen, int64(b.GrowthCoeff*float64(expLen))) - copy(newBuf, b.buf) - b.buf = newBuf - } - b.buf = b.buf[:expLen] - } - copy(b.buf[pos:], p) - return pLen, nil -} - -// Bytes returns a slice of bytes written to the buffer. -func (b *WriteAtBuffer) Bytes() []byte { - b.m.Lock() - defer b.m.Unlock() - return b.buf -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/url.go b/vendor/github.com/aws/aws-sdk-go/aws/url.go deleted file mode 100644 index 6192b2455..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/url.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build go1.8 - -package aws - -import "net/url" - -// URLHostname will extract the Hostname without port from the URL value. -// -// Wrapper of net/url#URL.Hostname for backwards Go version compatibility. -func URLHostname(url *url.URL) string { - return url.Hostname() -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/url_1_7.go b/vendor/github.com/aws/aws-sdk-go/aws/url_1_7.go deleted file mode 100644 index 0210d2720..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/url_1_7.go +++ /dev/null @@ -1,29 +0,0 @@ -// +build !go1.8 - -package aws - -import ( - "net/url" - "strings" -) - -// URLHostname will extract the Hostname without port from the URL value. -// -// Copy of Go 1.8's net/url#URL.Hostname functionality. -func URLHostname(url *url.URL) string { - return stripPort(url.Host) - -} - -// stripPort is copy of Go 1.8 url#URL.Hostname functionality. -// https://golang.org/src/net/url/url.go -func stripPort(hostport string) string { - colon := strings.IndexByte(hostport, ':') - if colon == -1 { - return hostport - } - if i := strings.IndexByte(hostport, ']'); i != -1 { - return strings.TrimPrefix(hostport[:i], "[") - } - return hostport[:colon] -} diff --git a/vendor/github.com/aws/aws-sdk-go/aws/version.go b/vendor/github.com/aws/aws-sdk-go/aws/version.go deleted file mode 100644 index ca7a94879..000000000 --- a/vendor/github.com/aws/aws-sdk-go/aws/version.go +++ /dev/null @@ -1,8 +0,0 @@ -// Package aws provides core functionality for making requests to AWS services. -package aws - -// SDKName is the name of this AWS SDK -const SDKName = "aws-sdk-go" - -// SDKVersion is the version of this SDK -const SDKVersion = "1.23.16" diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ast.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ast.go deleted file mode 100644 index e83a99886..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/ast.go +++ /dev/null @@ -1,120 +0,0 @@ -package ini - -// ASTKind represents different states in the parse table -// and the type of AST that is being constructed -type ASTKind int - -// ASTKind* is used in the parse table to transition between -// the different states -const ( - ASTKindNone = ASTKind(iota) - ASTKindStart - ASTKindExpr - ASTKindEqualExpr - ASTKindStatement - ASTKindSkipStatement - ASTKindExprStatement - ASTKindSectionStatement - ASTKindNestedSectionStatement - ASTKindCompletedNestedSectionStatement - ASTKindCommentStatement - ASTKindCompletedSectionStatement -) - -func (k ASTKind) String() string { - switch k { - case ASTKindNone: - return "none" - case ASTKindStart: - return "start" - case ASTKindExpr: - return "expr" - case ASTKindStatement: - return "stmt" - case ASTKindSectionStatement: - return "section_stmt" - case ASTKindExprStatement: - return "expr_stmt" - case ASTKindCommentStatement: - return "comment" - case ASTKindNestedSectionStatement: - return "nested_section_stmt" - case ASTKindCompletedSectionStatement: - return "completed_stmt" - case ASTKindSkipStatement: - return "skip" - default: - return "" - } -} - -// AST interface allows us to determine what kind of node we -// are on and casting may not need to be necessary. -// -// The root is always the first node in Children -type AST struct { - Kind ASTKind - Root Token - RootToken bool - Children []AST -} - -func newAST(kind ASTKind, root AST, children ...AST) AST { - return AST{ - Kind: kind, - Children: append([]AST{root}, children...), - } -} - -func newASTWithRootToken(kind ASTKind, root Token, children ...AST) AST { - return AST{ - Kind: kind, - Root: root, - RootToken: true, - Children: children, - } -} - -// AppendChild will append to the list of children an AST has. -func (a *AST) AppendChild(child AST) { - a.Children = append(a.Children, child) -} - -// GetRoot will return the root AST which can be the first entry -// in the children list or a token. -func (a *AST) GetRoot() AST { - if a.RootToken { - return *a - } - - if len(a.Children) == 0 { - return AST{} - } - - return a.Children[0] -} - -// GetChildren will return the current AST's list of children -func (a *AST) GetChildren() []AST { - if len(a.Children) == 0 { - return []AST{} - } - - if a.RootToken { - return a.Children - } - - return a.Children[1:] -} - -// SetChildren will set and override all children of the AST. -func (a *AST) SetChildren(children []AST) { - if a.RootToken { - a.Children = children - } else { - a.Children = append(a.Children[:1], children...) - } -} - -// Start is used to indicate the starting state of the parse table. -var Start = newAST(ASTKindStart, AST{}) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/comma_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/comma_token.go deleted file mode 100644 index 0895d53cb..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/comma_token.go +++ /dev/null @@ -1,11 +0,0 @@ -package ini - -var commaRunes = []rune(",") - -func isComma(b rune) bool { - return b == ',' -} - -func newCommaToken() Token { - return newToken(TokenComma, commaRunes, NoneType) -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/comment_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/comment_token.go deleted file mode 100644 index 0b76999ba..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/comment_token.go +++ /dev/null @@ -1,35 +0,0 @@ -package ini - -// isComment will return whether or not the next byte(s) is a -// comment. -func isComment(b []rune) bool { - if len(b) == 0 { - return false - } - - switch b[0] { - case ';': - return true - case '#': - return true - } - - return false -} - -// newCommentToken will create a comment token and -// return how many bytes were read. -func newCommentToken(b []rune) (Token, int, error) { - i := 0 - for ; i < len(b); i++ { - if b[i] == '\n' { - break - } - - if len(b)-i > 2 && b[i] == '\r' && b[i+1] == '\n' { - break - } - } - - return newToken(TokenComment, b[:i], NoneType), i, nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/doc.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/doc.go deleted file mode 100644 index 25ce0fe13..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/doc.go +++ /dev/null @@ -1,29 +0,0 @@ -// Package ini is an LL(1) parser for configuration files. -// -// Example: -// sections, err := ini.OpenFile("/path/to/file") -// if err != nil { -// panic(err) -// } -// -// profile := "foo" -// section, ok := sections.GetSection(profile) -// if !ok { -// fmt.Printf("section %q could not be found", profile) -// } -// -// Below is the BNF that describes this parser -// Grammar: -// stmt -> value stmt' -// stmt' -> epsilon | op stmt -// value -> number | string | boolean | quoted_string -// -// section -> [ section' -// section' -> value section_close -// section_close -> ] -// -// SkipState will skip (NL WS)+ -// -// comment -> # comment' | ; comment' -// comment' -> epsilon | value -package ini diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/empty_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/empty_token.go deleted file mode 100644 index 04345a54c..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/empty_token.go +++ /dev/null @@ -1,4 +0,0 @@ -package ini - -// emptyToken is used to satisfy the Token interface -var emptyToken = newToken(TokenNone, []rune{}, NoneType) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/expression.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/expression.go deleted file mode 100644 index 91ba2a59d..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/expression.go +++ /dev/null @@ -1,24 +0,0 @@ -package ini - -// newExpression will return an expression AST. -// Expr represents an expression -// -// grammar: -// expr -> string | number -func newExpression(tok Token) AST { - return newASTWithRootToken(ASTKindExpr, tok) -} - -func newEqualExpr(left AST, tok Token) AST { - return newASTWithRootToken(ASTKindEqualExpr, tok, left) -} - -// EqualExprKey will return a LHS value in the equal expr -func EqualExprKey(ast AST) string { - children := ast.GetChildren() - if len(children) == 0 || ast.Kind != ASTKindEqualExpr { - return "" - } - - return string(children[0].Root.Raw()) -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/fuzz.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/fuzz.go deleted file mode 100644 index 8d462f77e..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/fuzz.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build gofuzz - -package ini - -import ( - "bytes" -) - -func Fuzz(data []byte) int { - b := bytes.NewReader(data) - - if _, err := Parse(b); err != nil { - return 0 - } - - return 1 -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini.go deleted file mode 100644 index 3b0ca7afe..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini.go +++ /dev/null @@ -1,51 +0,0 @@ -package ini - -import ( - "io" - "os" - - "github.com/aws/aws-sdk-go/aws/awserr" -) - -// OpenFile takes a path to a given file, and will open and parse -// that file. -func OpenFile(path string) (Sections, error) { - f, err := os.Open(path) - if err != nil { - return Sections{}, awserr.New(ErrCodeUnableToReadFile, "unable to open file", err) - } - defer f.Close() - - return Parse(f) -} - -// Parse will parse the given file using the shared config -// visitor. -func Parse(f io.Reader) (Sections, error) { - tree, err := ParseAST(f) - if err != nil { - return Sections{}, err - } - - v := NewDefaultVisitor() - if err = Walk(tree, v); err != nil { - return Sections{}, err - } - - return v.Sections, nil -} - -// ParseBytes will parse the given bytes and return the parsed sections. -func ParseBytes(b []byte) (Sections, error) { - tree, err := ParseASTBytes(b) - if err != nil { - return Sections{}, err - } - - v := NewDefaultVisitor() - if err = Walk(tree, v); err != nil { - return Sections{}, err - } - - return v.Sections, nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_lexer.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_lexer.go deleted file mode 100644 index 582c024ad..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_lexer.go +++ /dev/null @@ -1,165 +0,0 @@ -package ini - -import ( - "bytes" - "io" - "io/ioutil" - - "github.com/aws/aws-sdk-go/aws/awserr" -) - -const ( - // ErrCodeUnableToReadFile is used when a file is failed to be - // opened or read from. - ErrCodeUnableToReadFile = "FailedRead" -) - -// TokenType represents the various different tokens types -type TokenType int - -func (t TokenType) String() string { - switch t { - case TokenNone: - return "none" - case TokenLit: - return "literal" - case TokenSep: - return "sep" - case TokenOp: - return "op" - case TokenWS: - return "ws" - case TokenNL: - return "newline" - case TokenComment: - return "comment" - case TokenComma: - return "comma" - default: - return "" - } -} - -// TokenType enums -const ( - TokenNone = TokenType(iota) - TokenLit - TokenSep - TokenComma - TokenOp - TokenWS - TokenNL - TokenComment -) - -type iniLexer struct{} - -// Tokenize will return a list of tokens during lexical analysis of the -// io.Reader. -func (l *iniLexer) Tokenize(r io.Reader) ([]Token, error) { - b, err := ioutil.ReadAll(r) - if err != nil { - return nil, awserr.New(ErrCodeUnableToReadFile, "unable to read file", err) - } - - return l.tokenize(b) -} - -func (l *iniLexer) tokenize(b []byte) ([]Token, error) { - runes := bytes.Runes(b) - var err error - n := 0 - tokenAmount := countTokens(runes) - tokens := make([]Token, tokenAmount) - count := 0 - - for len(runes) > 0 && count < tokenAmount { - switch { - case isWhitespace(runes[0]): - tokens[count], n, err = newWSToken(runes) - case isComma(runes[0]): - tokens[count], n = newCommaToken(), 1 - case isComment(runes): - tokens[count], n, err = newCommentToken(runes) - case isNewline(runes): - tokens[count], n, err = newNewlineToken(runes) - case isSep(runes): - tokens[count], n, err = newSepToken(runes) - case isOp(runes): - tokens[count], n, err = newOpToken(runes) - default: - tokens[count], n, err = newLitToken(runes) - } - - if err != nil { - return nil, err - } - - count++ - - runes = runes[n:] - } - - return tokens[:count], nil -} - -func countTokens(runes []rune) int { - count, n := 0, 0 - var err error - - for len(runes) > 0 { - switch { - case isWhitespace(runes[0]): - _, n, err = newWSToken(runes) - case isComma(runes[0]): - _, n = newCommaToken(), 1 - case isComment(runes): - _, n, err = newCommentToken(runes) - case isNewline(runes): - _, n, err = newNewlineToken(runes) - case isSep(runes): - _, n, err = newSepToken(runes) - case isOp(runes): - _, n, err = newOpToken(runes) - default: - _, n, err = newLitToken(runes) - } - - if err != nil { - return 0 - } - - count++ - runes = runes[n:] - } - - return count + 1 -} - -// Token indicates a metadata about a given value. -type Token struct { - t TokenType - ValueType ValueType - base int - raw []rune -} - -var emptyValue = Value{} - -func newToken(t TokenType, raw []rune, v ValueType) Token { - return Token{ - t: t, - raw: raw, - ValueType: v, - } -} - -// Raw return the raw runes that were consumed -func (tok Token) Raw() []rune { - return tok.raw -} - -// Type returns the token type -func (tok Token) Type() TokenType { - return tok.t -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go deleted file mode 100644 index e56dcee2f..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/ini_parser.go +++ /dev/null @@ -1,349 +0,0 @@ -package ini - -import ( - "fmt" - "io" -) - -// State enums for the parse table -const ( - InvalidState = iota - // stmt -> value stmt' - StatementState - // stmt' -> MarkComplete | op stmt - StatementPrimeState - // value -> number | string | boolean | quoted_string - ValueState - // section -> [ section' - OpenScopeState - // section' -> value section_close - SectionState - // section_close -> ] - CloseScopeState - // SkipState will skip (NL WS)+ - SkipState - // SkipTokenState will skip any token and push the previous - // state onto the stack. - SkipTokenState - // comment -> # comment' | ; comment' - // comment' -> MarkComplete | value - CommentState - // MarkComplete state will complete statements and move that - // to the completed AST list - MarkCompleteState - // TerminalState signifies that the tokens have been fully parsed - TerminalState -) - -// parseTable is a state machine to dictate the grammar above. -var parseTable = map[ASTKind]map[TokenType]int{ - ASTKindStart: map[TokenType]int{ - TokenLit: StatementState, - TokenSep: OpenScopeState, - TokenWS: SkipTokenState, - TokenNL: SkipTokenState, - TokenComment: CommentState, - TokenNone: TerminalState, - }, - ASTKindCommentStatement: map[TokenType]int{ - TokenLit: StatementState, - TokenSep: OpenScopeState, - TokenWS: SkipTokenState, - TokenNL: SkipTokenState, - TokenComment: CommentState, - TokenNone: MarkCompleteState, - }, - ASTKindExpr: map[TokenType]int{ - TokenOp: StatementPrimeState, - TokenLit: ValueState, - TokenSep: OpenScopeState, - TokenWS: ValueState, - TokenNL: SkipState, - TokenComment: CommentState, - TokenNone: MarkCompleteState, - }, - ASTKindEqualExpr: map[TokenType]int{ - TokenLit: ValueState, - TokenWS: SkipTokenState, - TokenNL: SkipState, - }, - ASTKindStatement: map[TokenType]int{ - TokenLit: SectionState, - TokenSep: CloseScopeState, - TokenWS: SkipTokenState, - TokenNL: SkipTokenState, - TokenComment: CommentState, - TokenNone: MarkCompleteState, - }, - ASTKindExprStatement: map[TokenType]int{ - TokenLit: ValueState, - TokenSep: OpenScopeState, - TokenOp: ValueState, - TokenWS: ValueState, - TokenNL: MarkCompleteState, - TokenComment: CommentState, - TokenNone: TerminalState, - TokenComma: SkipState, - }, - ASTKindSectionStatement: map[TokenType]int{ - TokenLit: SectionState, - TokenOp: SectionState, - TokenSep: CloseScopeState, - TokenWS: SectionState, - TokenNL: SkipTokenState, - }, - ASTKindCompletedSectionStatement: map[TokenType]int{ - TokenWS: SkipTokenState, - TokenNL: SkipTokenState, - TokenLit: StatementState, - TokenSep: OpenScopeState, - TokenComment: CommentState, - TokenNone: MarkCompleteState, - }, - ASTKindSkipStatement: map[TokenType]int{ - TokenLit: StatementState, - TokenSep: OpenScopeState, - TokenWS: SkipTokenState, - TokenNL: SkipTokenState, - TokenComment: CommentState, - TokenNone: TerminalState, - }, -} - -// ParseAST will parse input from an io.Reader using -// an LL(1) parser. -func ParseAST(r io.Reader) ([]AST, error) { - lexer := iniLexer{} - tokens, err := lexer.Tokenize(r) - if err != nil { - return []AST{}, err - } - - return parse(tokens) -} - -// ParseASTBytes will parse input from a byte slice using -// an LL(1) parser. -func ParseASTBytes(b []byte) ([]AST, error) { - lexer := iniLexer{} - tokens, err := lexer.tokenize(b) - if err != nil { - return []AST{}, err - } - - return parse(tokens) -} - -func parse(tokens []Token) ([]AST, error) { - start := Start - stack := newParseStack(3, len(tokens)) - - stack.Push(start) - s := newSkipper() - -loop: - for stack.Len() > 0 { - k := stack.Pop() - - var tok Token - if len(tokens) == 0 { - // this occurs when all the tokens have been processed - // but reduction of what's left on the stack needs to - // occur. - tok = emptyToken - } else { - tok = tokens[0] - } - - step := parseTable[k.Kind][tok.Type()] - if s.ShouldSkip(tok) { - // being in a skip state with no tokens will break out of - // the parse loop since there is nothing left to process. - if len(tokens) == 0 { - break loop - } - - step = SkipTokenState - } - - switch step { - case TerminalState: - // Finished parsing. Push what should be the last - // statement to the stack. If there is anything left - // on the stack, an error in parsing has occurred. - if k.Kind != ASTKindStart { - stack.MarkComplete(k) - } - break loop - case SkipTokenState: - // When skipping a token, the previous state was popped off the stack. - // To maintain the correct state, the previous state will be pushed - // onto the stack. - stack.Push(k) - case StatementState: - if k.Kind != ASTKindStart { - stack.MarkComplete(k) - } - expr := newExpression(tok) - stack.Push(expr) - case StatementPrimeState: - if tok.Type() != TokenOp { - stack.MarkComplete(k) - continue - } - - if k.Kind != ASTKindExpr { - return nil, NewParseError( - fmt.Sprintf("invalid expression: expected Expr type, but found %T type", k), - ) - } - - k = trimSpaces(k) - expr := newEqualExpr(k, tok) - stack.Push(expr) - case ValueState: - // ValueState requires the previous state to either be an equal expression - // or an expression statement. - // - // This grammar occurs when the RHS is a number, word, or quoted string. - // equal_expr -> lit op equal_expr' - // equal_expr' -> number | string | quoted_string - // quoted_string -> " quoted_string' - // quoted_string' -> string quoted_string_end - // quoted_string_end -> " - // - // otherwise - // expr_stmt -> equal_expr (expr_stmt')* - // expr_stmt' -> ws S | op S | MarkComplete - // S -> equal_expr' expr_stmt' - switch k.Kind { - case ASTKindEqualExpr: - // assiging a value to some key - k.AppendChild(newExpression(tok)) - stack.Push(newExprStatement(k)) - case ASTKindExpr: - k.Root.raw = append(k.Root.raw, tok.Raw()...) - stack.Push(k) - case ASTKindExprStatement: - root := k.GetRoot() - children := root.GetChildren() - if len(children) == 0 { - return nil, NewParseError( - fmt.Sprintf("invalid expression: AST contains no children %s", k.Kind), - ) - } - - rhs := children[len(children)-1] - - if rhs.Root.ValueType != QuotedStringType { - rhs.Root.ValueType = StringType - rhs.Root.raw = append(rhs.Root.raw, tok.Raw()...) - - } - - children[len(children)-1] = rhs - k.SetChildren(children) - - stack.Push(k) - } - case OpenScopeState: - if !runeCompare(tok.Raw(), openBrace) { - return nil, NewParseError("expected '['") - } - - stmt := newStatement() - stack.Push(stmt) - case CloseScopeState: - if !runeCompare(tok.Raw(), closeBrace) { - return nil, NewParseError("expected ']'") - } - - k = trimSpaces(k) - stack.Push(newCompletedSectionStatement(k)) - case SectionState: - var stmt AST - - switch k.Kind { - case ASTKindStatement: - // If there are multiple literals inside of a scope declaration, - // then the current token's raw value will be appended to the Name. - // - // This handles cases like [ profile default ] - // - // k will represent a SectionStatement with the children representing - // the label of the section - stmt = newSectionStatement(tok) - case ASTKindSectionStatement: - k.Root.raw = append(k.Root.raw, tok.Raw()...) - stmt = k - default: - return nil, NewParseError( - fmt.Sprintf("invalid statement: expected statement: %v", k.Kind), - ) - } - - stack.Push(stmt) - case MarkCompleteState: - if k.Kind != ASTKindStart { - stack.MarkComplete(k) - } - - if stack.Len() == 0 { - stack.Push(start) - } - case SkipState: - stack.Push(newSkipStatement(k)) - s.Skip() - case CommentState: - if k.Kind == ASTKindStart { - stack.Push(k) - } else { - stack.MarkComplete(k) - } - - stmt := newCommentStatement(tok) - stack.Push(stmt) - default: - return nil, NewParseError( - fmt.Sprintf("invalid state with ASTKind %v and TokenType %v", - k, tok.Type())) - } - - if len(tokens) > 0 { - tokens = tokens[1:] - } - } - - // this occurs when a statement has not been completed - if stack.top > 1 { - return nil, NewParseError(fmt.Sprintf("incomplete ini expression")) - } - - // returns a sublist which excludes the start symbol - return stack.List(), nil -} - -// trimSpaces will trim spaces on the left and right hand side of -// the literal. -func trimSpaces(k AST) AST { - // trim left hand side of spaces - for i := 0; i < len(k.Root.raw); i++ { - if !isWhitespace(k.Root.raw[i]) { - break - } - - k.Root.raw = k.Root.raw[1:] - i-- - } - - // trim right hand side of spaces - for i := len(k.Root.raw) - 1; i >= 0; i-- { - if !isWhitespace(k.Root.raw[i]) { - break - } - - k.Root.raw = k.Root.raw[:len(k.Root.raw)-1] - } - - return k -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go deleted file mode 100644 index 24df543d3..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go +++ /dev/null @@ -1,324 +0,0 @@ -package ini - -import ( - "fmt" - "strconv" - "strings" -) - -var ( - runesTrue = []rune("true") - runesFalse = []rune("false") -) - -var literalValues = [][]rune{ - runesTrue, - runesFalse, -} - -func isBoolValue(b []rune) bool { - for _, lv := range literalValues { - if isLitValue(lv, b) { - return true - } - } - return false -} - -func isLitValue(want, have []rune) bool { - if len(have) < len(want) { - return false - } - - for i := 0; i < len(want); i++ { - if want[i] != have[i] { - return false - } - } - - return true -} - -// isNumberValue will return whether not the leading characters in -// a byte slice is a number. A number is delimited by whitespace or -// the newline token. -// -// A number is defined to be in a binary, octal, decimal (int | float), hex format, -// or in scientific notation. -func isNumberValue(b []rune) bool { - negativeIndex := 0 - helper := numberHelper{} - needDigit := false - - for i := 0; i < len(b); i++ { - negativeIndex++ - - switch b[i] { - case '-': - if helper.IsNegative() || negativeIndex != 1 { - return false - } - helper.Determine(b[i]) - needDigit = true - continue - case 'e', 'E': - if err := helper.Determine(b[i]); err != nil { - return false - } - negativeIndex = 0 - needDigit = true - continue - case 'b': - if helper.numberFormat == hex { - break - } - fallthrough - case 'o', 'x': - needDigit = true - if i == 0 { - return false - } - - fallthrough - case '.': - if err := helper.Determine(b[i]); err != nil { - return false - } - needDigit = true - continue - } - - if i > 0 && (isNewline(b[i:]) || isWhitespace(b[i])) { - return !needDigit - } - - if !helper.CorrectByte(b[i]) { - return false - } - needDigit = false - } - - return !needDigit -} - -func isValid(b []rune) (bool, int, error) { - if len(b) == 0 { - // TODO: should probably return an error - return false, 0, nil - } - - return isValidRune(b[0]), 1, nil -} - -func isValidRune(r rune) bool { - return r != ':' && r != '=' && r != '[' && r != ']' && r != ' ' && r != '\n' -} - -// ValueType is an enum that will signify what type -// the Value is -type ValueType int - -func (v ValueType) String() string { - switch v { - case NoneType: - return "NONE" - case DecimalType: - return "FLOAT" - case IntegerType: - return "INT" - case StringType: - return "STRING" - case BoolType: - return "BOOL" - } - - return "" -} - -// ValueType enums -const ( - NoneType = ValueType(iota) - DecimalType - IntegerType - StringType - QuotedStringType - BoolType -) - -// Value is a union container -type Value struct { - Type ValueType - raw []rune - - integer int64 - decimal float64 - boolean bool - str string -} - -func newValue(t ValueType, base int, raw []rune) (Value, error) { - v := Value{ - Type: t, - raw: raw, - } - var err error - - switch t { - case DecimalType: - v.decimal, err = strconv.ParseFloat(string(raw), 64) - case IntegerType: - if base != 10 { - raw = raw[2:] - } - - v.integer, err = strconv.ParseInt(string(raw), base, 64) - case StringType: - v.str = string(raw) - case QuotedStringType: - v.str = string(raw[1 : len(raw)-1]) - case BoolType: - v.boolean = runeCompare(v.raw, runesTrue) - } - - // issue 2253 - // - // if the value trying to be parsed is too large, then we will use - // the 'StringType' and raw value instead. - if nerr, ok := err.(*strconv.NumError); ok && nerr.Err == strconv.ErrRange { - v.Type = StringType - v.str = string(raw) - err = nil - } - - return v, err -} - -// Append will append values and change the type to a string -// type. -func (v *Value) Append(tok Token) { - r := tok.Raw() - if v.Type != QuotedStringType { - v.Type = StringType - r = tok.raw[1 : len(tok.raw)-1] - } - if tok.Type() != TokenLit { - v.raw = append(v.raw, tok.Raw()...) - } else { - v.raw = append(v.raw, r...) - } -} - -func (v Value) String() string { - switch v.Type { - case DecimalType: - return fmt.Sprintf("decimal: %f", v.decimal) - case IntegerType: - return fmt.Sprintf("integer: %d", v.integer) - case StringType: - return fmt.Sprintf("string: %s", string(v.raw)) - case QuotedStringType: - return fmt.Sprintf("quoted string: %s", string(v.raw)) - case BoolType: - return fmt.Sprintf("bool: %t", v.boolean) - default: - return "union not set" - } -} - -func newLitToken(b []rune) (Token, int, error) { - n := 0 - var err error - - token := Token{} - if b[0] == '"' { - n, err = getStringValue(b) - if err != nil { - return token, n, err - } - - token = newToken(TokenLit, b[:n], QuotedStringType) - } else if isNumberValue(b) { - var base int - base, n, err = getNumericalValue(b) - if err != nil { - return token, 0, err - } - - value := b[:n] - vType := IntegerType - if contains(value, '.') || hasExponent(value) { - vType = DecimalType - } - token = newToken(TokenLit, value, vType) - token.base = base - } else if isBoolValue(b) { - n, err = getBoolValue(b) - - token = newToken(TokenLit, b[:n], BoolType) - } else { - n, err = getValue(b) - token = newToken(TokenLit, b[:n], StringType) - } - - return token, n, err -} - -// IntValue returns an integer value -func (v Value) IntValue() int64 { - return v.integer -} - -// FloatValue returns a float value -func (v Value) FloatValue() float64 { - return v.decimal -} - -// BoolValue returns a bool value -func (v Value) BoolValue() bool { - return v.boolean -} - -func isTrimmable(r rune) bool { - switch r { - case '\n', ' ': - return true - } - return false -} - -// StringValue returns the string value -func (v Value) StringValue() string { - switch v.Type { - case StringType: - return strings.TrimFunc(string(v.raw), isTrimmable) - case QuotedStringType: - // preserve all characters in the quotes - return string(removeEscapedCharacters(v.raw[1 : len(v.raw)-1])) - default: - return strings.TrimFunc(string(v.raw), isTrimmable) - } -} - -func contains(runes []rune, c rune) bool { - for i := 0; i < len(runes); i++ { - if runes[i] == c { - return true - } - } - - return false -} - -func runeCompare(v1 []rune, v2 []rune) bool { - if len(v1) != len(v2) { - return false - } - - for i := 0; i < len(v1); i++ { - if v1[i] != v2[i] { - return false - } - } - - return true -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/newline_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/newline_token.go deleted file mode 100644 index e52ac399f..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/newline_token.go +++ /dev/null @@ -1,30 +0,0 @@ -package ini - -func isNewline(b []rune) bool { - if len(b) == 0 { - return false - } - - if b[0] == '\n' { - return true - } - - if len(b) < 2 { - return false - } - - return b[0] == '\r' && b[1] == '\n' -} - -func newNewlineToken(b []rune) (Token, int, error) { - i := 1 - if b[0] == '\r' && isNewline(b[1:]) { - i++ - } - - if !isNewline([]rune(b[:i])) { - return emptyToken, 0, NewParseError("invalid new line token") - } - - return newToken(TokenNL, b[:i], NoneType), i, nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/number_helper.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/number_helper.go deleted file mode 100644 index a45c0bc56..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/number_helper.go +++ /dev/null @@ -1,152 +0,0 @@ -package ini - -import ( - "bytes" - "fmt" - "strconv" -) - -const ( - none = numberFormat(iota) - binary - octal - decimal - hex - exponent -) - -type numberFormat int - -// numberHelper is used to dictate what format a number is in -// and what to do for negative values. Since -1e-4 is a valid -// number, we cannot just simply check for duplicate negatives. -type numberHelper struct { - numberFormat numberFormat - - negative bool - negativeExponent bool -} - -func (b numberHelper) Exists() bool { - return b.numberFormat != none -} - -func (b numberHelper) IsNegative() bool { - return b.negative || b.negativeExponent -} - -func (b *numberHelper) Determine(c rune) error { - if b.Exists() { - return NewParseError(fmt.Sprintf("multiple number formats: 0%v", string(c))) - } - - switch c { - case 'b': - b.numberFormat = binary - case 'o': - b.numberFormat = octal - case 'x': - b.numberFormat = hex - case 'e', 'E': - b.numberFormat = exponent - case '-': - if b.numberFormat != exponent { - b.negative = true - } else { - b.negativeExponent = true - } - case '.': - b.numberFormat = decimal - default: - return NewParseError(fmt.Sprintf("invalid number character: %v", string(c))) - } - - return nil -} - -func (b numberHelper) CorrectByte(c rune) bool { - switch { - case b.numberFormat == binary: - if !isBinaryByte(c) { - return false - } - case b.numberFormat == octal: - if !isOctalByte(c) { - return false - } - case b.numberFormat == hex: - if !isHexByte(c) { - return false - } - case b.numberFormat == decimal: - if !isDigit(c) { - return false - } - case b.numberFormat == exponent: - if !isDigit(c) { - return false - } - case b.negativeExponent: - if !isDigit(c) { - return false - } - case b.negative: - if !isDigit(c) { - return false - } - default: - if !isDigit(c) { - return false - } - } - - return true -} - -func (b numberHelper) Base() int { - switch b.numberFormat { - case binary: - return 2 - case octal: - return 8 - case hex: - return 16 - default: - return 10 - } -} - -func (b numberHelper) String() string { - buf := bytes.Buffer{} - i := 0 - - switch b.numberFormat { - case binary: - i++ - buf.WriteString(strconv.Itoa(i) + ": binary format\n") - case octal: - i++ - buf.WriteString(strconv.Itoa(i) + ": octal format\n") - case hex: - i++ - buf.WriteString(strconv.Itoa(i) + ": hex format\n") - case exponent: - i++ - buf.WriteString(strconv.Itoa(i) + ": exponent format\n") - default: - i++ - buf.WriteString(strconv.Itoa(i) + ": integer format\n") - } - - if b.negative { - i++ - buf.WriteString(strconv.Itoa(i) + ": negative format\n") - } - - if b.negativeExponent { - i++ - buf.WriteString(strconv.Itoa(i) + ": negative exponent format\n") - } - - return buf.String() -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/op_tokens.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/op_tokens.go deleted file mode 100644 index 8a84c7cbe..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/op_tokens.go +++ /dev/null @@ -1,39 +0,0 @@ -package ini - -import ( - "fmt" -) - -var ( - equalOp = []rune("=") - equalColonOp = []rune(":") -) - -func isOp(b []rune) bool { - if len(b) == 0 { - return false - } - - switch b[0] { - case '=': - return true - case ':': - return true - default: - return false - } -} - -func newOpToken(b []rune) (Token, int, error) { - tok := Token{} - - switch b[0] { - case '=': - tok = newToken(TokenOp, equalOp, NoneType) - case ':': - tok = newToken(TokenOp, equalColonOp, NoneType) - default: - return tok, 0, NewParseError(fmt.Sprintf("unexpected op type, %v", b[0])) - } - return tok, 1, nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_error.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_error.go deleted file mode 100644 index 457287019..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_error.go +++ /dev/null @@ -1,43 +0,0 @@ -package ini - -import "fmt" - -const ( - // ErrCodeParseError is returned when a parsing error - // has occurred. - ErrCodeParseError = "INIParseError" -) - -// ParseError is an error which is returned during any part of -// the parsing process. -type ParseError struct { - msg string -} - -// NewParseError will return a new ParseError where message -// is the description of the error. -func NewParseError(message string) *ParseError { - return &ParseError{ - msg: message, - } -} - -// Code will return the ErrCodeParseError -func (err *ParseError) Code() string { - return ErrCodeParseError -} - -// Message returns the error's message -func (err *ParseError) Message() string { - return err.msg -} - -// OrigError return nothing since there will never be any -// original error. -func (err *ParseError) OrigError() error { - return nil -} - -func (err *ParseError) Error() string { - return fmt.Sprintf("%s: %s", err.Code(), err.Message()) -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_stack.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_stack.go deleted file mode 100644 index 7f01cf7c7..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/parse_stack.go +++ /dev/null @@ -1,60 +0,0 @@ -package ini - -import ( - "bytes" - "fmt" -) - -// ParseStack is a stack that contains a container, the stack portion, -// and the list which is the list of ASTs that have been successfully -// parsed. -type ParseStack struct { - top int - container []AST - list []AST - index int -} - -func newParseStack(sizeContainer, sizeList int) ParseStack { - return ParseStack{ - container: make([]AST, sizeContainer), - list: make([]AST, sizeList), - } -} - -// Pop will return and truncate the last container element. -func (s *ParseStack) Pop() AST { - s.top-- - return s.container[s.top] -} - -// Push will add the new AST to the container -func (s *ParseStack) Push(ast AST) { - s.container[s.top] = ast - s.top++ -} - -// MarkComplete will append the AST to the list of completed statements -func (s *ParseStack) MarkComplete(ast AST) { - s.list[s.index] = ast - s.index++ -} - -// List will return the completed statements -func (s ParseStack) List() []AST { - return s.list[:s.index] -} - -// Len will return the length of the container -func (s *ParseStack) Len() int { - return s.top -} - -func (s ParseStack) String() string { - buf := bytes.Buffer{} - for i, node := range s.list { - buf.WriteString(fmt.Sprintf("%d: %v\n", i+1, node)) - } - - return buf.String() -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/sep_tokens.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/sep_tokens.go deleted file mode 100644 index f82095ba2..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/sep_tokens.go +++ /dev/null @@ -1,41 +0,0 @@ -package ini - -import ( - "fmt" -) - -var ( - emptyRunes = []rune{} -) - -func isSep(b []rune) bool { - if len(b) == 0 { - return false - } - - switch b[0] { - case '[', ']': - return true - default: - return false - } -} - -var ( - openBrace = []rune("[") - closeBrace = []rune("]") -) - -func newSepToken(b []rune) (Token, int, error) { - tok := Token{} - - switch b[0] { - case '[': - tok = newToken(TokenSep, openBrace, NoneType) - case ']': - tok = newToken(TokenSep, closeBrace, NoneType) - default: - return tok, 0, NewParseError(fmt.Sprintf("unexpected sep type, %v", b[0])) - } - return tok, 1, nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/skipper.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/skipper.go deleted file mode 100644 index 6bb696447..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/skipper.go +++ /dev/null @@ -1,45 +0,0 @@ -package ini - -// skipper is used to skip certain blocks of an ini file. -// Currently skipper is used to skip nested blocks of ini -// files. See example below -// -// [ foo ] -// nested = ; this section will be skipped -// a=b -// c=d -// bar=baz ; this will be included -type skipper struct { - shouldSkip bool - TokenSet bool - prevTok Token -} - -func newSkipper() skipper { - return skipper{ - prevTok: emptyToken, - } -} - -func (s *skipper) ShouldSkip(tok Token) bool { - if s.shouldSkip && - s.prevTok.Type() == TokenNL && - tok.Type() != TokenWS { - - s.Continue() - return false - } - s.prevTok = tok - - return s.shouldSkip -} - -func (s *skipper) Skip() { - s.shouldSkip = true - s.prevTok = emptyToken -} - -func (s *skipper) Continue() { - s.shouldSkip = false - s.prevTok = emptyToken -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/statement.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/statement.go deleted file mode 100644 index 18f3fe893..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/statement.go +++ /dev/null @@ -1,35 +0,0 @@ -package ini - -// Statement is an empty AST mostly used for transitioning states. -func newStatement() AST { - return newAST(ASTKindStatement, AST{}) -} - -// SectionStatement represents a section AST -func newSectionStatement(tok Token) AST { - return newASTWithRootToken(ASTKindSectionStatement, tok) -} - -// ExprStatement represents a completed expression AST -func newExprStatement(ast AST) AST { - return newAST(ASTKindExprStatement, ast) -} - -// CommentStatement represents a comment in the ini definition. -// -// grammar: -// comment -> #comment' | ;comment' -// comment' -> epsilon | value -func newCommentStatement(tok Token) AST { - return newAST(ASTKindCommentStatement, newExpression(tok)) -} - -// CompletedSectionStatement represents a completed section -func newCompletedSectionStatement(ast AST) AST { - return newAST(ASTKindCompletedSectionStatement, ast) -} - -// SkipStatement is used to skip whole statements -func newSkipStatement(ast AST) AST { - return newAST(ASTKindSkipStatement, ast) -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/value_util.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/value_util.go deleted file mode 100644 index 305999d29..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/value_util.go +++ /dev/null @@ -1,284 +0,0 @@ -package ini - -import ( - "fmt" -) - -// getStringValue will return a quoted string and the amount -// of bytes read -// -// an error will be returned if the string is not properly formatted -func getStringValue(b []rune) (int, error) { - if b[0] != '"' { - return 0, NewParseError("strings must start with '\"'") - } - - endQuote := false - i := 1 - - for ; i < len(b) && !endQuote; i++ { - if escaped := isEscaped(b[:i], b[i]); b[i] == '"' && !escaped { - endQuote = true - break - } else if escaped { - /*c, err := getEscapedByte(b[i]) - if err != nil { - return 0, err - } - - b[i-1] = c - b = append(b[:i], b[i+1:]...) - i--*/ - - continue - } - } - - if !endQuote { - return 0, NewParseError("missing '\"' in string value") - } - - return i + 1, nil -} - -// getBoolValue will return a boolean and the amount -// of bytes read -// -// an error will be returned if the boolean is not of a correct -// value -func getBoolValue(b []rune) (int, error) { - if len(b) < 4 { - return 0, NewParseError("invalid boolean value") - } - - n := 0 - for _, lv := range literalValues { - if len(lv) > len(b) { - continue - } - - if isLitValue(lv, b) { - n = len(lv) - } - } - - if n == 0 { - return 0, NewParseError("invalid boolean value") - } - - return n, nil -} - -// getNumericalValue will return a numerical string, the amount -// of bytes read, and the base of the number -// -// an error will be returned if the number is not of a correct -// value -func getNumericalValue(b []rune) (int, int, error) { - if !isDigit(b[0]) { - return 0, 0, NewParseError("invalid digit value") - } - - i := 0 - helper := numberHelper{} - -loop: - for negativeIndex := 0; i < len(b); i++ { - negativeIndex++ - - if !isDigit(b[i]) { - switch b[i] { - case '-': - if helper.IsNegative() || negativeIndex != 1 { - return 0, 0, NewParseError("parse error '-'") - } - - n := getNegativeNumber(b[i:]) - i += (n - 1) - helper.Determine(b[i]) - continue - case '.': - if err := helper.Determine(b[i]); err != nil { - return 0, 0, err - } - case 'e', 'E': - if err := helper.Determine(b[i]); err != nil { - return 0, 0, err - } - - negativeIndex = 0 - case 'b': - if helper.numberFormat == hex { - break - } - fallthrough - case 'o', 'x': - if i == 0 && b[i] != '0' { - return 0, 0, NewParseError("incorrect base format, expected leading '0'") - } - - if i != 1 { - return 0, 0, NewParseError(fmt.Sprintf("incorrect base format found %s at %d index", string(b[i]), i)) - } - - if err := helper.Determine(b[i]); err != nil { - return 0, 0, err - } - default: - if isWhitespace(b[i]) { - break loop - } - - if isNewline(b[i:]) { - break loop - } - - if !(helper.numberFormat == hex && isHexByte(b[i])) { - if i+2 < len(b) && !isNewline(b[i:i+2]) { - return 0, 0, NewParseError("invalid numerical character") - } else if !isNewline([]rune{b[i]}) { - return 0, 0, NewParseError("invalid numerical character") - } - - break loop - } - } - } - } - - return helper.Base(), i, nil -} - -// isDigit will return whether or not something is an integer -func isDigit(b rune) bool { - return b >= '0' && b <= '9' -} - -func hasExponent(v []rune) bool { - return contains(v, 'e') || contains(v, 'E') -} - -func isBinaryByte(b rune) bool { - switch b { - case '0', '1': - return true - default: - return false - } -} - -func isOctalByte(b rune) bool { - switch b { - case '0', '1', '2', '3', '4', '5', '6', '7': - return true - default: - return false - } -} - -func isHexByte(b rune) bool { - if isDigit(b) { - return true - } - return (b >= 'A' && b <= 'F') || - (b >= 'a' && b <= 'f') -} - -func getValue(b []rune) (int, error) { - i := 0 - - for i < len(b) { - if isNewline(b[i:]) { - break - } - - if isOp(b[i:]) { - break - } - - valid, n, err := isValid(b[i:]) - if err != nil { - return 0, err - } - - if !valid { - break - } - - i += n - } - - return i, nil -} - -// getNegativeNumber will return a negative number from a -// byte slice. This will iterate through all characters until -// a non-digit has been found. -func getNegativeNumber(b []rune) int { - if b[0] != '-' { - return 0 - } - - i := 1 - for ; i < len(b); i++ { - if !isDigit(b[i]) { - return i - } - } - - return i -} - -// isEscaped will return whether or not the character is an escaped -// character. -func isEscaped(value []rune, b rune) bool { - if len(value) == 0 { - return false - } - - switch b { - case '\'': // single quote - case '"': // quote - case 'n': // newline - case 't': // tab - case '\\': // backslash - default: - return false - } - - return value[len(value)-1] == '\\' -} - -func getEscapedByte(b rune) (rune, error) { - switch b { - case '\'': // single quote - return '\'', nil - case '"': // quote - return '"', nil - case 'n': // newline - return '\n', nil - case 't': // table - return '\t', nil - case '\\': // backslash - return '\\', nil - default: - return b, NewParseError(fmt.Sprintf("invalid escaped character %c", b)) - } -} - -func removeEscapedCharacters(b []rune) []rune { - for i := 0; i < len(b); i++ { - if isEscaped(b[:i], b[i]) { - c, err := getEscapedByte(b[i]) - if err != nil { - return b - } - - b[i-1] = c - b = append(b[:i], b[i+1:]...) - i-- - } - } - - return b -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/visitor.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/visitor.go deleted file mode 100644 index 94841c324..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/visitor.go +++ /dev/null @@ -1,166 +0,0 @@ -package ini - -import ( - "fmt" - "sort" -) - -// Visitor is an interface used by walkers that will -// traverse an array of ASTs. -type Visitor interface { - VisitExpr(AST) error - VisitStatement(AST) error -} - -// DefaultVisitor is used to visit statements and expressions -// and ensure that they are both of the correct format. -// In addition, upon visiting this will build sections and populate -// the Sections field which can be used to retrieve profile -// configuration. -type DefaultVisitor struct { - scope string - Sections Sections -} - -// NewDefaultVisitor return a DefaultVisitor -func NewDefaultVisitor() *DefaultVisitor { - return &DefaultVisitor{ - Sections: Sections{ - container: map[string]Section{}, - }, - } -} - -// VisitExpr visits expressions... -func (v *DefaultVisitor) VisitExpr(expr AST) error { - t := v.Sections.container[v.scope] - if t.values == nil { - t.values = values{} - } - - switch expr.Kind { - case ASTKindExprStatement: - opExpr := expr.GetRoot() - switch opExpr.Kind { - case ASTKindEqualExpr: - children := opExpr.GetChildren() - if len(children) <= 1 { - return NewParseError("unexpected token type") - } - - rhs := children[1] - - if rhs.Root.Type() != TokenLit { - return NewParseError("unexpected token type") - } - - key := EqualExprKey(opExpr) - v, err := newValue(rhs.Root.ValueType, rhs.Root.base, rhs.Root.Raw()) - if err != nil { - return err - } - - t.values[key] = v - default: - return NewParseError(fmt.Sprintf("unsupported expression %v", expr)) - } - default: - return NewParseError(fmt.Sprintf("unsupported expression %v", expr)) - } - - v.Sections.container[v.scope] = t - return nil -} - -// VisitStatement visits statements... -func (v *DefaultVisitor) VisitStatement(stmt AST) error { - switch stmt.Kind { - case ASTKindCompletedSectionStatement: - child := stmt.GetRoot() - if child.Kind != ASTKindSectionStatement { - return NewParseError(fmt.Sprintf("unsupported child statement: %T", child)) - } - - name := string(child.Root.Raw()) - v.Sections.container[name] = Section{} - v.scope = name - default: - return NewParseError(fmt.Sprintf("unsupported statement: %s", stmt.Kind)) - } - - return nil -} - -// Sections is a map of Section structures that represent -// a configuration. -type Sections struct { - container map[string]Section -} - -// GetSection will return section p. If section p does not exist, -// false will be returned in the second parameter. -func (t Sections) GetSection(p string) (Section, bool) { - v, ok := t.container[p] - return v, ok -} - -// values represents a map of union values. -type values map[string]Value - -// List will return a list of all sections that were successfully -// parsed. -func (t Sections) List() []string { - keys := make([]string, len(t.container)) - i := 0 - for k := range t.container { - keys[i] = k - i++ - } - - sort.Strings(keys) - return keys -} - -// Section contains a name and values. This represent -// a sectioned entry in a configuration file. -type Section struct { - Name string - values values -} - -// Has will return whether or not an entry exists in a given section -func (t Section) Has(k string) bool { - _, ok := t.values[k] - return ok -} - -// ValueType will returned what type the union is set to. If -// k was not found, the NoneType will be returned. -func (t Section) ValueType(k string) (ValueType, bool) { - v, ok := t.values[k] - return v.Type, ok -} - -// Bool returns a bool value at k -func (t Section) Bool(k string) bool { - return t.values[k].BoolValue() -} - -// Int returns an integer value at k -func (t Section) Int(k string) int64 { - return t.values[k].IntValue() -} - -// Float64 returns a float value at k -func (t Section) Float64(k string) float64 { - return t.values[k].FloatValue() -} - -// String returns the string value at k -func (t Section) String(k string) string { - _, ok := t.values[k] - if !ok { - return "" - } - return t.values[k].StringValue() -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/walker.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/walker.go deleted file mode 100644 index 99915f7f7..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/walker.go +++ /dev/null @@ -1,25 +0,0 @@ -package ini - -// Walk will traverse the AST using the v, the Visitor. -func Walk(tree []AST, v Visitor) error { - for _, node := range tree { - switch node.Kind { - case ASTKindExpr, - ASTKindExprStatement: - - if err := v.VisitExpr(node); err != nil { - return err - } - case ASTKindStatement, - ASTKindCompletedSectionStatement, - ASTKindNestedSectionStatement, - ASTKindCompletedNestedSectionStatement: - - if err := v.VisitStatement(node); err != nil { - return err - } - } - } - - return nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/ini/ws_token.go b/vendor/github.com/aws/aws-sdk-go/internal/ini/ws_token.go deleted file mode 100644 index 7ffb4ae06..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/ini/ws_token.go +++ /dev/null @@ -1,24 +0,0 @@ -package ini - -import ( - "unicode" -) - -// isWhitespace will return whether or not the character is -// a whitespace character. -// -// Whitespace is defined as a space or tab. -func isWhitespace(c rune) bool { - return unicode.IsSpace(c) && c != '\n' && c != '\r' -} - -func newWSToken(b []rune) (Token, int, error) { - i := 0 - for ; i < len(b); i++ { - if !isWhitespace(b[i]) { - break - } - } - - return newToken(TokenWS, b[:i], NoneType), i, nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.6.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.6.go deleted file mode 100644 index 5aa9137e0..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.6.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build !go1.7 - -package sdkio - -// Copy of Go 1.7 io package's Seeker constants. -const ( - SeekStart = 0 // seek relative to the origin of the file - SeekCurrent = 1 // seek relative to the current offset - SeekEnd = 2 // seek relative to the end -) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.7.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.7.go deleted file mode 100644 index e5f005613..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/sdkio/io_go1.7.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build go1.7 - -package sdkio - -import "io" - -// Alias for Go 1.7 io package Seeker constants -const ( - SeekStart = io.SeekStart // seek relative to the origin of the file - SeekCurrent = io.SeekCurrent // seek relative to the current offset - SeekEnd = io.SeekEnd // seek relative to the end -) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor.go deleted file mode 100644 index 44898eed0..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build go1.10 - -package sdkmath - -import "math" - -// Round returns the nearest integer, rounding half away from zero. -// -// Special cases are: -// Round(±0) = ±0 -// Round(±Inf) = ±Inf -// Round(NaN) = NaN -func Round(x float64) float64 { - return math.Round(x) -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor_go1.9.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor_go1.9.go deleted file mode 100644 index 810ec7f08..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/sdkmath/floor_go1.9.go +++ /dev/null @@ -1,56 +0,0 @@ -// +build !go1.10 - -package sdkmath - -import "math" - -// Copied from the Go standard library's (Go 1.12) math/floor.go for use in -// Go version prior to Go 1.10. -const ( - uvone = 0x3FF0000000000000 - mask = 0x7FF - shift = 64 - 11 - 1 - bias = 1023 - signMask = 1 << 63 - fracMask = 1<= 0.5 { - // return t + Copysign(1, x) - // } - // return t - // } - bits := math.Float64bits(x) - e := uint(bits>>shift) & mask - if e < bias { - // Round abs(x) < 1 including denormals. - bits &= signMask // +-0 - if e == bias-1 { - bits |= uvone // +-1 - } - } else if e < bias+shift { - // Round any abs(x) >= 1 containing a fractional component [0,1). - // - // Numbers with larger exponents are returned unchanged since they - // must be either an integer, infinity, or NaN. - const half = 1 << (shift - 1) - e -= bias - bits += half >> e - bits &^= fracMask >> e - } - return math.Float64frombits(bits) -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/locked_source.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/locked_source.go deleted file mode 100644 index 0c9802d87..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/sdkrand/locked_source.go +++ /dev/null @@ -1,29 +0,0 @@ -package sdkrand - -import ( - "math/rand" - "sync" - "time" -) - -// lockedSource is a thread-safe implementation of rand.Source -type lockedSource struct { - lk sync.Mutex - src rand.Source -} - -func (r *lockedSource) Int63() (n int64) { - r.lk.Lock() - n = r.src.Int63() - r.lk.Unlock() - return -} - -func (r *lockedSource) Seed(seed int64) { - r.lk.Lock() - r.src.Seed(seed) - r.lk.Unlock() -} - -// SeededRand is a new RNG using a thread safe implementation of rand.Source -var SeededRand = rand.New(&lockedSource{src: rand.NewSource(time.Now().UnixNano())}) diff --git a/vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go b/vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go deleted file mode 100644 index 38ea61afe..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go +++ /dev/null @@ -1,23 +0,0 @@ -package sdkuri - -import ( - "path" - "strings" -) - -// PathJoin will join the elements of the path delimited by the "/" -// character. Similar to path.Join with the exception the trailing "/" -// character is preserved if present. -func PathJoin(elems ...string) string { - if len(elems) == 0 { - return "" - } - - hasTrailing := strings.HasSuffix(elems[len(elems)-1], "/") - str := path.Join(elems...) - if hasTrailing && str != "/" { - str += "/" - } - - return str -} diff --git a/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/ecs_container.go b/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/ecs_container.go deleted file mode 100644 index 7da8a49ce..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/ecs_container.go +++ /dev/null @@ -1,12 +0,0 @@ -package shareddefaults - -const ( - // ECSCredsProviderEnvVar is an environmental variable key used to - // determine which path needs to be hit. - ECSCredsProviderEnvVar = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -) - -// ECSContainerCredentialsURI is the endpoint to retrieve container -// credentials. This can be overridden to test to ensure the credential process -// is behaving correctly. -var ECSContainerCredentialsURI = "http://169.254.170.2" diff --git a/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/shared_config.go b/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/shared_config.go deleted file mode 100644 index ebcbc2b40..000000000 --- a/vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/shared_config.go +++ /dev/null @@ -1,40 +0,0 @@ -package shareddefaults - -import ( - "os" - "path/filepath" - "runtime" -) - -// SharedCredentialsFilename returns the SDK's default file path -// for the shared credentials file. -// -// Builds the shared config file path based on the OS's platform. -// -// - Linux/Unix: $HOME/.aws/credentials -// - Windows: %USERPROFILE%\.aws\credentials -func SharedCredentialsFilename() string { - return filepath.Join(UserHomeDir(), ".aws", "credentials") -} - -// SharedConfigFilename returns the SDK's default file path for -// the shared config file. -// -// Builds the shared config file path based on the OS's platform. -// -// - Linux/Unix: $HOME/.aws/config -// - Windows: %USERPROFILE%\.aws\config -func SharedConfigFilename() string { - return filepath.Join(UserHomeDir(), ".aws", "config") -} - -// UserHomeDir returns the home directory for the user the process is -// running under. -func UserHomeDir() string { - if runtime.GOOS == "windows" { // Windows - return os.Getenv("USERPROFILE") - } - - // *nix - return os.Getenv("HOME") -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/host.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/host.go deleted file mode 100644 index d7d42db0a..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/host.go +++ /dev/null @@ -1,68 +0,0 @@ -package protocol - -import ( - "strings" - - "github.com/aws/aws-sdk-go/aws/request" -) - -// ValidateEndpointHostHandler is a request handler that will validate the -// request endpoint's hosts is a valid RFC 3986 host. -var ValidateEndpointHostHandler = request.NamedHandler{ - Name: "awssdk.protocol.ValidateEndpointHostHandler", - Fn: func(r *request.Request) { - err := ValidateEndpointHost(r.Operation.Name, r.HTTPRequest.URL.Host) - if err != nil { - r.Error = err - } - }, -} - -// ValidateEndpointHost validates that the host string passed in is a valid RFC -// 3986 host. Returns error if the host is not valid. -func ValidateEndpointHost(opName, host string) error { - paramErrs := request.ErrInvalidParams{Context: opName} - labels := strings.Split(host, ".") - - for i, label := range labels { - if i == len(labels)-1 && len(label) == 0 { - // Allow trailing dot for FQDN hosts. - continue - } - - if !ValidHostLabel(label) { - paramErrs.Add(request.NewErrParamFormat( - "endpoint host label", "[a-zA-Z0-9-]{1,63}", label)) - } - } - - if len(host) > 255 { - paramErrs.Add(request.NewErrParamMaxLen( - "endpoint host", 255, host, - )) - } - - if paramErrs.Len() > 0 { - return paramErrs - } - return nil -} - -// ValidHostLabel returns if the label is a valid RFC 3986 host label. -func ValidHostLabel(label string) bool { - if l := len(label); l == 0 || l > 63 { - return false - } - for _, r := range label { - switch { - case r >= '0' && r <= '9': - case r >= 'A' && r <= 'Z': - case r >= 'a' && r <= 'z': - case r == '-': - default: - return false - } - } - - return true -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/host_prefix.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/host_prefix.go deleted file mode 100644 index 915b0fcaf..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/host_prefix.go +++ /dev/null @@ -1,54 +0,0 @@ -package protocol - -import ( - "strings" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/request" -) - -// HostPrefixHandlerName is the handler name for the host prefix request -// handler. -const HostPrefixHandlerName = "awssdk.endpoint.HostPrefixHandler" - -// NewHostPrefixHandler constructs a build handler -func NewHostPrefixHandler(prefix string, labelsFn func() map[string]string) request.NamedHandler { - builder := HostPrefixBuilder{ - Prefix: prefix, - LabelsFn: labelsFn, - } - - return request.NamedHandler{ - Name: HostPrefixHandlerName, - Fn: builder.Build, - } -} - -// HostPrefixBuilder provides the request handler to expand and prepend -// the host prefix into the operation's request endpoint host. -type HostPrefixBuilder struct { - Prefix string - LabelsFn func() map[string]string -} - -// Build updates the passed in Request with the HostPrefix template expanded. -func (h HostPrefixBuilder) Build(r *request.Request) { - if aws.BoolValue(r.Config.DisableEndpointHostPrefix) { - return - } - - var labels map[string]string - if h.LabelsFn != nil { - labels = h.LabelsFn() - } - - prefix := h.Prefix - for name, value := range labels { - prefix = strings.Replace(prefix, "{"+name+"}", value, -1) - } - - r.HTTPRequest.URL.Host = prefix + r.HTTPRequest.URL.Host - if len(r.HTTPRequest.Host) > 0 { - r.HTTPRequest.Host = prefix + r.HTTPRequest.Host - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/idempotency.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/idempotency.go deleted file mode 100644 index 53831dff9..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/idempotency.go +++ /dev/null @@ -1,75 +0,0 @@ -package protocol - -import ( - "crypto/rand" - "fmt" - "reflect" -) - -// RandReader is the random reader the protocol package will use to read -// random bytes from. This is exported for testing, and should not be used. -var RandReader = rand.Reader - -const idempotencyTokenFillTag = `idempotencyToken` - -// CanSetIdempotencyToken returns true if the struct field should be -// automatically populated with a Idempotency token. -// -// Only *string and string type fields that are tagged with idempotencyToken -// which are not already set can be auto filled. -func CanSetIdempotencyToken(v reflect.Value, f reflect.StructField) bool { - switch u := v.Interface().(type) { - // To auto fill an Idempotency token the field must be a string, - // tagged for auto fill, and have a zero value. - case *string: - return u == nil && len(f.Tag.Get(idempotencyTokenFillTag)) != 0 - case string: - return len(u) == 0 && len(f.Tag.Get(idempotencyTokenFillTag)) != 0 - } - - return false -} - -// GetIdempotencyToken returns a randomly generated idempotency token. -func GetIdempotencyToken() string { - b := make([]byte, 16) - RandReader.Read(b) - - return UUIDVersion4(b) -} - -// SetIdempotencyToken will set the value provided with a Idempotency Token. -// Given that the value can be set. Will panic if value is not setable. -func SetIdempotencyToken(v reflect.Value) { - if v.Kind() == reflect.Ptr { - if v.IsNil() && v.CanSet() { - v.Set(reflect.New(v.Type().Elem())) - } - v = v.Elem() - } - v = reflect.Indirect(v) - - if !v.CanSet() { - panic(fmt.Sprintf("unable to set idempotnecy token %v", v)) - } - - b := make([]byte, 16) - _, err := rand.Read(b) - if err != nil { - // TODO handle error - return - } - - v.Set(reflect.ValueOf(UUIDVersion4(b))) -} - -// UUIDVersion4 returns a Version 4 random UUID from the byte slice provided -func UUIDVersion4(u []byte) string { - // https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29 - // 13th character is "4" - u[6] = (u[6] | 0x40) & 0x4F - // 17th character is "8", "9", "a", or "b" - u[8] = (u[8] | 0x80) & 0xBF - - return fmt.Sprintf(`%X-%X-%X-%X-%X`, u[0:4], u[4:6], u[6:8], u[8:10], u[10:]) -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go deleted file mode 100644 index 864fb6704..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go +++ /dev/null @@ -1,296 +0,0 @@ -// Package jsonutil provides JSON serialization of AWS requests and responses. -package jsonutil - -import ( - "bytes" - "encoding/base64" - "encoding/json" - "fmt" - "math" - "reflect" - "sort" - "strconv" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/private/protocol" -) - -var timeType = reflect.ValueOf(time.Time{}).Type() -var byteSliceType = reflect.ValueOf([]byte{}).Type() - -// BuildJSON builds a JSON string for a given object v. -func BuildJSON(v interface{}) ([]byte, error) { - var buf bytes.Buffer - - err := buildAny(reflect.ValueOf(v), &buf, "") - return buf.Bytes(), err -} - -func buildAny(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error { - origVal := value - value = reflect.Indirect(value) - if !value.IsValid() { - return nil - } - - vtype := value.Type() - - t := tag.Get("type") - if t == "" { - switch vtype.Kind() { - case reflect.Struct: - // also it can't be a time object - if value.Type() != timeType { - t = "structure" - } - case reflect.Slice: - // also it can't be a byte slice - if _, ok := value.Interface().([]byte); !ok { - t = "list" - } - case reflect.Map: - // cannot be a JSONValue map - if _, ok := value.Interface().(aws.JSONValue); !ok { - t = "map" - } - } - } - - switch t { - case "structure": - if field, ok := vtype.FieldByName("_"); ok { - tag = field.Tag - } - return buildStruct(value, buf, tag) - case "list": - return buildList(value, buf, tag) - case "map": - return buildMap(value, buf, tag) - default: - return buildScalar(origVal, buf, tag) - } -} - -func buildStruct(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error { - if !value.IsValid() { - return nil - } - - // unwrap payloads - if payload := tag.Get("payload"); payload != "" { - field, _ := value.Type().FieldByName(payload) - tag = field.Tag - value = elemOf(value.FieldByName(payload)) - - if !value.IsValid() { - return nil - } - } - - buf.WriteByte('{') - - t := value.Type() - first := true - for i := 0; i < t.NumField(); i++ { - member := value.Field(i) - - // This allocates the most memory. - // Additionally, we cannot skip nil fields due to - // idempotency auto filling. - field := t.Field(i) - - if field.PkgPath != "" { - continue // ignore unexported fields - } - if field.Tag.Get("json") == "-" { - continue - } - if field.Tag.Get("location") != "" { - continue // ignore non-body elements - } - if field.Tag.Get("ignore") != "" { - continue - } - - if protocol.CanSetIdempotencyToken(member, field) { - token := protocol.GetIdempotencyToken() - member = reflect.ValueOf(&token) - } - - if (member.Kind() == reflect.Ptr || member.Kind() == reflect.Slice || member.Kind() == reflect.Map) && member.IsNil() { - continue // ignore unset fields - } - - if first { - first = false - } else { - buf.WriteByte(',') - } - - // figure out what this field is called - name := field.Name - if locName := field.Tag.Get("locationName"); locName != "" { - name = locName - } - - writeString(name, buf) - buf.WriteString(`:`) - - err := buildAny(member, buf, field.Tag) - if err != nil { - return err - } - - } - - buf.WriteString("}") - - return nil -} - -func buildList(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error { - buf.WriteString("[") - - for i := 0; i < value.Len(); i++ { - buildAny(value.Index(i), buf, "") - - if i < value.Len()-1 { - buf.WriteString(",") - } - } - - buf.WriteString("]") - - return nil -} - -type sortedValues []reflect.Value - -func (sv sortedValues) Len() int { return len(sv) } -func (sv sortedValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } -func (sv sortedValues) Less(i, j int) bool { return sv[i].String() < sv[j].String() } - -func buildMap(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error { - buf.WriteString("{") - - sv := sortedValues(value.MapKeys()) - sort.Sort(sv) - - for i, k := range sv { - if i > 0 { - buf.WriteByte(',') - } - - writeString(k.String(), buf) - buf.WriteString(`:`) - - buildAny(value.MapIndex(k), buf, "") - } - - buf.WriteString("}") - - return nil -} - -func buildScalar(v reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error { - // prevents allocation on the heap. - scratch := [64]byte{} - switch value := reflect.Indirect(v); value.Kind() { - case reflect.String: - writeString(value.String(), buf) - case reflect.Bool: - if value.Bool() { - buf.WriteString("true") - } else { - buf.WriteString("false") - } - case reflect.Int64: - buf.Write(strconv.AppendInt(scratch[:0], value.Int(), 10)) - case reflect.Float64: - f := value.Float() - if math.IsInf(f, 0) || math.IsNaN(f) { - return &json.UnsupportedValueError{Value: v, Str: strconv.FormatFloat(f, 'f', -1, 64)} - } - buf.Write(strconv.AppendFloat(scratch[:0], f, 'f', -1, 64)) - default: - switch converted := value.Interface().(type) { - case time.Time: - format := tag.Get("timestampFormat") - if len(format) == 0 { - format = protocol.UnixTimeFormatName - } - - ts := protocol.FormatTime(format, converted) - if format != protocol.UnixTimeFormatName { - ts = `"` + ts + `"` - } - - buf.WriteString(ts) - case []byte: - if !value.IsNil() { - buf.WriteByte('"') - if len(converted) < 1024 { - // for small buffers, using Encode directly is much faster. - dst := make([]byte, base64.StdEncoding.EncodedLen(len(converted))) - base64.StdEncoding.Encode(dst, converted) - buf.Write(dst) - } else { - // for large buffers, avoid unnecessary extra temporary - // buffer space. - enc := base64.NewEncoder(base64.StdEncoding, buf) - enc.Write(converted) - enc.Close() - } - buf.WriteByte('"') - } - case aws.JSONValue: - str, err := protocol.EncodeJSONValue(converted, protocol.QuotedEscape) - if err != nil { - return fmt.Errorf("unable to encode JSONValue, %v", err) - } - buf.WriteString(str) - default: - return fmt.Errorf("unsupported JSON value %v (%s)", value.Interface(), value.Type()) - } - } - return nil -} - -var hex = "0123456789abcdef" - -func writeString(s string, buf *bytes.Buffer) { - buf.WriteByte('"') - for i := 0; i < len(s); i++ { - if s[i] == '"' { - buf.WriteString(`\"`) - } else if s[i] == '\\' { - buf.WriteString(`\\`) - } else if s[i] == '\b' { - buf.WriteString(`\b`) - } else if s[i] == '\f' { - buf.WriteString(`\f`) - } else if s[i] == '\r' { - buf.WriteString(`\r`) - } else if s[i] == '\t' { - buf.WriteString(`\t`) - } else if s[i] == '\n' { - buf.WriteString(`\n`) - } else if s[i] < 32 { - buf.WriteString("\\u00") - buf.WriteByte(hex[s[i]>>4]) - buf.WriteByte(hex[s[i]&0xF]) - } else { - buf.WriteByte(s[i]) - } - } - buf.WriteByte('"') -} - -// Returns the reflection element of a value, if it is a pointer. -func elemOf(value reflect.Value) reflect.Value { - for value.Kind() == reflect.Ptr { - value = value.Elem() - } - return value -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go deleted file mode 100644 index ea0da79a5..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go +++ /dev/null @@ -1,250 +0,0 @@ -package jsonutil - -import ( - "bytes" - "encoding/base64" - "encoding/json" - "fmt" - "io" - "reflect" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/private/protocol" -) - -// UnmarshalJSONError unmarshal's the reader's JSON document into the passed in -// type. The value to unmarshal the json document into must be a pointer to the -// type. -func UnmarshalJSONError(v interface{}, stream io.Reader) error { - var errBuf bytes.Buffer - body := io.TeeReader(stream, &errBuf) - - err := json.NewDecoder(body).Decode(v) - if err != nil { - msg := "failed decoding error message" - if err == io.EOF { - msg = "error message missing" - err = nil - } - return awserr.NewUnmarshalError(err, msg, errBuf.Bytes()) - } - - return nil -} - -// UnmarshalJSON reads a stream and unmarshals the results in object v. -func UnmarshalJSON(v interface{}, stream io.Reader) error { - var out interface{} - - err := json.NewDecoder(stream).Decode(&out) - if err == io.EOF { - return nil - } else if err != nil { - return err - } - - return unmarshalAny(reflect.ValueOf(v), out, "") -} - -func unmarshalAny(value reflect.Value, data interface{}, tag reflect.StructTag) error { - vtype := value.Type() - if vtype.Kind() == reflect.Ptr { - vtype = vtype.Elem() // check kind of actual element type - } - - t := tag.Get("type") - if t == "" { - switch vtype.Kind() { - case reflect.Struct: - // also it can't be a time object - if _, ok := value.Interface().(*time.Time); !ok { - t = "structure" - } - case reflect.Slice: - // also it can't be a byte slice - if _, ok := value.Interface().([]byte); !ok { - t = "list" - } - case reflect.Map: - // cannot be a JSONValue map - if _, ok := value.Interface().(aws.JSONValue); !ok { - t = "map" - } - } - } - - switch t { - case "structure": - if field, ok := vtype.FieldByName("_"); ok { - tag = field.Tag - } - return unmarshalStruct(value, data, tag) - case "list": - return unmarshalList(value, data, tag) - case "map": - return unmarshalMap(value, data, tag) - default: - return unmarshalScalar(value, data, tag) - } -} - -func unmarshalStruct(value reflect.Value, data interface{}, tag reflect.StructTag) error { - if data == nil { - return nil - } - mapData, ok := data.(map[string]interface{}) - if !ok { - return fmt.Errorf("JSON value is not a structure (%#v)", data) - } - - t := value.Type() - if value.Kind() == reflect.Ptr { - if value.IsNil() { // create the structure if it's nil - s := reflect.New(value.Type().Elem()) - value.Set(s) - value = s - } - - value = value.Elem() - t = t.Elem() - } - - // unwrap any payloads - if payload := tag.Get("payload"); payload != "" { - field, _ := t.FieldByName(payload) - return unmarshalAny(value.FieldByName(payload), data, field.Tag) - } - - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) - if field.PkgPath != "" { - continue // ignore unexported fields - } - - // figure out what this field is called - name := field.Name - if locName := field.Tag.Get("locationName"); locName != "" { - name = locName - } - - member := value.FieldByIndex(field.Index) - err := unmarshalAny(member, mapData[name], field.Tag) - if err != nil { - return err - } - } - return nil -} - -func unmarshalList(value reflect.Value, data interface{}, tag reflect.StructTag) error { - if data == nil { - return nil - } - listData, ok := data.([]interface{}) - if !ok { - return fmt.Errorf("JSON value is not a list (%#v)", data) - } - - if value.IsNil() { - l := len(listData) - value.Set(reflect.MakeSlice(value.Type(), l, l)) - } - - for i, c := range listData { - err := unmarshalAny(value.Index(i), c, "") - if err != nil { - return err - } - } - - return nil -} - -func unmarshalMap(value reflect.Value, data interface{}, tag reflect.StructTag) error { - if data == nil { - return nil - } - mapData, ok := data.(map[string]interface{}) - if !ok { - return fmt.Errorf("JSON value is not a map (%#v)", data) - } - - if value.IsNil() { - value.Set(reflect.MakeMap(value.Type())) - } - - for k, v := range mapData { - kvalue := reflect.ValueOf(k) - vvalue := reflect.New(value.Type().Elem()).Elem() - - unmarshalAny(vvalue, v, "") - value.SetMapIndex(kvalue, vvalue) - } - - return nil -} - -func unmarshalScalar(value reflect.Value, data interface{}, tag reflect.StructTag) error { - - switch d := data.(type) { - case nil: - return nil // nothing to do here - case string: - switch value.Interface().(type) { - case *string: - value.Set(reflect.ValueOf(&d)) - case []byte: - b, err := base64.StdEncoding.DecodeString(d) - if err != nil { - return err - } - value.Set(reflect.ValueOf(b)) - case *time.Time: - format := tag.Get("timestampFormat") - if len(format) == 0 { - format = protocol.ISO8601TimeFormatName - } - - t, err := protocol.ParseTime(format, d) - if err != nil { - return err - } - value.Set(reflect.ValueOf(&t)) - case aws.JSONValue: - // No need to use escaping as the value is a non-quoted string. - v, err := protocol.DecodeJSONValue(d, protocol.NoEscape) - if err != nil { - return err - } - value.Set(reflect.ValueOf(v)) - default: - return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type()) - } - case float64: - switch value.Interface().(type) { - case *int64: - di := int64(d) - value.Set(reflect.ValueOf(&di)) - case *float64: - value.Set(reflect.ValueOf(&d)) - case *time.Time: - // Time unmarshaled from a float64 can only be epoch seconds - t := time.Unix(int64(d), 0).UTC() - value.Set(reflect.ValueOf(&t)) - default: - return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type()) - } - case bool: - switch value.Interface().(type) { - case *bool: - value.Set(reflect.ValueOf(&d)) - default: - return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type()) - } - default: - return fmt.Errorf("unsupported JSON value (%v)", data) - } - return nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonvalue.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonvalue.go deleted file mode 100644 index 776d11018..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/jsonvalue.go +++ /dev/null @@ -1,76 +0,0 @@ -package protocol - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "strconv" - - "github.com/aws/aws-sdk-go/aws" -) - -// EscapeMode is the mode that should be use for escaping a value -type EscapeMode uint - -// The modes for escaping a value before it is marshaled, and unmarshaled. -const ( - NoEscape EscapeMode = iota - Base64Escape - QuotedEscape -) - -// EncodeJSONValue marshals the value into a JSON string, and optionally base64 -// encodes the string before returning it. -// -// Will panic if the escape mode is unknown. -func EncodeJSONValue(v aws.JSONValue, escape EscapeMode) (string, error) { - b, err := json.Marshal(v) - if err != nil { - return "", err - } - - switch escape { - case NoEscape: - return string(b), nil - case Base64Escape: - return base64.StdEncoding.EncodeToString(b), nil - case QuotedEscape: - return strconv.Quote(string(b)), nil - } - - panic(fmt.Sprintf("EncodeJSONValue called with unknown EscapeMode, %v", escape)) -} - -// DecodeJSONValue will attempt to decode the string input as a JSONValue. -// Optionally decoding base64 the value first before JSON unmarshaling. -// -// Will panic if the escape mode is unknown. -func DecodeJSONValue(v string, escape EscapeMode) (aws.JSONValue, error) { - var b []byte - var err error - - switch escape { - case NoEscape: - b = []byte(v) - case Base64Escape: - b, err = base64.StdEncoding.DecodeString(v) - case QuotedEscape: - var u string - u, err = strconv.Unquote(v) - b = []byte(u) - default: - panic(fmt.Sprintf("DecodeJSONValue called with unknown EscapeMode, %v", escape)) - } - - if err != nil { - return nil, err - } - - m := aws.JSONValue{} - err = json.Unmarshal(b, &m) - if err != nil { - return nil, err - } - - return m, nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/payload.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/payload.go deleted file mode 100644 index e21614a12..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/payload.go +++ /dev/null @@ -1,81 +0,0 @@ -package protocol - -import ( - "io" - "io/ioutil" - "net/http" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/client/metadata" - "github.com/aws/aws-sdk-go/aws/request" -) - -// PayloadUnmarshaler provides the interface for unmarshaling a payload's -// reader into a SDK shape. -type PayloadUnmarshaler interface { - UnmarshalPayload(io.Reader, interface{}) error -} - -// HandlerPayloadUnmarshal implements the PayloadUnmarshaler from a -// HandlerList. This provides the support for unmarshaling a payload reader to -// a shape without needing a SDK request first. -type HandlerPayloadUnmarshal struct { - Unmarshalers request.HandlerList -} - -// UnmarshalPayload unmarshals the io.Reader payload into the SDK shape using -// the Unmarshalers HandlerList provided. Returns an error if unable -// unmarshaling fails. -func (h HandlerPayloadUnmarshal) UnmarshalPayload(r io.Reader, v interface{}) error { - req := &request.Request{ - HTTPRequest: &http.Request{}, - HTTPResponse: &http.Response{ - StatusCode: 200, - Header: http.Header{}, - Body: ioutil.NopCloser(r), - }, - Data: v, - } - - h.Unmarshalers.Run(req) - - return req.Error -} - -// PayloadMarshaler provides the interface for marshaling a SDK shape into and -// io.Writer. -type PayloadMarshaler interface { - MarshalPayload(io.Writer, interface{}) error -} - -// HandlerPayloadMarshal implements the PayloadMarshaler from a HandlerList. -// This provides support for marshaling a SDK shape into an io.Writer without -// needing a SDK request first. -type HandlerPayloadMarshal struct { - Marshalers request.HandlerList -} - -// MarshalPayload marshals the SDK shape into the io.Writer using the -// Marshalers HandlerList provided. Returns an error if unable if marshal -// fails. -func (h HandlerPayloadMarshal) MarshalPayload(w io.Writer, v interface{}) error { - req := request.New( - aws.Config{}, - metadata.ClientInfo{}, - request.Handlers{}, - nil, - &request.Operation{HTTPMethod: "GET"}, - v, - nil, - ) - - h.Marshalers.Run(req) - - if req.Error != nil { - return req.Error - } - - io.Copy(w, req.GetBody()) - - return nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go deleted file mode 100644 index 0cb99eb57..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go +++ /dev/null @@ -1,36 +0,0 @@ -// Package query provides serialization of AWS query requests, and responses. -package query - -//go:generate go run -tags codegen ../../../models/protocol_tests/generate.go ../../../models/protocol_tests/input/query.json build_test.go - -import ( - "net/url" - - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/private/protocol/query/queryutil" -) - -// BuildHandler is a named request handler for building query protocol requests -var BuildHandler = request.NamedHandler{Name: "awssdk.query.Build", Fn: Build} - -// Build builds a request for an AWS Query service. -func Build(r *request.Request) { - body := url.Values{ - "Action": {r.Operation.Name}, - "Version": {r.ClientInfo.APIVersion}, - } - if err := queryutil.Parse(body, r.Params, false); err != nil { - r.Error = awserr.New(request.ErrCodeSerialization, "failed encoding Query request", err) - return - } - - if !r.IsPresigned() { - r.HTTPRequest.Method = "POST" - r.HTTPRequest.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=utf-8") - r.SetBufferBody([]byte(body.Encode())) - } else { // This is a pre-signed request - r.HTTPRequest.Method = "GET" - r.HTTPRequest.URL.RawQuery = body.Encode() - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go deleted file mode 100644 index 75866d012..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go +++ /dev/null @@ -1,246 +0,0 @@ -package queryutil - -import ( - "encoding/base64" - "fmt" - "net/url" - "reflect" - "sort" - "strconv" - "strings" - "time" - - "github.com/aws/aws-sdk-go/private/protocol" -) - -// Parse parses an object i and fills a url.Values object. The isEC2 flag -// indicates if this is the EC2 Query sub-protocol. -func Parse(body url.Values, i interface{}, isEC2 bool) error { - q := queryParser{isEC2: isEC2} - return q.parseValue(body, reflect.ValueOf(i), "", "") -} - -func elemOf(value reflect.Value) reflect.Value { - for value.Kind() == reflect.Ptr { - value = value.Elem() - } - return value -} - -type queryParser struct { - isEC2 bool -} - -func (q *queryParser) parseValue(v url.Values, value reflect.Value, prefix string, tag reflect.StructTag) error { - value = elemOf(value) - - // no need to handle zero values - if !value.IsValid() { - return nil - } - - t := tag.Get("type") - if t == "" { - switch value.Kind() { - case reflect.Struct: - t = "structure" - case reflect.Slice: - t = "list" - case reflect.Map: - t = "map" - } - } - - switch t { - case "structure": - return q.parseStruct(v, value, prefix) - case "list": - return q.parseList(v, value, prefix, tag) - case "map": - return q.parseMap(v, value, prefix, tag) - default: - return q.parseScalar(v, value, prefix, tag) - } -} - -func (q *queryParser) parseStruct(v url.Values, value reflect.Value, prefix string) error { - if !value.IsValid() { - return nil - } - - t := value.Type() - for i := 0; i < value.NumField(); i++ { - elemValue := elemOf(value.Field(i)) - field := t.Field(i) - - if field.PkgPath != "" { - continue // ignore unexported fields - } - if field.Tag.Get("ignore") != "" { - continue - } - - if protocol.CanSetIdempotencyToken(value.Field(i), field) { - token := protocol.GetIdempotencyToken() - elemValue = reflect.ValueOf(token) - } - - var name string - if q.isEC2 { - name = field.Tag.Get("queryName") - } - if name == "" { - if field.Tag.Get("flattened") != "" && field.Tag.Get("locationNameList") != "" { - name = field.Tag.Get("locationNameList") - } else if locName := field.Tag.Get("locationName"); locName != "" { - name = locName - } - if name != "" && q.isEC2 { - name = strings.ToUpper(name[0:1]) + name[1:] - } - } - if name == "" { - name = field.Name - } - - if prefix != "" { - name = prefix + "." + name - } - - if err := q.parseValue(v, elemValue, name, field.Tag); err != nil { - return err - } - } - return nil -} - -func (q *queryParser) parseList(v url.Values, value reflect.Value, prefix string, tag reflect.StructTag) error { - // If it's empty, generate an empty value - if !value.IsNil() && value.Len() == 0 { - v.Set(prefix, "") - return nil - } - - if _, ok := value.Interface().([]byte); ok { - return q.parseScalar(v, value, prefix, tag) - } - - // check for unflattened list member - if !q.isEC2 && tag.Get("flattened") == "" { - if listName := tag.Get("locationNameList"); listName == "" { - prefix += ".member" - } else { - prefix += "." + listName - } - } - - for i := 0; i < value.Len(); i++ { - slicePrefix := prefix - if slicePrefix == "" { - slicePrefix = strconv.Itoa(i + 1) - } else { - slicePrefix = slicePrefix + "." + strconv.Itoa(i+1) - } - if err := q.parseValue(v, value.Index(i), slicePrefix, ""); err != nil { - return err - } - } - return nil -} - -func (q *queryParser) parseMap(v url.Values, value reflect.Value, prefix string, tag reflect.StructTag) error { - // If it's empty, generate an empty value - if !value.IsNil() && value.Len() == 0 { - v.Set(prefix, "") - return nil - } - - // check for unflattened list member - if !q.isEC2 && tag.Get("flattened") == "" { - prefix += ".entry" - } - - // sort keys for improved serialization consistency. - // this is not strictly necessary for protocol support. - mapKeyValues := value.MapKeys() - mapKeys := map[string]reflect.Value{} - mapKeyNames := make([]string, len(mapKeyValues)) - for i, mapKey := range mapKeyValues { - name := mapKey.String() - mapKeys[name] = mapKey - mapKeyNames[i] = name - } - sort.Strings(mapKeyNames) - - for i, mapKeyName := range mapKeyNames { - mapKey := mapKeys[mapKeyName] - mapValue := value.MapIndex(mapKey) - - kname := tag.Get("locationNameKey") - if kname == "" { - kname = "key" - } - vname := tag.Get("locationNameValue") - if vname == "" { - vname = "value" - } - - // serialize key - var keyName string - if prefix == "" { - keyName = strconv.Itoa(i+1) + "." + kname - } else { - keyName = prefix + "." + strconv.Itoa(i+1) + "." + kname - } - - if err := q.parseValue(v, mapKey, keyName, ""); err != nil { - return err - } - - // serialize value - var valueName string - if prefix == "" { - valueName = strconv.Itoa(i+1) + "." + vname - } else { - valueName = prefix + "." + strconv.Itoa(i+1) + "." + vname - } - - if err := q.parseValue(v, mapValue, valueName, ""); err != nil { - return err - } - } - - return nil -} - -func (q *queryParser) parseScalar(v url.Values, r reflect.Value, name string, tag reflect.StructTag) error { - switch value := r.Interface().(type) { - case string: - v.Set(name, value) - case []byte: - if !r.IsNil() { - v.Set(name, base64.StdEncoding.EncodeToString(value)) - } - case bool: - v.Set(name, strconv.FormatBool(value)) - case int64: - v.Set(name, strconv.FormatInt(value, 10)) - case int: - v.Set(name, strconv.Itoa(value)) - case float64: - v.Set(name, strconv.FormatFloat(value, 'f', -1, 64)) - case float32: - v.Set(name, strconv.FormatFloat(float64(value), 'f', -1, 32)) - case time.Time: - const ISO8601UTC = "2006-01-02T15:04:05Z" - format := tag.Get("timestampFormat") - if len(format) == 0 { - format = protocol.ISO8601TimeFormatName - } - - v.Set(name, protocol.FormatTime(format, value)) - default: - return fmt.Errorf("unsupported value for param %s: %v (%s)", name, r.Interface(), r.Type().Name()) - } - return nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go deleted file mode 100644 index f69c1efc9..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go +++ /dev/null @@ -1,39 +0,0 @@ -package query - -//go:generate go run -tags codegen ../../../models/protocol_tests/generate.go ../../../models/protocol_tests/output/query.json unmarshal_test.go - -import ( - "encoding/xml" - - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil" -) - -// UnmarshalHandler is a named request handler for unmarshaling query protocol requests -var UnmarshalHandler = request.NamedHandler{Name: "awssdk.query.Unmarshal", Fn: Unmarshal} - -// UnmarshalMetaHandler is a named request handler for unmarshaling query protocol request metadata -var UnmarshalMetaHandler = request.NamedHandler{Name: "awssdk.query.UnmarshalMeta", Fn: UnmarshalMeta} - -// Unmarshal unmarshals a response for an AWS Query service. -func Unmarshal(r *request.Request) { - defer r.HTTPResponse.Body.Close() - if r.DataFilled() { - decoder := xml.NewDecoder(r.HTTPResponse.Body) - err := xmlutil.UnmarshalXML(r.Data, decoder, r.Operation.Name+"Result") - if err != nil { - r.Error = awserr.NewRequestFailure( - awserr.New(request.ErrCodeSerialization, "failed decoding Query response", err), - r.HTTPResponse.StatusCode, - r.RequestID, - ) - return - } - } -} - -// UnmarshalMeta unmarshals header response values for an AWS Query service. -func UnmarshalMeta(r *request.Request) { - r.RequestID = r.HTTPResponse.Header.Get("X-Amzn-Requestid") -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go deleted file mode 100644 index 831b0110c..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go +++ /dev/null @@ -1,69 +0,0 @@ -package query - -import ( - "encoding/xml" - "fmt" - - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil" -) - -// UnmarshalErrorHandler is a name request handler to unmarshal request errors -var UnmarshalErrorHandler = request.NamedHandler{Name: "awssdk.query.UnmarshalError", Fn: UnmarshalError} - -type xmlErrorResponse struct { - Code string `xml:"Error>Code"` - Message string `xml:"Error>Message"` - RequestID string `xml:"RequestId"` -} - -type xmlResponseError struct { - xmlErrorResponse -} - -func (e *xmlResponseError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - const svcUnavailableTagName = "ServiceUnavailableException" - const errorResponseTagName = "ErrorResponse" - - switch start.Name.Local { - case svcUnavailableTagName: - e.Code = svcUnavailableTagName - e.Message = "service is unavailable" - return d.Skip() - - case errorResponseTagName: - return d.DecodeElement(&e.xmlErrorResponse, &start) - - default: - return fmt.Errorf("unknown error response tag, %v", start) - } -} - -// UnmarshalError unmarshals an error response for an AWS Query service. -func UnmarshalError(r *request.Request) { - defer r.HTTPResponse.Body.Close() - - var respErr xmlResponseError - err := xmlutil.UnmarshalXMLError(&respErr, r.HTTPResponse.Body) - if err != nil { - r.Error = awserr.NewRequestFailure( - awserr.New(request.ErrCodeSerialization, - "failed to unmarshal error message", err), - r.HTTPResponse.StatusCode, - r.RequestID, - ) - return - } - - reqID := respErr.RequestID - if len(reqID) == 0 { - reqID = r.RequestID - } - - r.Error = awserr.NewRequestFailure( - awserr.New(respErr.Code, respErr.Message, nil), - r.HTTPResponse.StatusCode, - reqID, - ) -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go deleted file mode 100644 index 1301b149d..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go +++ /dev/null @@ -1,310 +0,0 @@ -// Package rest provides RESTful serialization of AWS requests and responses. -package rest - -import ( - "bytes" - "encoding/base64" - "fmt" - "io" - "net/http" - "net/url" - "path" - "reflect" - "strconv" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/private/protocol" -) - -// Whether the byte value can be sent without escaping in AWS URLs -var noEscape [256]bool - -var errValueNotSet = fmt.Errorf("value not set") - -var byteSliceType = reflect.TypeOf([]byte{}) - -func init() { - for i := 0; i < len(noEscape); i++ { - // AWS expects every character except these to be escaped - noEscape[i] = (i >= 'A' && i <= 'Z') || - (i >= 'a' && i <= 'z') || - (i >= '0' && i <= '9') || - i == '-' || - i == '.' || - i == '_' || - i == '~' - } -} - -// BuildHandler is a named request handler for building rest protocol requests -var BuildHandler = request.NamedHandler{Name: "awssdk.rest.Build", Fn: Build} - -// Build builds the REST component of a service request. -func Build(r *request.Request) { - if r.ParamsFilled() { - v := reflect.ValueOf(r.Params).Elem() - buildLocationElements(r, v, false) - buildBody(r, v) - } -} - -// BuildAsGET builds the REST component of a service request with the ability to hoist -// data from the body. -func BuildAsGET(r *request.Request) { - if r.ParamsFilled() { - v := reflect.ValueOf(r.Params).Elem() - buildLocationElements(r, v, true) - buildBody(r, v) - } -} - -func buildLocationElements(r *request.Request, v reflect.Value, buildGETQuery bool) { - query := r.HTTPRequest.URL.Query() - - // Setup the raw path to match the base path pattern. This is needed - // so that when the path is mutated a custom escaped version can be - // stored in RawPath that will be used by the Go client. - r.HTTPRequest.URL.RawPath = r.HTTPRequest.URL.Path - - for i := 0; i < v.NumField(); i++ { - m := v.Field(i) - if n := v.Type().Field(i).Name; n[0:1] == strings.ToLower(n[0:1]) { - continue - } - - if m.IsValid() { - field := v.Type().Field(i) - name := field.Tag.Get("locationName") - if name == "" { - name = field.Name - } - if kind := m.Kind(); kind == reflect.Ptr { - m = m.Elem() - } else if kind == reflect.Interface { - if !m.Elem().IsValid() { - continue - } - } - if !m.IsValid() { - continue - } - if field.Tag.Get("ignore") != "" { - continue - } - - // Support the ability to customize values to be marshaled as a - // blob even though they were modeled as a string. Required for S3 - // API operations like SSECustomerKey is modeled as stirng but - // required to be base64 encoded in request. - if field.Tag.Get("marshal-as") == "blob" { - m = m.Convert(byteSliceType) - } - - var err error - switch field.Tag.Get("location") { - case "headers": // header maps - err = buildHeaderMap(&r.HTTPRequest.Header, m, field.Tag) - case "header": - err = buildHeader(&r.HTTPRequest.Header, m, name, field.Tag) - case "uri": - err = buildURI(r.HTTPRequest.URL, m, name, field.Tag) - case "querystring": - err = buildQueryString(query, m, name, field.Tag) - default: - if buildGETQuery { - err = buildQueryString(query, m, name, field.Tag) - } - } - r.Error = err - } - if r.Error != nil { - return - } - } - - r.HTTPRequest.URL.RawQuery = query.Encode() - if !aws.BoolValue(r.Config.DisableRestProtocolURICleaning) { - cleanPath(r.HTTPRequest.URL) - } -} - -func buildBody(r *request.Request, v reflect.Value) { - if field, ok := v.Type().FieldByName("_"); ok { - if payloadName := field.Tag.Get("payload"); payloadName != "" { - pfield, _ := v.Type().FieldByName(payloadName) - if ptag := pfield.Tag.Get("type"); ptag != "" && ptag != "structure" { - payload := reflect.Indirect(v.FieldByName(payloadName)) - if payload.IsValid() && payload.Interface() != nil { - switch reader := payload.Interface().(type) { - case io.ReadSeeker: - r.SetReaderBody(reader) - case []byte: - r.SetBufferBody(reader) - case string: - r.SetStringBody(reader) - default: - r.Error = awserr.New(request.ErrCodeSerialization, - "failed to encode REST request", - fmt.Errorf("unknown payload type %s", payload.Type())) - } - } - } - } - } -} - -func buildHeader(header *http.Header, v reflect.Value, name string, tag reflect.StructTag) error { - str, err := convertType(v, tag) - if err == errValueNotSet { - return nil - } else if err != nil { - return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) - } - - name = strings.TrimSpace(name) - str = strings.TrimSpace(str) - - header.Add(name, str) - - return nil -} - -func buildHeaderMap(header *http.Header, v reflect.Value, tag reflect.StructTag) error { - prefix := tag.Get("locationName") - for _, key := range v.MapKeys() { - str, err := convertType(v.MapIndex(key), tag) - if err == errValueNotSet { - continue - } else if err != nil { - return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) - - } - keyStr := strings.TrimSpace(key.String()) - str = strings.TrimSpace(str) - - header.Add(prefix+keyStr, str) - } - return nil -} - -func buildURI(u *url.URL, v reflect.Value, name string, tag reflect.StructTag) error { - value, err := convertType(v, tag) - if err == errValueNotSet { - return nil - } else if err != nil { - return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) - } - - u.Path = strings.Replace(u.Path, "{"+name+"}", value, -1) - u.Path = strings.Replace(u.Path, "{"+name+"+}", value, -1) - - u.RawPath = strings.Replace(u.RawPath, "{"+name+"}", EscapePath(value, true), -1) - u.RawPath = strings.Replace(u.RawPath, "{"+name+"+}", EscapePath(value, false), -1) - - return nil -} - -func buildQueryString(query url.Values, v reflect.Value, name string, tag reflect.StructTag) error { - switch value := v.Interface().(type) { - case []*string: - for _, item := range value { - query.Add(name, *item) - } - case map[string]*string: - for key, item := range value { - query.Add(key, *item) - } - case map[string][]*string: - for key, items := range value { - for _, item := range items { - query.Add(key, *item) - } - } - default: - str, err := convertType(v, tag) - if err == errValueNotSet { - return nil - } else if err != nil { - return awserr.New(request.ErrCodeSerialization, "failed to encode REST request", err) - } - query.Set(name, str) - } - - return nil -} - -func cleanPath(u *url.URL) { - hasSlash := strings.HasSuffix(u.Path, "/") - - // clean up path, removing duplicate `/` - u.Path = path.Clean(u.Path) - u.RawPath = path.Clean(u.RawPath) - - if hasSlash && !strings.HasSuffix(u.Path, "/") { - u.Path += "/" - u.RawPath += "/" - } -} - -// EscapePath escapes part of a URL path in Amazon style -func EscapePath(path string, encodeSep bool) string { - var buf bytes.Buffer - for i := 0; i < len(path); i++ { - c := path[i] - if noEscape[c] || (c == '/' && !encodeSep) { - buf.WriteByte(c) - } else { - fmt.Fprintf(&buf, "%%%02X", c) - } - } - return buf.String() -} - -func convertType(v reflect.Value, tag reflect.StructTag) (str string, err error) { - v = reflect.Indirect(v) - if !v.IsValid() { - return "", errValueNotSet - } - - switch value := v.Interface().(type) { - case string: - str = value - case []byte: - str = base64.StdEncoding.EncodeToString(value) - case bool: - str = strconv.FormatBool(value) - case int64: - str = strconv.FormatInt(value, 10) - case float64: - str = strconv.FormatFloat(value, 'f', -1, 64) - case time.Time: - format := tag.Get("timestampFormat") - if len(format) == 0 { - format = protocol.RFC822TimeFormatName - if tag.Get("location") == "querystring" { - format = protocol.ISO8601TimeFormatName - } - } - str = protocol.FormatTime(format, value) - case aws.JSONValue: - if len(value) == 0 { - return "", errValueNotSet - } - escaping := protocol.NoEscape - if tag.Get("location") == "header" { - escaping = protocol.Base64Escape - } - str, err = protocol.EncodeJSONValue(value, escaping) - if err != nil { - return "", fmt.Errorf("unable to encode JSONValue, %v", err) - } - default: - err := fmt.Errorf("unsupported value for param %v (%s)", v.Interface(), v.Type()) - return "", err - } - return str, nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/payload.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/payload.go deleted file mode 100644 index 4366de2e1..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/payload.go +++ /dev/null @@ -1,45 +0,0 @@ -package rest - -import "reflect" - -// PayloadMember returns the payload field member of i if there is one, or nil. -func PayloadMember(i interface{}) interface{} { - if i == nil { - return nil - } - - v := reflect.ValueOf(i).Elem() - if !v.IsValid() { - return nil - } - if field, ok := v.Type().FieldByName("_"); ok { - if payloadName := field.Tag.Get("payload"); payloadName != "" { - field, _ := v.Type().FieldByName(payloadName) - if field.Tag.Get("type") != "structure" { - return nil - } - - payload := v.FieldByName(payloadName) - if payload.IsValid() || (payload.Kind() == reflect.Ptr && !payload.IsNil()) { - return payload.Interface() - } - } - } - return nil -} - -// PayloadType returns the type of a payload field member of i if there is one, or "". -func PayloadType(i interface{}) string { - v := reflect.Indirect(reflect.ValueOf(i)) - if !v.IsValid() { - return "" - } - if field, ok := v.Type().FieldByName("_"); ok { - if payloadName := field.Tag.Get("payload"); payloadName != "" { - if member, ok := v.Type().FieldByName(payloadName); ok { - return member.Tag.Get("type") - } - } - } - return "" -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go deleted file mode 100644 index 74e361e07..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go +++ /dev/null @@ -1,237 +0,0 @@ -package rest - -import ( - "bytes" - "encoding/base64" - "fmt" - "io" - "io/ioutil" - "net/http" - "reflect" - "strconv" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/private/protocol" -) - -// UnmarshalHandler is a named request handler for unmarshaling rest protocol requests -var UnmarshalHandler = request.NamedHandler{Name: "awssdk.rest.Unmarshal", Fn: Unmarshal} - -// UnmarshalMetaHandler is a named request handler for unmarshaling rest protocol request metadata -var UnmarshalMetaHandler = request.NamedHandler{Name: "awssdk.rest.UnmarshalMeta", Fn: UnmarshalMeta} - -// Unmarshal unmarshals the REST component of a response in a REST service. -func Unmarshal(r *request.Request) { - if r.DataFilled() { - v := reflect.Indirect(reflect.ValueOf(r.Data)) - unmarshalBody(r, v) - } -} - -// UnmarshalMeta unmarshals the REST metadata of a response in a REST service -func UnmarshalMeta(r *request.Request) { - r.RequestID = r.HTTPResponse.Header.Get("X-Amzn-Requestid") - if r.RequestID == "" { - // Alternative version of request id in the header - r.RequestID = r.HTTPResponse.Header.Get("X-Amz-Request-Id") - } - if r.DataFilled() { - v := reflect.Indirect(reflect.ValueOf(r.Data)) - unmarshalLocationElements(r, v) - } -} - -func unmarshalBody(r *request.Request, v reflect.Value) { - if field, ok := v.Type().FieldByName("_"); ok { - if payloadName := field.Tag.Get("payload"); payloadName != "" { - pfield, _ := v.Type().FieldByName(payloadName) - if ptag := pfield.Tag.Get("type"); ptag != "" && ptag != "structure" { - payload := v.FieldByName(payloadName) - if payload.IsValid() { - switch payload.Interface().(type) { - case []byte: - defer r.HTTPResponse.Body.Close() - b, err := ioutil.ReadAll(r.HTTPResponse.Body) - if err != nil { - r.Error = awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) - } else { - payload.Set(reflect.ValueOf(b)) - } - case *string: - defer r.HTTPResponse.Body.Close() - b, err := ioutil.ReadAll(r.HTTPResponse.Body) - if err != nil { - r.Error = awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) - } else { - str := string(b) - payload.Set(reflect.ValueOf(&str)) - } - default: - switch payload.Type().String() { - case "io.ReadCloser": - payload.Set(reflect.ValueOf(r.HTTPResponse.Body)) - case "io.ReadSeeker": - b, err := ioutil.ReadAll(r.HTTPResponse.Body) - if err != nil { - r.Error = awserr.New(request.ErrCodeSerialization, - "failed to read response body", err) - return - } - payload.Set(reflect.ValueOf(ioutil.NopCloser(bytes.NewReader(b)))) - default: - io.Copy(ioutil.Discard, r.HTTPResponse.Body) - defer r.HTTPResponse.Body.Close() - r.Error = awserr.New(request.ErrCodeSerialization, - "failed to decode REST response", - fmt.Errorf("unknown payload type %s", payload.Type())) - } - } - } - } - } - } -} - -func unmarshalLocationElements(r *request.Request, v reflect.Value) { - for i := 0; i < v.NumField(); i++ { - m, field := v.Field(i), v.Type().Field(i) - if n := field.Name; n[0:1] == strings.ToLower(n[0:1]) { - continue - } - - if m.IsValid() { - name := field.Tag.Get("locationName") - if name == "" { - name = field.Name - } - - switch field.Tag.Get("location") { - case "statusCode": - unmarshalStatusCode(m, r.HTTPResponse.StatusCode) - case "header": - err := unmarshalHeader(m, r.HTTPResponse.Header.Get(name), field.Tag) - if err != nil { - r.Error = awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) - break - } - case "headers": - prefix := field.Tag.Get("locationName") - err := unmarshalHeaderMap(m, r.HTTPResponse.Header, prefix) - if err != nil { - r.Error = awserr.New(request.ErrCodeSerialization, "failed to decode REST response", err) - break - } - } - } - if r.Error != nil { - return - } - } -} - -func unmarshalStatusCode(v reflect.Value, statusCode int) { - if !v.IsValid() { - return - } - - switch v.Interface().(type) { - case *int64: - s := int64(statusCode) - v.Set(reflect.ValueOf(&s)) - } -} - -func unmarshalHeaderMap(r reflect.Value, headers http.Header, prefix string) error { - if len(headers) == 0 { - return nil - } - switch r.Interface().(type) { - case map[string]*string: // we only support string map value types - out := map[string]*string{} - for k, v := range headers { - k = http.CanonicalHeaderKey(k) - if strings.HasPrefix(strings.ToLower(k), strings.ToLower(prefix)) { - out[k[len(prefix):]] = &v[0] - } - } - if len(out) != 0 { - r.Set(reflect.ValueOf(out)) - } - - } - return nil -} - -func unmarshalHeader(v reflect.Value, header string, tag reflect.StructTag) error { - switch tag.Get("type") { - case "jsonvalue": - if len(header) == 0 { - return nil - } - case "blob": - if len(header) == 0 { - return nil - } - default: - if !v.IsValid() || (header == "" && v.Elem().Kind() != reflect.String) { - return nil - } - } - - switch v.Interface().(type) { - case *string: - v.Set(reflect.ValueOf(&header)) - case []byte: - b, err := base64.StdEncoding.DecodeString(header) - if err != nil { - return err - } - v.Set(reflect.ValueOf(b)) - case *bool: - b, err := strconv.ParseBool(header) - if err != nil { - return err - } - v.Set(reflect.ValueOf(&b)) - case *int64: - i, err := strconv.ParseInt(header, 10, 64) - if err != nil { - return err - } - v.Set(reflect.ValueOf(&i)) - case *float64: - f, err := strconv.ParseFloat(header, 64) - if err != nil { - return err - } - v.Set(reflect.ValueOf(&f)) - case *time.Time: - format := tag.Get("timestampFormat") - if len(format) == 0 { - format = protocol.RFC822TimeFormatName - } - t, err := protocol.ParseTime(format, header) - if err != nil { - return err - } - v.Set(reflect.ValueOf(&t)) - case aws.JSONValue: - escaping := protocol.NoEscape - if tag.Get("location") == "header" { - escaping = protocol.Base64Escape - } - m, err := protocol.DecodeJSONValue(header, escaping) - if err != nil { - return err - } - v.Set(reflect.ValueOf(m)) - default: - err := fmt.Errorf("Unsupported value for param %v (%s)", v.Interface(), v.Type()) - return err - } - return nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/timestamp.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/timestamp.go deleted file mode 100644 index 05d4ff519..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/timestamp.go +++ /dev/null @@ -1,84 +0,0 @@ -package protocol - -import ( - "math" - "strconv" - "time" - - "github.com/aws/aws-sdk-go/internal/sdkmath" -) - -// Names of time formats supported by the SDK -const ( - RFC822TimeFormatName = "rfc822" - ISO8601TimeFormatName = "iso8601" - UnixTimeFormatName = "unixTimestamp" -) - -// Time formats supported by the SDK -// Output time is intended to not contain decimals -const ( - // RFC 7231#section-7.1.1.1 timetamp format. e.g Tue, 29 Apr 2014 18:30:38 GMT - RFC822TimeFormat = "Mon, 2 Jan 2006 15:04:05 GMT" - - // This format is used for output time without seconds precision - RFC822OutputTimeFormat = "Mon, 02 Jan 2006 15:04:05 GMT" - - // RFC3339 a subset of the ISO8601 timestamp format. e.g 2014-04-29T18:30:38Z - ISO8601TimeFormat = "2006-01-02T15:04:05.999999999Z" - - // This format is used for output time without seconds precision - ISO8601OutputTimeFormat = "2006-01-02T15:04:05Z" -) - -// IsKnownTimestampFormat returns if the timestamp format name -// is know to the SDK's protocols. -func IsKnownTimestampFormat(name string) bool { - switch name { - case RFC822TimeFormatName: - fallthrough - case ISO8601TimeFormatName: - fallthrough - case UnixTimeFormatName: - return true - default: - return false - } -} - -// FormatTime returns a string value of the time. -func FormatTime(name string, t time.Time) string { - t = t.UTC() - - switch name { - case RFC822TimeFormatName: - return t.Format(RFC822OutputTimeFormat) - case ISO8601TimeFormatName: - return t.Format(ISO8601OutputTimeFormat) - case UnixTimeFormatName: - return strconv.FormatInt(t.Unix(), 10) - default: - panic("unknown timestamp format name, " + name) - } -} - -// ParseTime attempts to parse the time given the format. Returns -// the time if it was able to be parsed, and fails otherwise. -func ParseTime(formatName, value string) (time.Time, error) { - switch formatName { - case RFC822TimeFormatName: - return time.Parse(RFC822TimeFormat, value) - case ISO8601TimeFormatName: - return time.Parse(ISO8601TimeFormat, value) - case UnixTimeFormatName: - v, err := strconv.ParseFloat(value, 64) - _, dec := math.Modf(v) - dec = sdkmath.Round(dec*1e3) / 1e3 //Rounds 0.1229999 to 0.123 - if err != nil { - return time.Time{}, err - } - return time.Unix(int64(v), int64(dec*(1e9))), nil - default: - panic("unknown timestamp format name, " + formatName) - } -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go deleted file mode 100644 index da1a68111..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/unmarshal.go +++ /dev/null @@ -1,21 +0,0 @@ -package protocol - -import ( - "io" - "io/ioutil" - - "github.com/aws/aws-sdk-go/aws/request" -) - -// UnmarshalDiscardBodyHandler is a named request handler to empty and close a response's body -var UnmarshalDiscardBodyHandler = request.NamedHandler{Name: "awssdk.shared.UnmarshalDiscardBody", Fn: UnmarshalDiscardBody} - -// UnmarshalDiscardBody is a request handler to empty a response's body and closing it. -func UnmarshalDiscardBody(r *request.Request) { - if r.HTTPResponse == nil || r.HTTPResponse.Body == nil { - return - } - - io.Copy(ioutil.Discard, r.HTTPResponse.Body) - r.HTTPResponse.Body.Close() -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go deleted file mode 100644 index cf981fe95..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go +++ /dev/null @@ -1,306 +0,0 @@ -// Package xmlutil provides XML serialization of AWS requests and responses. -package xmlutil - -import ( - "encoding/base64" - "encoding/xml" - "fmt" - "reflect" - "sort" - "strconv" - "time" - - "github.com/aws/aws-sdk-go/private/protocol" -) - -// BuildXML will serialize params into an xml.Encoder. Error will be returned -// if the serialization of any of the params or nested values fails. -func BuildXML(params interface{}, e *xml.Encoder) error { - return buildXML(params, e, false) -} - -func buildXML(params interface{}, e *xml.Encoder, sorted bool) error { - b := xmlBuilder{encoder: e, namespaces: map[string]string{}} - root := NewXMLElement(xml.Name{}) - if err := b.buildValue(reflect.ValueOf(params), root, ""); err != nil { - return err - } - for _, c := range root.Children { - for _, v := range c { - return StructToXML(e, v, sorted) - } - } - return nil -} - -// Returns the reflection element of a value, if it is a pointer. -func elemOf(value reflect.Value) reflect.Value { - for value.Kind() == reflect.Ptr { - value = value.Elem() - } - return value -} - -// A xmlBuilder serializes values from Go code to XML -type xmlBuilder struct { - encoder *xml.Encoder - namespaces map[string]string -} - -// buildValue generic XMLNode builder for any type. Will build value for their specific type -// struct, list, map, scalar. -// -// Also takes a "type" tag value to set what type a value should be converted to XMLNode as. If -// type is not provided reflect will be used to determine the value's type. -func (b *xmlBuilder) buildValue(value reflect.Value, current *XMLNode, tag reflect.StructTag) error { - value = elemOf(value) - if !value.IsValid() { // no need to handle zero values - return nil - } else if tag.Get("location") != "" { // don't handle non-body location values - return nil - } - - t := tag.Get("type") - if t == "" { - switch value.Kind() { - case reflect.Struct: - t = "structure" - case reflect.Slice: - t = "list" - case reflect.Map: - t = "map" - } - } - - switch t { - case "structure": - if field, ok := value.Type().FieldByName("_"); ok { - tag = tag + reflect.StructTag(" ") + field.Tag - } - return b.buildStruct(value, current, tag) - case "list": - return b.buildList(value, current, tag) - case "map": - return b.buildMap(value, current, tag) - default: - return b.buildScalar(value, current, tag) - } -} - -// buildStruct adds a struct and its fields to the current XMLNode. All fields and any nested -// types are converted to XMLNodes also. -func (b *xmlBuilder) buildStruct(value reflect.Value, current *XMLNode, tag reflect.StructTag) error { - if !value.IsValid() { - return nil - } - - // unwrap payloads - if payload := tag.Get("payload"); payload != "" { - field, _ := value.Type().FieldByName(payload) - tag = field.Tag - value = elemOf(value.FieldByName(payload)) - - if !value.IsValid() { - return nil - } - } - - child := NewXMLElement(xml.Name{Local: tag.Get("locationName")}) - - // there is an xmlNamespace associated with this struct - if prefix, uri := tag.Get("xmlPrefix"), tag.Get("xmlURI"); uri != "" { - ns := xml.Attr{ - Name: xml.Name{Local: "xmlns"}, - Value: uri, - } - if prefix != "" { - b.namespaces[prefix] = uri // register the namespace - ns.Name.Local = "xmlns:" + prefix - } - - child.Attr = append(child.Attr, ns) - } - - var payloadFields, nonPayloadFields int - - t := value.Type() - for i := 0; i < value.NumField(); i++ { - member := elemOf(value.Field(i)) - field := t.Field(i) - - if field.PkgPath != "" { - continue // ignore unexported fields - } - if field.Tag.Get("ignore") != "" { - continue - } - - mTag := field.Tag - if mTag.Get("location") != "" { // skip non-body members - nonPayloadFields++ - continue - } - payloadFields++ - - if protocol.CanSetIdempotencyToken(value.Field(i), field) { - token := protocol.GetIdempotencyToken() - member = reflect.ValueOf(token) - } - - memberName := mTag.Get("locationName") - if memberName == "" { - memberName = field.Name - mTag = reflect.StructTag(string(mTag) + ` locationName:"` + memberName + `"`) - } - if err := b.buildValue(member, child, mTag); err != nil { - return err - } - } - - // Only case where the child shape is not added is if the shape only contains - // non-payload fields, e.g headers/query. - if !(payloadFields == 0 && nonPayloadFields > 0) { - current.AddChild(child) - } - - return nil -} - -// buildList adds the value's list items to the current XMLNode as children nodes. All -// nested values in the list are converted to XMLNodes also. -func (b *xmlBuilder) buildList(value reflect.Value, current *XMLNode, tag reflect.StructTag) error { - if value.IsNil() { // don't build omitted lists - return nil - } - - // check for unflattened list member - flattened := tag.Get("flattened") != "" - - xname := xml.Name{Local: tag.Get("locationName")} - if flattened { - for i := 0; i < value.Len(); i++ { - child := NewXMLElement(xname) - current.AddChild(child) - if err := b.buildValue(value.Index(i), child, ""); err != nil { - return err - } - } - } else { - list := NewXMLElement(xname) - current.AddChild(list) - - for i := 0; i < value.Len(); i++ { - iname := tag.Get("locationNameList") - if iname == "" { - iname = "member" - } - - child := NewXMLElement(xml.Name{Local: iname}) - list.AddChild(child) - if err := b.buildValue(value.Index(i), child, ""); err != nil { - return err - } - } - } - - return nil -} - -// buildMap adds the value's key/value pairs to the current XMLNode as children nodes. All -// nested values in the map are converted to XMLNodes also. -// -// Error will be returned if it is unable to build the map's values into XMLNodes -func (b *xmlBuilder) buildMap(value reflect.Value, current *XMLNode, tag reflect.StructTag) error { - if value.IsNil() { // don't build omitted maps - return nil - } - - maproot := NewXMLElement(xml.Name{Local: tag.Get("locationName")}) - current.AddChild(maproot) - current = maproot - - kname, vname := "key", "value" - if n := tag.Get("locationNameKey"); n != "" { - kname = n - } - if n := tag.Get("locationNameValue"); n != "" { - vname = n - } - - // sorting is not required for compliance, but it makes testing easier - keys := make([]string, value.Len()) - for i, k := range value.MapKeys() { - keys[i] = k.String() - } - sort.Strings(keys) - - for _, k := range keys { - v := value.MapIndex(reflect.ValueOf(k)) - - mapcur := current - if tag.Get("flattened") == "" { // add "entry" tag to non-flat maps - child := NewXMLElement(xml.Name{Local: "entry"}) - mapcur.AddChild(child) - mapcur = child - } - - kchild := NewXMLElement(xml.Name{Local: kname}) - kchild.Text = k - vchild := NewXMLElement(xml.Name{Local: vname}) - mapcur.AddChild(kchild) - mapcur.AddChild(vchild) - - if err := b.buildValue(v, vchild, ""); err != nil { - return err - } - } - - return nil -} - -// buildScalar will convert the value into a string and append it as a attribute or child -// of the current XMLNode. -// -// The value will be added as an attribute if tag contains a "xmlAttribute" attribute value. -// -// Error will be returned if the value type is unsupported. -func (b *xmlBuilder) buildScalar(value reflect.Value, current *XMLNode, tag reflect.StructTag) error { - var str string - switch converted := value.Interface().(type) { - case string: - str = converted - case []byte: - if !value.IsNil() { - str = base64.StdEncoding.EncodeToString(converted) - } - case bool: - str = strconv.FormatBool(converted) - case int64: - str = strconv.FormatInt(converted, 10) - case int: - str = strconv.Itoa(converted) - case float64: - str = strconv.FormatFloat(converted, 'f', -1, 64) - case float32: - str = strconv.FormatFloat(float64(converted), 'f', -1, 32) - case time.Time: - format := tag.Get("timestampFormat") - if len(format) == 0 { - format = protocol.ISO8601TimeFormatName - } - - str = protocol.FormatTime(format, converted) - default: - return fmt.Errorf("unsupported value for param %s: %v (%s)", - tag.Get("locationName"), value.Interface(), value.Type().Name()) - } - - xname := xml.Name{Local: tag.Get("locationName")} - if tag.Get("xmlAttribute") != "" { // put into current node's attribute list - attr := xml.Attr{Name: xname, Value: str} - current.Attr = append(current.Attr, attr) - } else { // regular text node - current.AddChild(&XMLNode{Name: xname, Text: str}) - } - return nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go deleted file mode 100644 index 7108d3800..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go +++ /dev/null @@ -1,291 +0,0 @@ -package xmlutil - -import ( - "bytes" - "encoding/base64" - "encoding/xml" - "fmt" - "io" - "reflect" - "strconv" - "strings" - "time" - - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/private/protocol" -) - -// UnmarshalXMLError unmarshals the XML error from the stream into the value -// type specified. The value must be a pointer. If the message fails to -// unmarshal, the message content will be included in the returned error as a -// awserr.UnmarshalError. -func UnmarshalXMLError(v interface{}, stream io.Reader) error { - var errBuf bytes.Buffer - body := io.TeeReader(stream, &errBuf) - - err := xml.NewDecoder(body).Decode(v) - if err != nil && err != io.EOF { - return awserr.NewUnmarshalError(err, - "failed to unmarshal error message", errBuf.Bytes()) - } - - return nil -} - -// UnmarshalXML deserializes an xml.Decoder into the container v. V -// needs to match the shape of the XML expected to be decoded. -// If the shape doesn't match unmarshaling will fail. -func UnmarshalXML(v interface{}, d *xml.Decoder, wrapper string) error { - n, err := XMLToStruct(d, nil) - if err != nil { - return err - } - if n.Children != nil { - for _, root := range n.Children { - for _, c := range root { - if wrappedChild, ok := c.Children[wrapper]; ok { - c = wrappedChild[0] // pull out wrapped element - } - - err = parse(reflect.ValueOf(v), c, "") - if err != nil { - if err == io.EOF { - return nil - } - return err - } - } - } - return nil - } - return nil -} - -// parse deserializes any value from the XMLNode. The type tag is used to infer the type, or reflect -// will be used to determine the type from r. -func parse(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { - rtype := r.Type() - if rtype.Kind() == reflect.Ptr { - rtype = rtype.Elem() // check kind of actual element type - } - - t := tag.Get("type") - if t == "" { - switch rtype.Kind() { - case reflect.Struct: - // also it can't be a time object - if _, ok := r.Interface().(*time.Time); !ok { - t = "structure" - } - case reflect.Slice: - // also it can't be a byte slice - if _, ok := r.Interface().([]byte); !ok { - t = "list" - } - case reflect.Map: - t = "map" - } - } - - switch t { - case "structure": - if field, ok := rtype.FieldByName("_"); ok { - tag = field.Tag - } - return parseStruct(r, node, tag) - case "list": - return parseList(r, node, tag) - case "map": - return parseMap(r, node, tag) - default: - return parseScalar(r, node, tag) - } -} - -// parseStruct deserializes a structure and its fields from an XMLNode. Any nested -// types in the structure will also be deserialized. -func parseStruct(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { - t := r.Type() - if r.Kind() == reflect.Ptr { - if r.IsNil() { // create the structure if it's nil - s := reflect.New(r.Type().Elem()) - r.Set(s) - r = s - } - - r = r.Elem() - t = t.Elem() - } - - // unwrap any payloads - if payload := tag.Get("payload"); payload != "" { - field, _ := t.FieldByName(payload) - return parseStruct(r.FieldByName(payload), node, field.Tag) - } - - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) - if c := field.Name[0:1]; strings.ToLower(c) == c { - continue // ignore unexported fields - } - - // figure out what this field is called - name := field.Name - if field.Tag.Get("flattened") != "" && field.Tag.Get("locationNameList") != "" { - name = field.Tag.Get("locationNameList") - } else if locName := field.Tag.Get("locationName"); locName != "" { - name = locName - } - - // try to find the field by name in elements - elems := node.Children[name] - - if elems == nil { // try to find the field in attributes - if val, ok := node.findElem(name); ok { - elems = []*XMLNode{{Text: val}} - } - } - - member := r.FieldByName(field.Name) - for _, elem := range elems { - err := parse(member, elem, field.Tag) - if err != nil { - return err - } - } - } - return nil -} - -// parseList deserializes a list of values from an XML node. Each list entry -// will also be deserialized. -func parseList(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { - t := r.Type() - - if tag.Get("flattened") == "" { // look at all item entries - mname := "member" - if name := tag.Get("locationNameList"); name != "" { - mname = name - } - - if Children, ok := node.Children[mname]; ok { - if r.IsNil() { - r.Set(reflect.MakeSlice(t, len(Children), len(Children))) - } - - for i, c := range Children { - err := parse(r.Index(i), c, "") - if err != nil { - return err - } - } - } - } else { // flattened list means this is a single element - if r.IsNil() { - r.Set(reflect.MakeSlice(t, 0, 0)) - } - - childR := reflect.Zero(t.Elem()) - r.Set(reflect.Append(r, childR)) - err := parse(r.Index(r.Len()-1), node, "") - if err != nil { - return err - } - } - - return nil -} - -// parseMap deserializes a map from an XMLNode. The direct children of the XMLNode -// will also be deserialized as map entries. -func parseMap(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { - if r.IsNil() { - r.Set(reflect.MakeMap(r.Type())) - } - - if tag.Get("flattened") == "" { // look at all child entries - for _, entry := range node.Children["entry"] { - parseMapEntry(r, entry, tag) - } - } else { // this element is itself an entry - parseMapEntry(r, node, tag) - } - - return nil -} - -// parseMapEntry deserializes a map entry from a XML node. -func parseMapEntry(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { - kname, vname := "key", "value" - if n := tag.Get("locationNameKey"); n != "" { - kname = n - } - if n := tag.Get("locationNameValue"); n != "" { - vname = n - } - - keys, ok := node.Children[kname] - values := node.Children[vname] - if ok { - for i, key := range keys { - keyR := reflect.ValueOf(key.Text) - value := values[i] - valueR := reflect.New(r.Type().Elem()).Elem() - - parse(valueR, value, "") - r.SetMapIndex(keyR, valueR) - } - } - return nil -} - -// parseScaller deserializes an XMLNode value into a concrete type based on the -// interface type of r. -// -// Error is returned if the deserialization fails due to invalid type conversion, -// or unsupported interface type. -func parseScalar(r reflect.Value, node *XMLNode, tag reflect.StructTag) error { - switch r.Interface().(type) { - case *string: - r.Set(reflect.ValueOf(&node.Text)) - return nil - case []byte: - b, err := base64.StdEncoding.DecodeString(node.Text) - if err != nil { - return err - } - r.Set(reflect.ValueOf(b)) - case *bool: - v, err := strconv.ParseBool(node.Text) - if err != nil { - return err - } - r.Set(reflect.ValueOf(&v)) - case *int64: - v, err := strconv.ParseInt(node.Text, 10, 64) - if err != nil { - return err - } - r.Set(reflect.ValueOf(&v)) - case *float64: - v, err := strconv.ParseFloat(node.Text, 64) - if err != nil { - return err - } - r.Set(reflect.ValueOf(&v)) - case *time.Time: - format := tag.Get("timestampFormat") - if len(format) == 0 { - format = protocol.ISO8601TimeFormatName - } - - t, err := protocol.ParseTime(format, node.Text) - if err != nil { - return err - } - r.Set(reflect.ValueOf(&t)) - default: - return fmt.Errorf("unsupported value: %v (%s)", r.Interface(), r.Type()) - } - return nil -} diff --git a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go b/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go deleted file mode 100644 index 515ce1521..000000000 --- a/vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go +++ /dev/null @@ -1,148 +0,0 @@ -package xmlutil - -import ( - "encoding/xml" - "fmt" - "io" - "sort" -) - -// A XMLNode contains the values to be encoded or decoded. -type XMLNode struct { - Name xml.Name `json:",omitempty"` - Children map[string][]*XMLNode `json:",omitempty"` - Text string `json:",omitempty"` - Attr []xml.Attr `json:",omitempty"` - - namespaces map[string]string - parent *XMLNode -} - -// NewXMLElement returns a pointer to a new XMLNode initialized to default values. -func NewXMLElement(name xml.Name) *XMLNode { - return &XMLNode{ - Name: name, - Children: map[string][]*XMLNode{}, - Attr: []xml.Attr{}, - } -} - -// AddChild adds child to the XMLNode. -func (n *XMLNode) AddChild(child *XMLNode) { - child.parent = n - if _, ok := n.Children[child.Name.Local]; !ok { - n.Children[child.Name.Local] = []*XMLNode{} - } - n.Children[child.Name.Local] = append(n.Children[child.Name.Local], child) -} - -// XMLToStruct converts a xml.Decoder stream to XMLNode with nested values. -func XMLToStruct(d *xml.Decoder, s *xml.StartElement) (*XMLNode, error) { - out := &XMLNode{} - for { - tok, err := d.Token() - if err != nil { - if err == io.EOF { - break - } else { - return out, err - } - } - - if tok == nil { - break - } - - switch typed := tok.(type) { - case xml.CharData: - out.Text = string(typed.Copy()) - case xml.StartElement: - el := typed.Copy() - out.Attr = el.Attr - if out.Children == nil { - out.Children = map[string][]*XMLNode{} - } - - name := typed.Name.Local - slice := out.Children[name] - if slice == nil { - slice = []*XMLNode{} - } - node, e := XMLToStruct(d, &el) - out.findNamespaces() - if e != nil { - return out, e - } - node.Name = typed.Name - node.findNamespaces() - tempOut := *out - // Save into a temp variable, simply because out gets squashed during - // loop iterations - node.parent = &tempOut - slice = append(slice, node) - out.Children[name] = slice - case xml.EndElement: - if s != nil && s.Name.Local == typed.Name.Local { // matching end token - return out, nil - } - out = &XMLNode{} - } - } - return out, nil -} - -func (n *XMLNode) findNamespaces() { - ns := map[string]string{} - for _, a := range n.Attr { - if a.Name.Space == "xmlns" { - ns[a.Value] = a.Name.Local - } - } - - n.namespaces = ns -} - -func (n *XMLNode) findElem(name string) (string, bool) { - for node := n; node != nil; node = node.parent { - for _, a := range node.Attr { - namespace := a.Name.Space - if v, ok := node.namespaces[namespace]; ok { - namespace = v - } - if name == fmt.Sprintf("%s:%s", namespace, a.Name.Local) { - return a.Value, true - } - } - } - return "", false -} - -// StructToXML writes an XMLNode to a xml.Encoder as tokens. -func StructToXML(e *xml.Encoder, node *XMLNode, sorted bool) error { - e.EncodeToken(xml.StartElement{Name: node.Name, Attr: node.Attr}) - - if node.Text != "" { - e.EncodeToken(xml.CharData([]byte(node.Text))) - } else if sorted { - sortedNames := []string{} - for k := range node.Children { - sortedNames = append(sortedNames, k) - } - sort.Strings(sortedNames) - - for _, k := range sortedNames { - for _, v := range node.Children[k] { - StructToXML(e, v, sorted) - } - } - } else { - for _, c := range node.Children { - for _, v := range c { - StructToXML(e, v, sorted) - } - } - } - - e.EncodeToken(xml.EndElement{Name: node.Name}) - return e.Flush() -} diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/api.go b/vendor/github.com/aws/aws-sdk-go/service/sts/api.go deleted file mode 100644 index eb0a6a417..000000000 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/api.go +++ /dev/null @@ -1,2750 +0,0 @@ -// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT. - -package sts - -import ( - "fmt" - "time" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awsutil" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/request" -) - -const opAssumeRole = "AssumeRole" - -// AssumeRoleRequest generates a "aws/request.Request" representing the -// client's request for the AssumeRole operation. The "output" return -// value will be populated with the request's response once the request completes -// successfully. -// -// Use "Send" method on the returned Request to send the API call to the service. -// the "output" return value is not valid until after Send returns without error. -// -// See AssumeRole for more information on using the AssumeRole -// API call, and error handling. -// -// This method is useful when you want to inject custom logic or configuration -// into the SDK's request lifecycle. Such as custom headers, or retry logic. -// -// -// // Example sending a request using the AssumeRoleRequest method. -// req, resp := client.AssumeRoleRequest(params) -// -// err := req.Send() -// if err == nil { // resp is now filled -// fmt.Println(resp) -// } -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRole -func (c *STS) AssumeRoleRequest(input *AssumeRoleInput) (req *request.Request, output *AssumeRoleOutput) { - op := &request.Operation{ - Name: opAssumeRole, - HTTPMethod: "POST", - HTTPPath: "/", - } - - if input == nil { - input = &AssumeRoleInput{} - } - - output = &AssumeRoleOutput{} - req = c.newRequest(op, input, output) - return -} - -// AssumeRole API operation for AWS Security Token Service. -// -// Returns a set of temporary security credentials that you can use to access -// AWS resources that you might not normally have access to. These temporary -// credentials consist of an access key ID, a secret access key, and a security -// token. Typically, you use AssumeRole within your account or for cross-account -// access. For a comparison of AssumeRole with other API operations that produce -// temporary credentials, see Requesting Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) -// in the IAM User Guide. -// -// You cannot use AWS account root user credentials to call AssumeRole. You -// must use credentials for an IAM user or an IAM role to call AssumeRole. -// -// For cross-account access, imagine that you own multiple accounts and need -// to access resources in each account. You could create long-term credentials -// in each account to access those resources. However, managing all those credentials -// and remembering which one can access which account can be time consuming. -// Instead, you can create one set of long-term credentials in one account. -// Then use temporary security credentials to access all the other accounts -// by assuming roles in those accounts. For more information about roles, see -// IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) -// in the IAM User Guide. -// -// By default, the temporary security credentials created by AssumeRole last -// for one hour. However, you can use the optional DurationSeconds parameter -// to specify the duration of your session. You can provide a value from 900 -// seconds (15 minutes) up to the maximum session duration setting for the role. -// This setting can have a value from 1 hour to 12 hours. To learn how to view -// the maximum value for your role, see View the Maximum Session Duration Setting -// for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) -// in the IAM User Guide. The maximum session duration limit applies when you -// use the AssumeRole* API operations or the assume-role* CLI commands. However -// the limit does not apply when you use those operations to create a console -// URL. For more information, see Using IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) -// in the IAM User Guide. -// -// The temporary security credentials created by AssumeRole can be used to make -// API calls to any AWS service with the following exception: You cannot call -// the AWS STS GetFederationToken or GetSessionToken API operations. -// -// (Optional) You can pass inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) -// to this operation. You can pass a single JSON policy document to use as an -// inline session policy. You can also specify up to 10 managed policies to -// use as managed session policies. The plain text that you use for both inline -// and managed session policies shouldn't exceed 2048 characters. Passing policies -// to this operation returns new temporary credentials. The resulting session's -// permissions are the intersection of the role's identity-based policy and -// the session policies. You can use the role's temporary credentials in subsequent -// AWS API calls to access resources in the account that owns the role. You -// cannot use session policies to grant more permissions than those allowed -// by the identity-based policy of the role that is being assumed. For more -// information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) -// in the IAM User Guide. -// -// To assume a role from a different account, your AWS account must be trusted -// by the role. The trust relationship is defined in the role's trust policy -// when the role is created. That trust policy states which accounts are allowed -// to delegate that access to users in the account. -// -// A user who wants to access a role in a different account must also have permissions -// that are delegated from the user account administrator. The administrator -// must attach a policy that allows the user to call AssumeRole for the ARN -// of the role in the other account. If the user is in the same account as the -// role, then you can do either of the following: -// -// * Attach a policy to the user (identical to the previous user in a different -// account). -// -// * Add the user as a principal directly in the role's trust policy. -// -// In this case, the trust policy acts as an IAM resource-based policy. Users -// in the same account as the role do not need explicit permission to assume -// the role. For more information about trust policies and resource-based policies, -// see IAM Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html) -// in the IAM User Guide. -// -// Using MFA with AssumeRole -// -// (Optional) You can include multi-factor authentication (MFA) information -// when you call AssumeRole. This is useful for cross-account scenarios to ensure -// that the user that assumes the role has been authenticated with an AWS MFA -// device. In that scenario, the trust policy of the role being assumed includes -// a condition that tests for MFA authentication. If the caller does not include -// valid MFA information, the request to assume the role is denied. The condition -// in a trust policy that tests for MFA authentication might look like the following -// example. -// -// "Condition": {"Bool": {"aws:MultiFactorAuthPresent": true}} -// -// For more information, see Configuring MFA-Protected API Access (https://docs.aws.amazon.com/IAM/latest/UserGuide/MFAProtectedAPI.html) -// in the IAM User Guide guide. -// -// To use MFA with AssumeRole, you pass values for the SerialNumber and TokenCode -// parameters. The SerialNumber value identifies the user's hardware or virtual -// MFA device. The TokenCode is the time-based one-time password (TOTP) that -// the MFA device produces. -// -// Returns awserr.Error for service API and SDK errors. Use runtime type assertions -// with awserr.Error's Code and Message methods to get detailed information about -// the error. -// -// See the AWS API reference guide for AWS Security Token Service's -// API operation AssumeRole for usage and error information. -// -// Returned Error Codes: -// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument" -// The request was rejected because the policy document was malformed. The error -// message describes the specific error. -// -// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" -// The request was rejected because the policy document was too large. The error -// message describes how big the policy document is, in packed form, as a percentage -// of what the API allows. -// -// * ErrCodeRegionDisabledException "RegionDisabledException" -// STS is not activated in the requested region for the account that is being -// asked to generate credentials. The account administrator must use the IAM -// console to activate STS in that region. For more information, see Activating -// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) -// in the IAM User Guide. -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRole -func (c *STS) AssumeRole(input *AssumeRoleInput) (*AssumeRoleOutput, error) { - req, out := c.AssumeRoleRequest(input) - return out, req.Send() -} - -// AssumeRoleWithContext is the same as AssumeRole with the addition of -// the ability to pass a context and additional request options. -// -// See AssumeRole for details on how to use this API operation. -// -// The context must be non-nil and will be used for request cancellation. If -// the context is nil a panic will occur. In the future the SDK may create -// sub-contexts for http.Requests. See https://golang.org/pkg/context/ -// for more information on using Contexts. -func (c *STS) AssumeRoleWithContext(ctx aws.Context, input *AssumeRoleInput, opts ...request.Option) (*AssumeRoleOutput, error) { - req, out := c.AssumeRoleRequest(input) - req.SetContext(ctx) - req.ApplyOptions(opts...) - return out, req.Send() -} - -const opAssumeRoleWithSAML = "AssumeRoleWithSAML" - -// AssumeRoleWithSAMLRequest generates a "aws/request.Request" representing the -// client's request for the AssumeRoleWithSAML operation. The "output" return -// value will be populated with the request's response once the request completes -// successfully. -// -// Use "Send" method on the returned Request to send the API call to the service. -// the "output" return value is not valid until after Send returns without error. -// -// See AssumeRoleWithSAML for more information on using the AssumeRoleWithSAML -// API call, and error handling. -// -// This method is useful when you want to inject custom logic or configuration -// into the SDK's request lifecycle. Such as custom headers, or retry logic. -// -// -// // Example sending a request using the AssumeRoleWithSAMLRequest method. -// req, resp := client.AssumeRoleWithSAMLRequest(params) -// -// err := req.Send() -// if err == nil { // resp is now filled -// fmt.Println(resp) -// } -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAML -func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *request.Request, output *AssumeRoleWithSAMLOutput) { - op := &request.Operation{ - Name: opAssumeRoleWithSAML, - HTTPMethod: "POST", - HTTPPath: "/", - } - - if input == nil { - input = &AssumeRoleWithSAMLInput{} - } - - output = &AssumeRoleWithSAMLOutput{} - req = c.newRequest(op, input, output) - req.Config.Credentials = credentials.AnonymousCredentials - return -} - -// AssumeRoleWithSAML API operation for AWS Security Token Service. -// -// Returns a set of temporary security credentials for users who have been authenticated -// via a SAML authentication response. This operation provides a mechanism for -// tying an enterprise identity store or directory to role-based AWS access -// without user-specific credentials or configuration. For a comparison of AssumeRoleWithSAML -// with the other API operations that produce temporary credentials, see Requesting -// Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) -// in the IAM User Guide. -// -// The temporary security credentials returned by this operation consist of -// an access key ID, a secret access key, and a security token. Applications -// can use these temporary security credentials to sign calls to AWS services. -// -// By default, the temporary security credentials created by AssumeRoleWithSAML -// last for one hour. However, you can use the optional DurationSeconds parameter -// to specify the duration of your session. Your role session lasts for the -// duration that you specify, or until the time specified in the SAML authentication -// response's SessionNotOnOrAfter value, whichever is shorter. You can provide -// a DurationSeconds value from 900 seconds (15 minutes) up to the maximum session -// duration setting for the role. This setting can have a value from 1 hour -// to 12 hours. To learn how to view the maximum value for your role, see View -// the Maximum Session Duration Setting for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) -// in the IAM User Guide. The maximum session duration limit applies when you -// use the AssumeRole* API operations or the assume-role* CLI commands. However -// the limit does not apply when you use those operations to create a console -// URL. For more information, see Using IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) -// in the IAM User Guide. -// -// The temporary security credentials created by AssumeRoleWithSAML can be used -// to make API calls to any AWS service with the following exception: you cannot -// call the STS GetFederationToken or GetSessionToken API operations. -// -// (Optional) You can pass inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) -// to this operation. You can pass a single JSON policy document to use as an -// inline session policy. You can also specify up to 10 managed policies to -// use as managed session policies. The plain text that you use for both inline -// and managed session policies shouldn't exceed 2048 characters. Passing policies -// to this operation returns new temporary credentials. The resulting session's -// permissions are the intersection of the role's identity-based policy and -// the session policies. You can use the role's temporary credentials in subsequent -// AWS API calls to access resources in the account that owns the role. You -// cannot use session policies to grant more permissions than those allowed -// by the identity-based policy of the role that is being assumed. For more -// information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) -// in the IAM User Guide. -// -// Before your application can call AssumeRoleWithSAML, you must configure your -// SAML identity provider (IdP) to issue the claims required by AWS. Additionally, -// you must use AWS Identity and Access Management (IAM) to create a SAML provider -// entity in your AWS account that represents your identity provider. You must -// also create an IAM role that specifies this SAML provider in its trust policy. -// -// Calling AssumeRoleWithSAML does not require the use of AWS security credentials. -// The identity of the caller is validated by using keys in the metadata document -// that is uploaded for the SAML provider entity for your identity provider. -// -// Calling AssumeRoleWithSAML can result in an entry in your AWS CloudTrail -// logs. The entry includes the value in the NameID element of the SAML assertion. -// We recommend that you use a NameIDType that is not associated with any personally -// identifiable information (PII). For example, you could instead use the Persistent -// Identifier (urn:oasis:names:tc:SAML:2.0:nameid-format:persistent). -// -// For more information, see the following resources: -// -// * About SAML 2.0-based Federation (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html) -// in the IAM User Guide. -// -// * Creating SAML Identity Providers (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html) -// in the IAM User Guide. -// -// * Configuring a Relying Party and Claims (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html) -// in the IAM User Guide. -// -// * Creating a Role for SAML 2.0 Federation (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html) -// in the IAM User Guide. -// -// Returns awserr.Error for service API and SDK errors. Use runtime type assertions -// with awserr.Error's Code and Message methods to get detailed information about -// the error. -// -// See the AWS API reference guide for AWS Security Token Service's -// API operation AssumeRoleWithSAML for usage and error information. -// -// Returned Error Codes: -// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument" -// The request was rejected because the policy document was malformed. The error -// message describes the specific error. -// -// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" -// The request was rejected because the policy document was too large. The error -// message describes how big the policy document is, in packed form, as a percentage -// of what the API allows. -// -// * ErrCodeIDPRejectedClaimException "IDPRejectedClaim" -// The identity provider (IdP) reported that authentication failed. This might -// be because the claim is invalid. -// -// If this error is returned for the AssumeRoleWithWebIdentity operation, it -// can also mean that the claim has expired or has been explicitly revoked. -// -// * ErrCodeInvalidIdentityTokenException "InvalidIdentityToken" -// The web identity token that was passed could not be validated by AWS. Get -// a new identity token from the identity provider and then retry the request. -// -// * ErrCodeExpiredTokenException "ExpiredTokenException" -// The web identity token that was passed is expired or is not valid. Get a -// new identity token from the identity provider and then retry the request. -// -// * ErrCodeRegionDisabledException "RegionDisabledException" -// STS is not activated in the requested region for the account that is being -// asked to generate credentials. The account administrator must use the IAM -// console to activate STS in that region. For more information, see Activating -// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) -// in the IAM User Guide. -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAML -func (c *STS) AssumeRoleWithSAML(input *AssumeRoleWithSAMLInput) (*AssumeRoleWithSAMLOutput, error) { - req, out := c.AssumeRoleWithSAMLRequest(input) - return out, req.Send() -} - -// AssumeRoleWithSAMLWithContext is the same as AssumeRoleWithSAML with the addition of -// the ability to pass a context and additional request options. -// -// See AssumeRoleWithSAML for details on how to use this API operation. -// -// The context must be non-nil and will be used for request cancellation. If -// the context is nil a panic will occur. In the future the SDK may create -// sub-contexts for http.Requests. See https://golang.org/pkg/context/ -// for more information on using Contexts. -func (c *STS) AssumeRoleWithSAMLWithContext(ctx aws.Context, input *AssumeRoleWithSAMLInput, opts ...request.Option) (*AssumeRoleWithSAMLOutput, error) { - req, out := c.AssumeRoleWithSAMLRequest(input) - req.SetContext(ctx) - req.ApplyOptions(opts...) - return out, req.Send() -} - -const opAssumeRoleWithWebIdentity = "AssumeRoleWithWebIdentity" - -// AssumeRoleWithWebIdentityRequest generates a "aws/request.Request" representing the -// client's request for the AssumeRoleWithWebIdentity operation. The "output" return -// value will be populated with the request's response once the request completes -// successfully. -// -// Use "Send" method on the returned Request to send the API call to the service. -// the "output" return value is not valid until after Send returns without error. -// -// See AssumeRoleWithWebIdentity for more information on using the AssumeRoleWithWebIdentity -// API call, and error handling. -// -// This method is useful when you want to inject custom logic or configuration -// into the SDK's request lifecycle. Such as custom headers, or retry logic. -// -// -// // Example sending a request using the AssumeRoleWithWebIdentityRequest method. -// req, resp := client.AssumeRoleWithWebIdentityRequest(params) -// -// err := req.Send() -// if err == nil { // resp is now filled -// fmt.Println(resp) -// } -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentity -func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityInput) (req *request.Request, output *AssumeRoleWithWebIdentityOutput) { - op := &request.Operation{ - Name: opAssumeRoleWithWebIdentity, - HTTPMethod: "POST", - HTTPPath: "/", - } - - if input == nil { - input = &AssumeRoleWithWebIdentityInput{} - } - - output = &AssumeRoleWithWebIdentityOutput{} - req = c.newRequest(op, input, output) - req.Config.Credentials = credentials.AnonymousCredentials - return -} - -// AssumeRoleWithWebIdentity API operation for AWS Security Token Service. -// -// Returns a set of temporary security credentials for users who have been authenticated -// in a mobile or web application with a web identity provider. Example providers -// include Amazon Cognito, Login with Amazon, Facebook, Google, or any OpenID -// Connect-compatible identity provider. -// -// For mobile applications, we recommend that you use Amazon Cognito. You can -// use Amazon Cognito with the AWS SDK for iOS Developer Guide (http://aws.amazon.com/sdkforios/) -// and the AWS SDK for Android Developer Guide (http://aws.amazon.com/sdkforandroid/) -// to uniquely identify a user. You can also supply the user with a consistent -// identity throughout the lifetime of an application. -// -// To learn more about Amazon Cognito, see Amazon Cognito Overview (https://docs.aws.amazon.com/mobile/sdkforandroid/developerguide/cognito-auth.html#d0e840) -// in AWS SDK for Android Developer Guide and Amazon Cognito Overview (https://docs.aws.amazon.com/mobile/sdkforios/developerguide/cognito-auth.html#d0e664) -// in the AWS SDK for iOS Developer Guide. -// -// Calling AssumeRoleWithWebIdentity does not require the use of AWS security -// credentials. Therefore, you can distribute an application (for example, on -// mobile devices) that requests temporary security credentials without including -// long-term AWS credentials in the application. You also don't need to deploy -// server-based proxy services that use long-term AWS credentials. Instead, -// the identity of the caller is validated by using a token from the web identity -// provider. For a comparison of AssumeRoleWithWebIdentity with the other API -// operations that produce temporary credentials, see Requesting Temporary Security -// Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) -// in the IAM User Guide. -// -// The temporary security credentials returned by this API consist of an access -// key ID, a secret access key, and a security token. Applications can use these -// temporary security credentials to sign calls to AWS service API operations. -// -// By default, the temporary security credentials created by AssumeRoleWithWebIdentity -// last for one hour. However, you can use the optional DurationSeconds parameter -// to specify the duration of your session. You can provide a value from 900 -// seconds (15 minutes) up to the maximum session duration setting for the role. -// This setting can have a value from 1 hour to 12 hours. To learn how to view -// the maximum value for your role, see View the Maximum Session Duration Setting -// for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) -// in the IAM User Guide. The maximum session duration limit applies when you -// use the AssumeRole* API operations or the assume-role* CLI commands. However -// the limit does not apply when you use those operations to create a console -// URL. For more information, see Using IAM Roles (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html) -// in the IAM User Guide. -// -// The temporary security credentials created by AssumeRoleWithWebIdentity can -// be used to make API calls to any AWS service with the following exception: -// you cannot call the STS GetFederationToken or GetSessionToken API operations. -// -// (Optional) You can pass inline or managed session policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) -// to this operation. You can pass a single JSON policy document to use as an -// inline session policy. You can also specify up to 10 managed policies to -// use as managed session policies. The plain text that you use for both inline -// and managed session policies shouldn't exceed 2048 characters. Passing policies -// to this operation returns new temporary credentials. The resulting session's -// permissions are the intersection of the role's identity-based policy and -// the session policies. You can use the role's temporary credentials in subsequent -// AWS API calls to access resources in the account that owns the role. You -// cannot use session policies to grant more permissions than those allowed -// by the identity-based policy of the role that is being assumed. For more -// information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) -// in the IAM User Guide. -// -// Before your application can call AssumeRoleWithWebIdentity, you must have -// an identity token from a supported identity provider and create a role that -// the application can assume. The role that your application assumes must trust -// the identity provider that is associated with the identity token. In other -// words, the identity provider must be specified in the role's trust policy. -// -// Calling AssumeRoleWithWebIdentity can result in an entry in your AWS CloudTrail -// logs. The entry includes the Subject (http://openid.net/specs/openid-connect-core-1_0.html#Claims) -// of the provided Web Identity Token. We recommend that you avoid using any -// personally identifiable information (PII) in this field. For example, you -// could instead use a GUID or a pairwise identifier, as suggested in the OIDC -// specification (http://openid.net/specs/openid-connect-core-1_0.html#SubjectIDTypes). -// -// For more information about how to use web identity federation and the AssumeRoleWithWebIdentity -// API, see the following resources: -// -// * Using Web Identity Federation API Operations for Mobile Apps (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_manual.html) -// and Federation Through a Web-based Identity Provider (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity). -// -// * Web Identity Federation Playground (https://web-identity-federation-playground.s3.amazonaws.com/index.html). -// Walk through the process of authenticating through Login with Amazon, -// Facebook, or Google, getting temporary security credentials, and then -// using those credentials to make a request to AWS. -// -// * AWS SDK for iOS Developer Guide (http://aws.amazon.com/sdkforios/) and -// AWS SDK for Android Developer Guide (http://aws.amazon.com/sdkforandroid/). -// These toolkits contain sample apps that show how to invoke the identity -// providers, and then how to use the information from these providers to -// get and use temporary security credentials. -// -// * Web Identity Federation with Mobile Applications (http://aws.amazon.com/articles/web-identity-federation-with-mobile-applications). -// This article discusses web identity federation and shows an example of -// how to use web identity federation to get access to content in Amazon -// S3. -// -// Returns awserr.Error for service API and SDK errors. Use runtime type assertions -// with awserr.Error's Code and Message methods to get detailed information about -// the error. -// -// See the AWS API reference guide for AWS Security Token Service's -// API operation AssumeRoleWithWebIdentity for usage and error information. -// -// Returned Error Codes: -// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument" -// The request was rejected because the policy document was malformed. The error -// message describes the specific error. -// -// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" -// The request was rejected because the policy document was too large. The error -// message describes how big the policy document is, in packed form, as a percentage -// of what the API allows. -// -// * ErrCodeIDPRejectedClaimException "IDPRejectedClaim" -// The identity provider (IdP) reported that authentication failed. This might -// be because the claim is invalid. -// -// If this error is returned for the AssumeRoleWithWebIdentity operation, it -// can also mean that the claim has expired or has been explicitly revoked. -// -// * ErrCodeIDPCommunicationErrorException "IDPCommunicationError" -// The request could not be fulfilled because the non-AWS identity provider -// (IDP) that was asked to verify the incoming identity token could not be reached. -// This is often a transient error caused by network conditions. Retry the request -// a limited number of times so that you don't exceed the request rate. If the -// error persists, the non-AWS identity provider might be down or not responding. -// -// * ErrCodeInvalidIdentityTokenException "InvalidIdentityToken" -// The web identity token that was passed could not be validated by AWS. Get -// a new identity token from the identity provider and then retry the request. -// -// * ErrCodeExpiredTokenException "ExpiredTokenException" -// The web identity token that was passed is expired or is not valid. Get a -// new identity token from the identity provider and then retry the request. -// -// * ErrCodeRegionDisabledException "RegionDisabledException" -// STS is not activated in the requested region for the account that is being -// asked to generate credentials. The account administrator must use the IAM -// console to activate STS in that region. For more information, see Activating -// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) -// in the IAM User Guide. -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentity -func (c *STS) AssumeRoleWithWebIdentity(input *AssumeRoleWithWebIdentityInput) (*AssumeRoleWithWebIdentityOutput, error) { - req, out := c.AssumeRoleWithWebIdentityRequest(input) - return out, req.Send() -} - -// AssumeRoleWithWebIdentityWithContext is the same as AssumeRoleWithWebIdentity with the addition of -// the ability to pass a context and additional request options. -// -// See AssumeRoleWithWebIdentity for details on how to use this API operation. -// -// The context must be non-nil and will be used for request cancellation. If -// the context is nil a panic will occur. In the future the SDK may create -// sub-contexts for http.Requests. See https://golang.org/pkg/context/ -// for more information on using Contexts. -func (c *STS) AssumeRoleWithWebIdentityWithContext(ctx aws.Context, input *AssumeRoleWithWebIdentityInput, opts ...request.Option) (*AssumeRoleWithWebIdentityOutput, error) { - req, out := c.AssumeRoleWithWebIdentityRequest(input) - req.SetContext(ctx) - req.ApplyOptions(opts...) - return out, req.Send() -} - -const opDecodeAuthorizationMessage = "DecodeAuthorizationMessage" - -// DecodeAuthorizationMessageRequest generates a "aws/request.Request" representing the -// client's request for the DecodeAuthorizationMessage operation. The "output" return -// value will be populated with the request's response once the request completes -// successfully. -// -// Use "Send" method on the returned Request to send the API call to the service. -// the "output" return value is not valid until after Send returns without error. -// -// See DecodeAuthorizationMessage for more information on using the DecodeAuthorizationMessage -// API call, and error handling. -// -// This method is useful when you want to inject custom logic or configuration -// into the SDK's request lifecycle. Such as custom headers, or retry logic. -// -// -// // Example sending a request using the DecodeAuthorizationMessageRequest method. -// req, resp := client.DecodeAuthorizationMessageRequest(params) -// -// err := req.Send() -// if err == nil { // resp is now filled -// fmt.Println(resp) -// } -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessage -func (c *STS) DecodeAuthorizationMessageRequest(input *DecodeAuthorizationMessageInput) (req *request.Request, output *DecodeAuthorizationMessageOutput) { - op := &request.Operation{ - Name: opDecodeAuthorizationMessage, - HTTPMethod: "POST", - HTTPPath: "/", - } - - if input == nil { - input = &DecodeAuthorizationMessageInput{} - } - - output = &DecodeAuthorizationMessageOutput{} - req = c.newRequest(op, input, output) - return -} - -// DecodeAuthorizationMessage API operation for AWS Security Token Service. -// -// Decodes additional information about the authorization status of a request -// from an encoded message returned in response to an AWS request. -// -// For example, if a user is not authorized to perform an operation that he -// or she has requested, the request returns a Client.UnauthorizedOperation -// response (an HTTP 403 response). Some AWS operations additionally return -// an encoded message that can provide details about this authorization failure. -// -// Only certain AWS operations return an encoded authorization message. The -// documentation for an individual operation indicates whether that operation -// returns an encoded message in addition to returning an HTTP code. -// -// The message is encoded because the details of the authorization status can -// constitute privileged information that the user who requested the operation -// should not see. To decode an authorization status message, a user must be -// granted permissions via an IAM policy to request the DecodeAuthorizationMessage -// (sts:DecodeAuthorizationMessage) action. -// -// The decoded message includes the following type of information: -// -// * Whether the request was denied due to an explicit deny or due to the -// absence of an explicit allow. For more information, see Determining Whether -// a Request is Allowed or Denied (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow) -// in the IAM User Guide. -// -// * The principal who made the request. -// -// * The requested action. -// -// * The requested resource. -// -// * The values of condition keys in the context of the user's request. -// -// Returns awserr.Error for service API and SDK errors. Use runtime type assertions -// with awserr.Error's Code and Message methods to get detailed information about -// the error. -// -// See the AWS API reference guide for AWS Security Token Service's -// API operation DecodeAuthorizationMessage for usage and error information. -// -// Returned Error Codes: -// * ErrCodeInvalidAuthorizationMessageException "InvalidAuthorizationMessageException" -// The error returned if the message passed to DecodeAuthorizationMessage was -// invalid. This can happen if the token contains invalid characters, such as -// linebreaks. -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessage -func (c *STS) DecodeAuthorizationMessage(input *DecodeAuthorizationMessageInput) (*DecodeAuthorizationMessageOutput, error) { - req, out := c.DecodeAuthorizationMessageRequest(input) - return out, req.Send() -} - -// DecodeAuthorizationMessageWithContext is the same as DecodeAuthorizationMessage with the addition of -// the ability to pass a context and additional request options. -// -// See DecodeAuthorizationMessage for details on how to use this API operation. -// -// The context must be non-nil and will be used for request cancellation. If -// the context is nil a panic will occur. In the future the SDK may create -// sub-contexts for http.Requests. See https://golang.org/pkg/context/ -// for more information on using Contexts. -func (c *STS) DecodeAuthorizationMessageWithContext(ctx aws.Context, input *DecodeAuthorizationMessageInput, opts ...request.Option) (*DecodeAuthorizationMessageOutput, error) { - req, out := c.DecodeAuthorizationMessageRequest(input) - req.SetContext(ctx) - req.ApplyOptions(opts...) - return out, req.Send() -} - -const opGetAccessKeyInfo = "GetAccessKeyInfo" - -// GetAccessKeyInfoRequest generates a "aws/request.Request" representing the -// client's request for the GetAccessKeyInfo operation. The "output" return -// value will be populated with the request's response once the request completes -// successfully. -// -// Use "Send" method on the returned Request to send the API call to the service. -// the "output" return value is not valid until after Send returns without error. -// -// See GetAccessKeyInfo for more information on using the GetAccessKeyInfo -// API call, and error handling. -// -// This method is useful when you want to inject custom logic or configuration -// into the SDK's request lifecycle. Such as custom headers, or retry logic. -// -// -// // Example sending a request using the GetAccessKeyInfoRequest method. -// req, resp := client.GetAccessKeyInfoRequest(params) -// -// err := req.Send() -// if err == nil { // resp is now filled -// fmt.Println(resp) -// } -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetAccessKeyInfo -func (c *STS) GetAccessKeyInfoRequest(input *GetAccessKeyInfoInput) (req *request.Request, output *GetAccessKeyInfoOutput) { - op := &request.Operation{ - Name: opGetAccessKeyInfo, - HTTPMethod: "POST", - HTTPPath: "/", - } - - if input == nil { - input = &GetAccessKeyInfoInput{} - } - - output = &GetAccessKeyInfoOutput{} - req = c.newRequest(op, input, output) - return -} - -// GetAccessKeyInfo API operation for AWS Security Token Service. -// -// Returns the account identifier for the specified access key ID. -// -// Access keys consist of two parts: an access key ID (for example, AKIAIOSFODNN7EXAMPLE) -// and a secret access key (for example, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY). -// For more information about access keys, see Managing Access Keys for IAM -// Users (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html) -// in the IAM User Guide. -// -// When you pass an access key ID to this operation, it returns the ID of the -// AWS account to which the keys belong. Access key IDs beginning with AKIA -// are long-term credentials for an IAM user or the AWS account root user. Access -// key IDs beginning with ASIA are temporary credentials that are created using -// STS operations. If the account in the response belongs to you, you can sign -// in as the root user and review your root user access keys. Then, you can -// pull a credentials report (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_getting-report.html) -// to learn which IAM user owns the keys. To learn who requested the temporary -// credentials for an ASIA access key, view the STS events in your CloudTrail -// logs (https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html). -// -// This operation does not indicate the state of the access key. The key might -// be active, inactive, or deleted. Active keys might not have permissions to -// perform an operation. Providing a deleted access key might return an error -// that the key doesn't exist. -// -// Returns awserr.Error for service API and SDK errors. Use runtime type assertions -// with awserr.Error's Code and Message methods to get detailed information about -// the error. -// -// See the AWS API reference guide for AWS Security Token Service's -// API operation GetAccessKeyInfo for usage and error information. -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetAccessKeyInfo -func (c *STS) GetAccessKeyInfo(input *GetAccessKeyInfoInput) (*GetAccessKeyInfoOutput, error) { - req, out := c.GetAccessKeyInfoRequest(input) - return out, req.Send() -} - -// GetAccessKeyInfoWithContext is the same as GetAccessKeyInfo with the addition of -// the ability to pass a context and additional request options. -// -// See GetAccessKeyInfo for details on how to use this API operation. -// -// The context must be non-nil and will be used for request cancellation. If -// the context is nil a panic will occur. In the future the SDK may create -// sub-contexts for http.Requests. See https://golang.org/pkg/context/ -// for more information on using Contexts. -func (c *STS) GetAccessKeyInfoWithContext(ctx aws.Context, input *GetAccessKeyInfoInput, opts ...request.Option) (*GetAccessKeyInfoOutput, error) { - req, out := c.GetAccessKeyInfoRequest(input) - req.SetContext(ctx) - req.ApplyOptions(opts...) - return out, req.Send() -} - -const opGetCallerIdentity = "GetCallerIdentity" - -// GetCallerIdentityRequest generates a "aws/request.Request" representing the -// client's request for the GetCallerIdentity operation. The "output" return -// value will be populated with the request's response once the request completes -// successfully. -// -// Use "Send" method on the returned Request to send the API call to the service. -// the "output" return value is not valid until after Send returns without error. -// -// See GetCallerIdentity for more information on using the GetCallerIdentity -// API call, and error handling. -// -// This method is useful when you want to inject custom logic or configuration -// into the SDK's request lifecycle. Such as custom headers, or retry logic. -// -// -// // Example sending a request using the GetCallerIdentityRequest method. -// req, resp := client.GetCallerIdentityRequest(params) -// -// err := req.Send() -// if err == nil { // resp is now filled -// fmt.Println(resp) -// } -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentity -func (c *STS) GetCallerIdentityRequest(input *GetCallerIdentityInput) (req *request.Request, output *GetCallerIdentityOutput) { - op := &request.Operation{ - Name: opGetCallerIdentity, - HTTPMethod: "POST", - HTTPPath: "/", - } - - if input == nil { - input = &GetCallerIdentityInput{} - } - - output = &GetCallerIdentityOutput{} - req = c.newRequest(op, input, output) - return -} - -// GetCallerIdentity API operation for AWS Security Token Service. -// -// Returns details about the IAM user or role whose credentials are used to -// call the operation. -// -// No permissions are required to perform this operation. If an administrator -// adds a policy to your IAM user or role that explicitly denies access to the -// sts:GetCallerIdentity action, you can still perform this operation. Permissions -// are not required because the same information is returned when an IAM user -// or role is denied access. To view an example response, see I Am Not Authorized -// to Perform: iam:DeleteVirtualMFADevice (https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_access-denied-delete-mfa). -// -// Returns awserr.Error for service API and SDK errors. Use runtime type assertions -// with awserr.Error's Code and Message methods to get detailed information about -// the error. -// -// See the AWS API reference guide for AWS Security Token Service's -// API operation GetCallerIdentity for usage and error information. -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentity -func (c *STS) GetCallerIdentity(input *GetCallerIdentityInput) (*GetCallerIdentityOutput, error) { - req, out := c.GetCallerIdentityRequest(input) - return out, req.Send() -} - -// GetCallerIdentityWithContext is the same as GetCallerIdentity with the addition of -// the ability to pass a context and additional request options. -// -// See GetCallerIdentity for details on how to use this API operation. -// -// The context must be non-nil and will be used for request cancellation. If -// the context is nil a panic will occur. In the future the SDK may create -// sub-contexts for http.Requests. See https://golang.org/pkg/context/ -// for more information on using Contexts. -func (c *STS) GetCallerIdentityWithContext(ctx aws.Context, input *GetCallerIdentityInput, opts ...request.Option) (*GetCallerIdentityOutput, error) { - req, out := c.GetCallerIdentityRequest(input) - req.SetContext(ctx) - req.ApplyOptions(opts...) - return out, req.Send() -} - -const opGetFederationToken = "GetFederationToken" - -// GetFederationTokenRequest generates a "aws/request.Request" representing the -// client's request for the GetFederationToken operation. The "output" return -// value will be populated with the request's response once the request completes -// successfully. -// -// Use "Send" method on the returned Request to send the API call to the service. -// the "output" return value is not valid until after Send returns without error. -// -// See GetFederationToken for more information on using the GetFederationToken -// API call, and error handling. -// -// This method is useful when you want to inject custom logic or configuration -// into the SDK's request lifecycle. Such as custom headers, or retry logic. -// -// -// // Example sending a request using the GetFederationTokenRequest method. -// req, resp := client.GetFederationTokenRequest(params) -// -// err := req.Send() -// if err == nil { // resp is now filled -// fmt.Println(resp) -// } -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationToken -func (c *STS) GetFederationTokenRequest(input *GetFederationTokenInput) (req *request.Request, output *GetFederationTokenOutput) { - op := &request.Operation{ - Name: opGetFederationToken, - HTTPMethod: "POST", - HTTPPath: "/", - } - - if input == nil { - input = &GetFederationTokenInput{} - } - - output = &GetFederationTokenOutput{} - req = c.newRequest(op, input, output) - return -} - -// GetFederationToken API operation for AWS Security Token Service. -// -// Returns a set of temporary security credentials (consisting of an access -// key ID, a secret access key, and a security token) for a federated user. -// A typical use is in a proxy application that gets temporary security credentials -// on behalf of distributed applications inside a corporate network. You must -// call the GetFederationToken operation using the long-term security credentials -// of an IAM user. As a result, this call is appropriate in contexts where those -// credentials can be safely stored, usually in a server-based application. -// For a comparison of GetFederationToken with the other API operations that -// produce temporary credentials, see Requesting Temporary Security Credentials -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) -// in the IAM User Guide. -// -// You can create a mobile-based or browser-based app that can authenticate -// users using a web identity provider like Login with Amazon, Facebook, Google, -// or an OpenID Connect-compatible identity provider. In this case, we recommend -// that you use Amazon Cognito (http://aws.amazon.com/cognito/) or AssumeRoleWithWebIdentity. -// For more information, see Federation Through a Web-based Identity Provider -// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity). -// -// You can also call GetFederationToken using the security credentials of an -// AWS account root user, but we do not recommend it. Instead, we recommend -// that you create an IAM user for the purpose of the proxy application. Then -// attach a policy to the IAM user that limits federated users to only the actions -// and resources that they need to access. For more information, see IAM Best -// Practices (https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) -// in the IAM User Guide. -// -// The temporary credentials are valid for the specified duration, from 900 -// seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours). The default -// is 43,200 seconds (12 hours). Temporary credentials that are obtained by -// using AWS account root user credentials have a maximum duration of 3,600 -// seconds (1 hour). -// -// The temporary security credentials created by GetFederationToken can be used -// to make API calls to any AWS service with the following exceptions: -// -// * You cannot use these credentials to call any IAM API operations. -// -// * You cannot call any STS API operations except GetCallerIdentity. -// -// Permissions -// -// You must pass an inline or managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) -// to this operation. You can pass a single JSON policy document to use as an -// inline session policy. You can also specify up to 10 managed policies to -// use as managed session policies. The plain text that you use for both inline -// and managed session policies shouldn't exceed 2048 characters. -// -// Though the session policy parameters are optional, if you do not pass a policy, -// then the resulting federated user session has no permissions. The only exception -// is when the credentials are used to access a resource that has a resource-based -// policy that specifically references the federated user session in the Principal -// element of the policy. When you pass session policies, the session permissions -// are the intersection of the IAM user policies and the session policies that -// you pass. This gives you a way to further restrict the permissions for a -// federated user. You cannot use session policies to grant more permissions -// than those that are defined in the permissions policy of the IAM user. For -// more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) -// in the IAM User Guide. For information about using GetFederationToken to -// create temporary security credentials, see GetFederationToken—Federation -// Through a Custom Identity Broker (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getfederationtoken). -// -// Returns awserr.Error for service API and SDK errors. Use runtime type assertions -// with awserr.Error's Code and Message methods to get detailed information about -// the error. -// -// See the AWS API reference guide for AWS Security Token Service's -// API operation GetFederationToken for usage and error information. -// -// Returned Error Codes: -// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument" -// The request was rejected because the policy document was malformed. The error -// message describes the specific error. -// -// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge" -// The request was rejected because the policy document was too large. The error -// message describes how big the policy document is, in packed form, as a percentage -// of what the API allows. -// -// * ErrCodeRegionDisabledException "RegionDisabledException" -// STS is not activated in the requested region for the account that is being -// asked to generate credentials. The account administrator must use the IAM -// console to activate STS in that region. For more information, see Activating -// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) -// in the IAM User Guide. -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationToken -func (c *STS) GetFederationToken(input *GetFederationTokenInput) (*GetFederationTokenOutput, error) { - req, out := c.GetFederationTokenRequest(input) - return out, req.Send() -} - -// GetFederationTokenWithContext is the same as GetFederationToken with the addition of -// the ability to pass a context and additional request options. -// -// See GetFederationToken for details on how to use this API operation. -// -// The context must be non-nil and will be used for request cancellation. If -// the context is nil a panic will occur. In the future the SDK may create -// sub-contexts for http.Requests. See https://golang.org/pkg/context/ -// for more information on using Contexts. -func (c *STS) GetFederationTokenWithContext(ctx aws.Context, input *GetFederationTokenInput, opts ...request.Option) (*GetFederationTokenOutput, error) { - req, out := c.GetFederationTokenRequest(input) - req.SetContext(ctx) - req.ApplyOptions(opts...) - return out, req.Send() -} - -const opGetSessionToken = "GetSessionToken" - -// GetSessionTokenRequest generates a "aws/request.Request" representing the -// client's request for the GetSessionToken operation. The "output" return -// value will be populated with the request's response once the request completes -// successfully. -// -// Use "Send" method on the returned Request to send the API call to the service. -// the "output" return value is not valid until after Send returns without error. -// -// See GetSessionToken for more information on using the GetSessionToken -// API call, and error handling. -// -// This method is useful when you want to inject custom logic or configuration -// into the SDK's request lifecycle. Such as custom headers, or retry logic. -// -// -// // Example sending a request using the GetSessionTokenRequest method. -// req, resp := client.GetSessionTokenRequest(params) -// -// err := req.Send() -// if err == nil { // resp is now filled -// fmt.Println(resp) -// } -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionToken -func (c *STS) GetSessionTokenRequest(input *GetSessionTokenInput) (req *request.Request, output *GetSessionTokenOutput) { - op := &request.Operation{ - Name: opGetSessionToken, - HTTPMethod: "POST", - HTTPPath: "/", - } - - if input == nil { - input = &GetSessionTokenInput{} - } - - output = &GetSessionTokenOutput{} - req = c.newRequest(op, input, output) - return -} - -// GetSessionToken API operation for AWS Security Token Service. -// -// Returns a set of temporary credentials for an AWS account or IAM user. The -// credentials consist of an access key ID, a secret access key, and a security -// token. Typically, you use GetSessionToken if you want to use MFA to protect -// programmatic calls to specific AWS API operations like Amazon EC2 StopInstances. -// MFA-enabled IAM users would need to call GetSessionToken and submit an MFA -// code that is associated with their MFA device. Using the temporary security -// credentials that are returned from the call, IAM users can then make programmatic -// calls to API operations that require MFA authentication. If you do not supply -// a correct MFA code, then the API returns an access denied error. For a comparison -// of GetSessionToken with the other API operations that produce temporary credentials, -// see Requesting Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) -// and Comparing the AWS STS API operations (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison) -// in the IAM User Guide. -// -// The GetSessionToken operation must be called by using the long-term AWS security -// credentials of the AWS account root user or an IAM user. Credentials that -// are created by IAM users are valid for the duration that you specify. This -// duration can range from 900 seconds (15 minutes) up to a maximum of 129,600 -// seconds (36 hours), with a default of 43,200 seconds (12 hours). Credentials -// based on account credentials can range from 900 seconds (15 minutes) up to -// 3,600 seconds (1 hour), with a default of 1 hour. -// -// The temporary security credentials created by GetSessionToken can be used -// to make API calls to any AWS service with the following exceptions: -// -// * You cannot call any IAM API operations unless MFA authentication information -// is included in the request. -// -// * You cannot call any STS API except AssumeRole or GetCallerIdentity. -// -// We recommend that you do not call GetSessionToken with AWS account root user -// credentials. Instead, follow our best practices (https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#create-iam-users) -// by creating one or more IAM users, giving them the necessary permissions, -// and using IAM users for everyday interaction with AWS. -// -// The credentials that are returned by GetSessionToken are based on permissions -// associated with the user whose credentials were used to call the operation. -// If GetSessionToken is called using AWS account root user credentials, the -// temporary credentials have root user permissions. Similarly, if GetSessionToken -// is called using the credentials of an IAM user, the temporary credentials -// have the same permissions as the IAM user. -// -// For more information about using GetSessionToken to create temporary credentials, -// go to Temporary Credentials for Users in Untrusted Environments (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getsessiontoken) -// in the IAM User Guide. -// -// Returns awserr.Error for service API and SDK errors. Use runtime type assertions -// with awserr.Error's Code and Message methods to get detailed information about -// the error. -// -// See the AWS API reference guide for AWS Security Token Service's -// API operation GetSessionToken for usage and error information. -// -// Returned Error Codes: -// * ErrCodeRegionDisabledException "RegionDisabledException" -// STS is not activated in the requested region for the account that is being -// asked to generate credentials. The account administrator must use the IAM -// console to activate STS in that region. For more information, see Activating -// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) -// in the IAM User Guide. -// -// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionToken -func (c *STS) GetSessionToken(input *GetSessionTokenInput) (*GetSessionTokenOutput, error) { - req, out := c.GetSessionTokenRequest(input) - return out, req.Send() -} - -// GetSessionTokenWithContext is the same as GetSessionToken with the addition of -// the ability to pass a context and additional request options. -// -// See GetSessionToken for details on how to use this API operation. -// -// The context must be non-nil and will be used for request cancellation. If -// the context is nil a panic will occur. In the future the SDK may create -// sub-contexts for http.Requests. See https://golang.org/pkg/context/ -// for more information on using Contexts. -func (c *STS) GetSessionTokenWithContext(ctx aws.Context, input *GetSessionTokenInput, opts ...request.Option) (*GetSessionTokenOutput, error) { - req, out := c.GetSessionTokenRequest(input) - req.SetContext(ctx) - req.ApplyOptions(opts...) - return out, req.Send() -} - -type AssumeRoleInput struct { - _ struct{} `type:"structure"` - - // The duration, in seconds, of the role session. The value can range from 900 - // seconds (15 minutes) up to the maximum session duration setting for the role. - // This setting can have a value from 1 hour to 12 hours. If you specify a value - // higher than this setting, the operation fails. For example, if you specify - // a session duration of 12 hours, but your administrator set the maximum session - // duration to 6 hours, your operation fails. To learn how to view the maximum - // value for your role, see View the Maximum Session Duration Setting for a - // Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) - // in the IAM User Guide. - // - // By default, the value is set to 3600 seconds. - // - // The DurationSeconds parameter is separate from the duration of a console - // session that you might request using the returned credentials. The request - // to the federation endpoint for a console sign-in token takes a SessionDuration - // parameter that specifies the maximum length of the console session. For more - // information, see Creating a URL that Enables Federated Users to Access the - // AWS Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) - // in the IAM User Guide. - DurationSeconds *int64 `min:"900" type:"integer"` - - // A unique identifier that might be required when you assume a role in another - // account. If the administrator of the account to which the role belongs provided - // you with an external ID, then provide that value in the ExternalId parameter. - // This value can be any string, such as a passphrase or account number. A cross-account - // role is usually set up to trust everyone in an account. Therefore, the administrator - // of the trusting account might send an external ID to the administrator of - // the trusted account. That way, only someone with the ID can assume the role, - // rather than everyone in the account. For more information about the external - // ID, see How to Use an External ID When Granting Access to Your AWS Resources - // to a Third Party (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html) - // in the IAM User Guide. - // - // The regex used to validate this parameter is a string of characters consisting - // of upper- and lower-case alphanumeric characters with no spaces. You can - // also include underscores or any of the following characters: =,.@:/- - ExternalId *string `min:"2" type:"string"` - - // An IAM policy in JSON format that you want to use as an inline session policy. - // - // This parameter is optional. Passing policies to this operation returns new - // temporary credentials. The resulting session's permissions are the intersection - // of the role's identity-based policy and the session policies. You can use - // the role's temporary credentials in subsequent AWS API calls to access resources - // in the account that owns the role. You cannot use session policies to grant - // more permissions than those allowed by the identity-based policy of the role - // that is being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) - // in the IAM User Guide. - // - // The plain text that you use for both inline and managed session policies - // shouldn't exceed 2048 characters. The JSON policy characters can be any ASCII - // character from the space character to the end of the valid character list - // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), - // and carriage return (\u000D) characters. - // - // The characters in this parameter count towards the 2048 character session - // policy guideline. However, an AWS conversion compresses the session policies - // into a packed binary format that has a separate limit. This is the enforced - // limit. The PackedPolicySize response element indicates by percentage how - // close the policy is to the upper size limit. - Policy *string `min:"1" type:"string"` - - // The Amazon Resource Names (ARNs) of the IAM managed policies that you want - // to use as managed session policies. The policies must exist in the same account - // as the role. - // - // This parameter is optional. You can provide up to 10 managed policy ARNs. - // However, the plain text that you use for both inline and managed session - // policies shouldn't exceed 2048 characters. For more information about ARNs, - // see Amazon Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) - // in the AWS General Reference. - // - // The characters in this parameter count towards the 2048 character session - // policy guideline. However, an AWS conversion compresses the session policies - // into a packed binary format that has a separate limit. This is the enforced - // limit. The PackedPolicySize response element indicates by percentage how - // close the policy is to the upper size limit. - // - // Passing policies to this operation returns new temporary credentials. The - // resulting session's permissions are the intersection of the role's identity-based - // policy and the session policies. You can use the role's temporary credentials - // in subsequent AWS API calls to access resources in the account that owns - // the role. You cannot use session policies to grant more permissions than - // those allowed by the identity-based policy of the role that is being assumed. - // For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) - // in the IAM User Guide. - PolicyArns []*PolicyDescriptorType `type:"list"` - - // The Amazon Resource Name (ARN) of the role to assume. - // - // RoleArn is a required field - RoleArn *string `min:"20" type:"string" required:"true"` - - // An identifier for the assumed role session. - // - // Use the role session name to uniquely identify a session when the same role - // is assumed by different principals or for different reasons. In cross-account - // scenarios, the role session name is visible to, and can be logged by the - // account that owns the role. The role session name is also used in the ARN - // of the assumed role principal. This means that subsequent cross-account API - // requests that use the temporary security credentials will expose the role - // session name to the external account in their AWS CloudTrail logs. - // - // The regex used to validate this parameter is a string of characters consisting - // of upper- and lower-case alphanumeric characters with no spaces. You can - // also include underscores or any of the following characters: =,.@- - // - // RoleSessionName is a required field - RoleSessionName *string `min:"2" type:"string" required:"true"` - - // The identification number of the MFA device that is associated with the user - // who is making the AssumeRole call. Specify this value if the trust policy - // of the role being assumed includes a condition that requires MFA authentication. - // The value is either the serial number for a hardware device (such as GAHT12345678) - // or an Amazon Resource Name (ARN) for a virtual device (such as arn:aws:iam::123456789012:mfa/user). - // - // The regex used to validate this parameter is a string of characters consisting - // of upper- and lower-case alphanumeric characters with no spaces. You can - // also include underscores or any of the following characters: =,.@- - SerialNumber *string `min:"9" type:"string"` - - // The value provided by the MFA device, if the trust policy of the role being - // assumed requires MFA (that is, if the policy includes a condition that tests - // for MFA). If the role being assumed requires MFA and if the TokenCode value - // is missing or expired, the AssumeRole call returns an "access denied" error. - // - // The format for this parameter, as described by its regex pattern, is a sequence - // of six numeric digits. - TokenCode *string `min:"6" type:"string"` -} - -// String returns the string representation -func (s AssumeRoleInput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s AssumeRoleInput) GoString() string { - return s.String() -} - -// Validate inspects the fields of the type to determine if they are valid. -func (s *AssumeRoleInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "AssumeRoleInput"} - if s.DurationSeconds != nil && *s.DurationSeconds < 900 { - invalidParams.Add(request.NewErrParamMinValue("DurationSeconds", 900)) - } - if s.ExternalId != nil && len(*s.ExternalId) < 2 { - invalidParams.Add(request.NewErrParamMinLen("ExternalId", 2)) - } - if s.Policy != nil && len(*s.Policy) < 1 { - invalidParams.Add(request.NewErrParamMinLen("Policy", 1)) - } - if s.RoleArn == nil { - invalidParams.Add(request.NewErrParamRequired("RoleArn")) - } - if s.RoleArn != nil && len(*s.RoleArn) < 20 { - invalidParams.Add(request.NewErrParamMinLen("RoleArn", 20)) - } - if s.RoleSessionName == nil { - invalidParams.Add(request.NewErrParamRequired("RoleSessionName")) - } - if s.RoleSessionName != nil && len(*s.RoleSessionName) < 2 { - invalidParams.Add(request.NewErrParamMinLen("RoleSessionName", 2)) - } - if s.SerialNumber != nil && len(*s.SerialNumber) < 9 { - invalidParams.Add(request.NewErrParamMinLen("SerialNumber", 9)) - } - if s.TokenCode != nil && len(*s.TokenCode) < 6 { - invalidParams.Add(request.NewErrParamMinLen("TokenCode", 6)) - } - if s.PolicyArns != nil { - for i, v := range s.PolicyArns { - if v == nil { - continue - } - if err := v.Validate(); err != nil { - invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) - } - } - } - - if invalidParams.Len() > 0 { - return invalidParams - } - return nil -} - -// SetDurationSeconds sets the DurationSeconds field's value. -func (s *AssumeRoleInput) SetDurationSeconds(v int64) *AssumeRoleInput { - s.DurationSeconds = &v - return s -} - -// SetExternalId sets the ExternalId field's value. -func (s *AssumeRoleInput) SetExternalId(v string) *AssumeRoleInput { - s.ExternalId = &v - return s -} - -// SetPolicy sets the Policy field's value. -func (s *AssumeRoleInput) SetPolicy(v string) *AssumeRoleInput { - s.Policy = &v - return s -} - -// SetPolicyArns sets the PolicyArns field's value. -func (s *AssumeRoleInput) SetPolicyArns(v []*PolicyDescriptorType) *AssumeRoleInput { - s.PolicyArns = v - return s -} - -// SetRoleArn sets the RoleArn field's value. -func (s *AssumeRoleInput) SetRoleArn(v string) *AssumeRoleInput { - s.RoleArn = &v - return s -} - -// SetRoleSessionName sets the RoleSessionName field's value. -func (s *AssumeRoleInput) SetRoleSessionName(v string) *AssumeRoleInput { - s.RoleSessionName = &v - return s -} - -// SetSerialNumber sets the SerialNumber field's value. -func (s *AssumeRoleInput) SetSerialNumber(v string) *AssumeRoleInput { - s.SerialNumber = &v - return s -} - -// SetTokenCode sets the TokenCode field's value. -func (s *AssumeRoleInput) SetTokenCode(v string) *AssumeRoleInput { - s.TokenCode = &v - return s -} - -// Contains the response to a successful AssumeRole request, including temporary -// AWS credentials that can be used to make AWS requests. -type AssumeRoleOutput struct { - _ struct{} `type:"structure"` - - // The Amazon Resource Name (ARN) and the assumed role ID, which are identifiers - // that you can use to refer to the resulting temporary security credentials. - // For example, you can reference these credentials as a principal in a resource-based - // policy by using the ARN or assumed role ID. The ARN and ID include the RoleSessionName - // that you specified when you called AssumeRole. - AssumedRoleUser *AssumedRoleUser `type:"structure"` - - // The temporary security credentials, which include an access key ID, a secret - // access key, and a security (or session) token. - // - // The size of the security token that STS API operations return is not fixed. - // We strongly recommend that you make no assumptions about the maximum size. - Credentials *Credentials `type:"structure"` - - // A percentage value that indicates the size of the policy in packed form. - // The service rejects any policy with a packed size greater than 100 percent, - // which means the policy exceeded the allowed space. - PackedPolicySize *int64 `type:"integer"` -} - -// String returns the string representation -func (s AssumeRoleOutput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s AssumeRoleOutput) GoString() string { - return s.String() -} - -// SetAssumedRoleUser sets the AssumedRoleUser field's value. -func (s *AssumeRoleOutput) SetAssumedRoleUser(v *AssumedRoleUser) *AssumeRoleOutput { - s.AssumedRoleUser = v - return s -} - -// SetCredentials sets the Credentials field's value. -func (s *AssumeRoleOutput) SetCredentials(v *Credentials) *AssumeRoleOutput { - s.Credentials = v - return s -} - -// SetPackedPolicySize sets the PackedPolicySize field's value. -func (s *AssumeRoleOutput) SetPackedPolicySize(v int64) *AssumeRoleOutput { - s.PackedPolicySize = &v - return s -} - -type AssumeRoleWithSAMLInput struct { - _ struct{} `type:"structure"` - - // The duration, in seconds, of the role session. Your role session lasts for - // the duration that you specify for the DurationSeconds parameter, or until - // the time specified in the SAML authentication response's SessionNotOnOrAfter - // value, whichever is shorter. You can provide a DurationSeconds value from - // 900 seconds (15 minutes) up to the maximum session duration setting for the - // role. This setting can have a value from 1 hour to 12 hours. If you specify - // a value higher than this setting, the operation fails. For example, if you - // specify a session duration of 12 hours, but your administrator set the maximum - // session duration to 6 hours, your operation fails. To learn how to view the - // maximum value for your role, see View the Maximum Session Duration Setting - // for a Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) - // in the IAM User Guide. - // - // By default, the value is set to 3600 seconds. - // - // The DurationSeconds parameter is separate from the duration of a console - // session that you might request using the returned credentials. The request - // to the federation endpoint for a console sign-in token takes a SessionDuration - // parameter that specifies the maximum length of the console session. For more - // information, see Creating a URL that Enables Federated Users to Access the - // AWS Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) - // in the IAM User Guide. - DurationSeconds *int64 `min:"900" type:"integer"` - - // An IAM policy in JSON format that you want to use as an inline session policy. - // - // This parameter is optional. Passing policies to this operation returns new - // temporary credentials. The resulting session's permissions are the intersection - // of the role's identity-based policy and the session policies. You can use - // the role's temporary credentials in subsequent AWS API calls to access resources - // in the account that owns the role. You cannot use session policies to grant - // more permissions than those allowed by the identity-based policy of the role - // that is being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) - // in the IAM User Guide. - // - // The plain text that you use for both inline and managed session policies - // shouldn't exceed 2048 characters. The JSON policy characters can be any ASCII - // character from the space character to the end of the valid character list - // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), - // and carriage return (\u000D) characters. - // - // The characters in this parameter count towards the 2048 character session - // policy guideline. However, an AWS conversion compresses the session policies - // into a packed binary format that has a separate limit. This is the enforced - // limit. The PackedPolicySize response element indicates by percentage how - // close the policy is to the upper size limit. - Policy *string `min:"1" type:"string"` - - // The Amazon Resource Names (ARNs) of the IAM managed policies that you want - // to use as managed session policies. The policies must exist in the same account - // as the role. - // - // This parameter is optional. You can provide up to 10 managed policy ARNs. - // However, the plain text that you use for both inline and managed session - // policies shouldn't exceed 2048 characters. For more information about ARNs, - // see Amazon Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) - // in the AWS General Reference. - // - // The characters in this parameter count towards the 2048 character session - // policy guideline. However, an AWS conversion compresses the session policies - // into a packed binary format that has a separate limit. This is the enforced - // limit. The PackedPolicySize response element indicates by percentage how - // close the policy is to the upper size limit. - // - // Passing policies to this operation returns new temporary credentials. The - // resulting session's permissions are the intersection of the role's identity-based - // policy and the session policies. You can use the role's temporary credentials - // in subsequent AWS API calls to access resources in the account that owns - // the role. You cannot use session policies to grant more permissions than - // those allowed by the identity-based policy of the role that is being assumed. - // For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) - // in the IAM User Guide. - PolicyArns []*PolicyDescriptorType `type:"list"` - - // The Amazon Resource Name (ARN) of the SAML provider in IAM that describes - // the IdP. - // - // PrincipalArn is a required field - PrincipalArn *string `min:"20" type:"string" required:"true"` - - // The Amazon Resource Name (ARN) of the role that the caller is assuming. - // - // RoleArn is a required field - RoleArn *string `min:"20" type:"string" required:"true"` - - // The base-64 encoded SAML authentication response provided by the IdP. - // - // For more information, see Configuring a Relying Party and Adding Claims (https://docs.aws.amazon.com/IAM/latest/UserGuide/create-role-saml-IdP-tasks.html) - // in the IAM User Guide. - // - // SAMLAssertion is a required field - SAMLAssertion *string `min:"4" type:"string" required:"true"` -} - -// String returns the string representation -func (s AssumeRoleWithSAMLInput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s AssumeRoleWithSAMLInput) GoString() string { - return s.String() -} - -// Validate inspects the fields of the type to determine if they are valid. -func (s *AssumeRoleWithSAMLInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "AssumeRoleWithSAMLInput"} - if s.DurationSeconds != nil && *s.DurationSeconds < 900 { - invalidParams.Add(request.NewErrParamMinValue("DurationSeconds", 900)) - } - if s.Policy != nil && len(*s.Policy) < 1 { - invalidParams.Add(request.NewErrParamMinLen("Policy", 1)) - } - if s.PrincipalArn == nil { - invalidParams.Add(request.NewErrParamRequired("PrincipalArn")) - } - if s.PrincipalArn != nil && len(*s.PrincipalArn) < 20 { - invalidParams.Add(request.NewErrParamMinLen("PrincipalArn", 20)) - } - if s.RoleArn == nil { - invalidParams.Add(request.NewErrParamRequired("RoleArn")) - } - if s.RoleArn != nil && len(*s.RoleArn) < 20 { - invalidParams.Add(request.NewErrParamMinLen("RoleArn", 20)) - } - if s.SAMLAssertion == nil { - invalidParams.Add(request.NewErrParamRequired("SAMLAssertion")) - } - if s.SAMLAssertion != nil && len(*s.SAMLAssertion) < 4 { - invalidParams.Add(request.NewErrParamMinLen("SAMLAssertion", 4)) - } - if s.PolicyArns != nil { - for i, v := range s.PolicyArns { - if v == nil { - continue - } - if err := v.Validate(); err != nil { - invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) - } - } - } - - if invalidParams.Len() > 0 { - return invalidParams - } - return nil -} - -// SetDurationSeconds sets the DurationSeconds field's value. -func (s *AssumeRoleWithSAMLInput) SetDurationSeconds(v int64) *AssumeRoleWithSAMLInput { - s.DurationSeconds = &v - return s -} - -// SetPolicy sets the Policy field's value. -func (s *AssumeRoleWithSAMLInput) SetPolicy(v string) *AssumeRoleWithSAMLInput { - s.Policy = &v - return s -} - -// SetPolicyArns sets the PolicyArns field's value. -func (s *AssumeRoleWithSAMLInput) SetPolicyArns(v []*PolicyDescriptorType) *AssumeRoleWithSAMLInput { - s.PolicyArns = v - return s -} - -// SetPrincipalArn sets the PrincipalArn field's value. -func (s *AssumeRoleWithSAMLInput) SetPrincipalArn(v string) *AssumeRoleWithSAMLInput { - s.PrincipalArn = &v - return s -} - -// SetRoleArn sets the RoleArn field's value. -func (s *AssumeRoleWithSAMLInput) SetRoleArn(v string) *AssumeRoleWithSAMLInput { - s.RoleArn = &v - return s -} - -// SetSAMLAssertion sets the SAMLAssertion field's value. -func (s *AssumeRoleWithSAMLInput) SetSAMLAssertion(v string) *AssumeRoleWithSAMLInput { - s.SAMLAssertion = &v - return s -} - -// Contains the response to a successful AssumeRoleWithSAML request, including -// temporary AWS credentials that can be used to make AWS requests. -type AssumeRoleWithSAMLOutput struct { - _ struct{} `type:"structure"` - - // The identifiers for the temporary security credentials that the operation - // returns. - AssumedRoleUser *AssumedRoleUser `type:"structure"` - - // The value of the Recipient attribute of the SubjectConfirmationData element - // of the SAML assertion. - Audience *string `type:"string"` - - // The temporary security credentials, which include an access key ID, a secret - // access key, and a security (or session) token. - // - // The size of the security token that STS API operations return is not fixed. - // We strongly recommend that you make no assumptions about the maximum size. - Credentials *Credentials `type:"structure"` - - // The value of the Issuer element of the SAML assertion. - Issuer *string `type:"string"` - - // A hash value based on the concatenation of the Issuer response value, the - // AWS account ID, and the friendly name (the last part of the ARN) of the SAML - // provider in IAM. The combination of NameQualifier and Subject can be used - // to uniquely identify a federated user. - // - // The following pseudocode shows how the hash value is calculated: - // - // BASE64 ( SHA1 ( "https://example.com/saml" + "123456789012" + "/MySAMLIdP" - // ) ) - NameQualifier *string `type:"string"` - - // A percentage value that indicates the size of the policy in packed form. - // The service rejects any policy with a packed size greater than 100 percent, - // which means the policy exceeded the allowed space. - PackedPolicySize *int64 `type:"integer"` - - // The value of the NameID element in the Subject element of the SAML assertion. - Subject *string `type:"string"` - - // The format of the name ID, as defined by the Format attribute in the NameID - // element of the SAML assertion. Typical examples of the format are transient - // or persistent. - // - // If the format includes the prefix urn:oasis:names:tc:SAML:2.0:nameid-format, - // that prefix is removed. For example, urn:oasis:names:tc:SAML:2.0:nameid-format:transient - // is returned as transient. If the format includes any other prefix, the format - // is returned with no modifications. - SubjectType *string `type:"string"` -} - -// String returns the string representation -func (s AssumeRoleWithSAMLOutput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s AssumeRoleWithSAMLOutput) GoString() string { - return s.String() -} - -// SetAssumedRoleUser sets the AssumedRoleUser field's value. -func (s *AssumeRoleWithSAMLOutput) SetAssumedRoleUser(v *AssumedRoleUser) *AssumeRoleWithSAMLOutput { - s.AssumedRoleUser = v - return s -} - -// SetAudience sets the Audience field's value. -func (s *AssumeRoleWithSAMLOutput) SetAudience(v string) *AssumeRoleWithSAMLOutput { - s.Audience = &v - return s -} - -// SetCredentials sets the Credentials field's value. -func (s *AssumeRoleWithSAMLOutput) SetCredentials(v *Credentials) *AssumeRoleWithSAMLOutput { - s.Credentials = v - return s -} - -// SetIssuer sets the Issuer field's value. -func (s *AssumeRoleWithSAMLOutput) SetIssuer(v string) *AssumeRoleWithSAMLOutput { - s.Issuer = &v - return s -} - -// SetNameQualifier sets the NameQualifier field's value. -func (s *AssumeRoleWithSAMLOutput) SetNameQualifier(v string) *AssumeRoleWithSAMLOutput { - s.NameQualifier = &v - return s -} - -// SetPackedPolicySize sets the PackedPolicySize field's value. -func (s *AssumeRoleWithSAMLOutput) SetPackedPolicySize(v int64) *AssumeRoleWithSAMLOutput { - s.PackedPolicySize = &v - return s -} - -// SetSubject sets the Subject field's value. -func (s *AssumeRoleWithSAMLOutput) SetSubject(v string) *AssumeRoleWithSAMLOutput { - s.Subject = &v - return s -} - -// SetSubjectType sets the SubjectType field's value. -func (s *AssumeRoleWithSAMLOutput) SetSubjectType(v string) *AssumeRoleWithSAMLOutput { - s.SubjectType = &v - return s -} - -type AssumeRoleWithWebIdentityInput struct { - _ struct{} `type:"structure"` - - // The duration, in seconds, of the role session. The value can range from 900 - // seconds (15 minutes) up to the maximum session duration setting for the role. - // This setting can have a value from 1 hour to 12 hours. If you specify a value - // higher than this setting, the operation fails. For example, if you specify - // a session duration of 12 hours, but your administrator set the maximum session - // duration to 6 hours, your operation fails. To learn how to view the maximum - // value for your role, see View the Maximum Session Duration Setting for a - // Role (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session) - // in the IAM User Guide. - // - // By default, the value is set to 3600 seconds. - // - // The DurationSeconds parameter is separate from the duration of a console - // session that you might request using the returned credentials. The request - // to the federation endpoint for a console sign-in token takes a SessionDuration - // parameter that specifies the maximum length of the console session. For more - // information, see Creating a URL that Enables Federated Users to Access the - // AWS Management Console (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html) - // in the IAM User Guide. - DurationSeconds *int64 `min:"900" type:"integer"` - - // An IAM policy in JSON format that you want to use as an inline session policy. - // - // This parameter is optional. Passing policies to this operation returns new - // temporary credentials. The resulting session's permissions are the intersection - // of the role's identity-based policy and the session policies. You can use - // the role's temporary credentials in subsequent AWS API calls to access resources - // in the account that owns the role. You cannot use session policies to grant - // more permissions than those allowed by the identity-based policy of the role - // that is being assumed. For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) - // in the IAM User Guide. - // - // The plain text that you use for both inline and managed session policies - // shouldn't exceed 2048 characters. The JSON policy characters can be any ASCII - // character from the space character to the end of the valid character list - // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), - // and carriage return (\u000D) characters. - // - // The characters in this parameter count towards the 2048 character session - // policy guideline. However, an AWS conversion compresses the session policies - // into a packed binary format that has a separate limit. This is the enforced - // limit. The PackedPolicySize response element indicates by percentage how - // close the policy is to the upper size limit. - Policy *string `min:"1" type:"string"` - - // The Amazon Resource Names (ARNs) of the IAM managed policies that you want - // to use as managed session policies. The policies must exist in the same account - // as the role. - // - // This parameter is optional. You can provide up to 10 managed policy ARNs. - // However, the plain text that you use for both inline and managed session - // policies shouldn't exceed 2048 characters. For more information about ARNs, - // see Amazon Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) - // in the AWS General Reference. - // - // The characters in this parameter count towards the 2048 character session - // policy guideline. However, an AWS conversion compresses the session policies - // into a packed binary format that has a separate limit. This is the enforced - // limit. The PackedPolicySize response element indicates by percentage how - // close the policy is to the upper size limit. - // - // Passing policies to this operation returns new temporary credentials. The - // resulting session's permissions are the intersection of the role's identity-based - // policy and the session policies. You can use the role's temporary credentials - // in subsequent AWS API calls to access resources in the account that owns - // the role. You cannot use session policies to grant more permissions than - // those allowed by the identity-based policy of the role that is being assumed. - // For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) - // in the IAM User Guide. - PolicyArns []*PolicyDescriptorType `type:"list"` - - // The fully qualified host component of the domain name of the identity provider. - // - // Specify this value only for OAuth 2.0 access tokens. Currently www.amazon.com - // and graph.facebook.com are the only supported identity providers for OAuth - // 2.0 access tokens. Do not include URL schemes and port numbers. - // - // Do not specify this value for OpenID Connect ID tokens. - ProviderId *string `min:"4" type:"string"` - - // The Amazon Resource Name (ARN) of the role that the caller is assuming. - // - // RoleArn is a required field - RoleArn *string `min:"20" type:"string" required:"true"` - - // An identifier for the assumed role session. Typically, you pass the name - // or identifier that is associated with the user who is using your application. - // That way, the temporary security credentials that your application will use - // are associated with that user. This session name is included as part of the - // ARN and assumed role ID in the AssumedRoleUser response element. - // - // The regex used to validate this parameter is a string of characters consisting - // of upper- and lower-case alphanumeric characters with no spaces. You can - // also include underscores or any of the following characters: =,.@- - // - // RoleSessionName is a required field - RoleSessionName *string `min:"2" type:"string" required:"true"` - - // The OAuth 2.0 access token or OpenID Connect ID token that is provided by - // the identity provider. Your application must get this token by authenticating - // the user who is using your application with a web identity provider before - // the application makes an AssumeRoleWithWebIdentity call. - // - // WebIdentityToken is a required field - WebIdentityToken *string `min:"4" type:"string" required:"true"` -} - -// String returns the string representation -func (s AssumeRoleWithWebIdentityInput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s AssumeRoleWithWebIdentityInput) GoString() string { - return s.String() -} - -// Validate inspects the fields of the type to determine if they are valid. -func (s *AssumeRoleWithWebIdentityInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "AssumeRoleWithWebIdentityInput"} - if s.DurationSeconds != nil && *s.DurationSeconds < 900 { - invalidParams.Add(request.NewErrParamMinValue("DurationSeconds", 900)) - } - if s.Policy != nil && len(*s.Policy) < 1 { - invalidParams.Add(request.NewErrParamMinLen("Policy", 1)) - } - if s.ProviderId != nil && len(*s.ProviderId) < 4 { - invalidParams.Add(request.NewErrParamMinLen("ProviderId", 4)) - } - if s.RoleArn == nil { - invalidParams.Add(request.NewErrParamRequired("RoleArn")) - } - if s.RoleArn != nil && len(*s.RoleArn) < 20 { - invalidParams.Add(request.NewErrParamMinLen("RoleArn", 20)) - } - if s.RoleSessionName == nil { - invalidParams.Add(request.NewErrParamRequired("RoleSessionName")) - } - if s.RoleSessionName != nil && len(*s.RoleSessionName) < 2 { - invalidParams.Add(request.NewErrParamMinLen("RoleSessionName", 2)) - } - if s.WebIdentityToken == nil { - invalidParams.Add(request.NewErrParamRequired("WebIdentityToken")) - } - if s.WebIdentityToken != nil && len(*s.WebIdentityToken) < 4 { - invalidParams.Add(request.NewErrParamMinLen("WebIdentityToken", 4)) - } - if s.PolicyArns != nil { - for i, v := range s.PolicyArns { - if v == nil { - continue - } - if err := v.Validate(); err != nil { - invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) - } - } - } - - if invalidParams.Len() > 0 { - return invalidParams - } - return nil -} - -// SetDurationSeconds sets the DurationSeconds field's value. -func (s *AssumeRoleWithWebIdentityInput) SetDurationSeconds(v int64) *AssumeRoleWithWebIdentityInput { - s.DurationSeconds = &v - return s -} - -// SetPolicy sets the Policy field's value. -func (s *AssumeRoleWithWebIdentityInput) SetPolicy(v string) *AssumeRoleWithWebIdentityInput { - s.Policy = &v - return s -} - -// SetPolicyArns sets the PolicyArns field's value. -func (s *AssumeRoleWithWebIdentityInput) SetPolicyArns(v []*PolicyDescriptorType) *AssumeRoleWithWebIdentityInput { - s.PolicyArns = v - return s -} - -// SetProviderId sets the ProviderId field's value. -func (s *AssumeRoleWithWebIdentityInput) SetProviderId(v string) *AssumeRoleWithWebIdentityInput { - s.ProviderId = &v - return s -} - -// SetRoleArn sets the RoleArn field's value. -func (s *AssumeRoleWithWebIdentityInput) SetRoleArn(v string) *AssumeRoleWithWebIdentityInput { - s.RoleArn = &v - return s -} - -// SetRoleSessionName sets the RoleSessionName field's value. -func (s *AssumeRoleWithWebIdentityInput) SetRoleSessionName(v string) *AssumeRoleWithWebIdentityInput { - s.RoleSessionName = &v - return s -} - -// SetWebIdentityToken sets the WebIdentityToken field's value. -func (s *AssumeRoleWithWebIdentityInput) SetWebIdentityToken(v string) *AssumeRoleWithWebIdentityInput { - s.WebIdentityToken = &v - return s -} - -// Contains the response to a successful AssumeRoleWithWebIdentity request, -// including temporary AWS credentials that can be used to make AWS requests. -type AssumeRoleWithWebIdentityOutput struct { - _ struct{} `type:"structure"` - - // The Amazon Resource Name (ARN) and the assumed role ID, which are identifiers - // that you can use to refer to the resulting temporary security credentials. - // For example, you can reference these credentials as a principal in a resource-based - // policy by using the ARN or assumed role ID. The ARN and ID include the RoleSessionName - // that you specified when you called AssumeRole. - AssumedRoleUser *AssumedRoleUser `type:"structure"` - - // The intended audience (also known as client ID) of the web identity token. - // This is traditionally the client identifier issued to the application that - // requested the web identity token. - Audience *string `type:"string"` - - // The temporary security credentials, which include an access key ID, a secret - // access key, and a security token. - // - // The size of the security token that STS API operations return is not fixed. - // We strongly recommend that you make no assumptions about the maximum size. - Credentials *Credentials `type:"structure"` - - // A percentage value that indicates the size of the policy in packed form. - // The service rejects any policy with a packed size greater than 100 percent, - // which means the policy exceeded the allowed space. - PackedPolicySize *int64 `type:"integer"` - - // The issuing authority of the web identity token presented. For OpenID Connect - // ID tokens, this contains the value of the iss field. For OAuth 2.0 access - // tokens, this contains the value of the ProviderId parameter that was passed - // in the AssumeRoleWithWebIdentity request. - Provider *string `type:"string"` - - // The unique user identifier that is returned by the identity provider. This - // identifier is associated with the WebIdentityToken that was submitted with - // the AssumeRoleWithWebIdentity call. The identifier is typically unique to - // the user and the application that acquired the WebIdentityToken (pairwise - // identifier). For OpenID Connect ID tokens, this field contains the value - // returned by the identity provider as the token's sub (Subject) claim. - SubjectFromWebIdentityToken *string `min:"6" type:"string"` -} - -// String returns the string representation -func (s AssumeRoleWithWebIdentityOutput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s AssumeRoleWithWebIdentityOutput) GoString() string { - return s.String() -} - -// SetAssumedRoleUser sets the AssumedRoleUser field's value. -func (s *AssumeRoleWithWebIdentityOutput) SetAssumedRoleUser(v *AssumedRoleUser) *AssumeRoleWithWebIdentityOutput { - s.AssumedRoleUser = v - return s -} - -// SetAudience sets the Audience field's value. -func (s *AssumeRoleWithWebIdentityOutput) SetAudience(v string) *AssumeRoleWithWebIdentityOutput { - s.Audience = &v - return s -} - -// SetCredentials sets the Credentials field's value. -func (s *AssumeRoleWithWebIdentityOutput) SetCredentials(v *Credentials) *AssumeRoleWithWebIdentityOutput { - s.Credentials = v - return s -} - -// SetPackedPolicySize sets the PackedPolicySize field's value. -func (s *AssumeRoleWithWebIdentityOutput) SetPackedPolicySize(v int64) *AssumeRoleWithWebIdentityOutput { - s.PackedPolicySize = &v - return s -} - -// SetProvider sets the Provider field's value. -func (s *AssumeRoleWithWebIdentityOutput) SetProvider(v string) *AssumeRoleWithWebIdentityOutput { - s.Provider = &v - return s -} - -// SetSubjectFromWebIdentityToken sets the SubjectFromWebIdentityToken field's value. -func (s *AssumeRoleWithWebIdentityOutput) SetSubjectFromWebIdentityToken(v string) *AssumeRoleWithWebIdentityOutput { - s.SubjectFromWebIdentityToken = &v - return s -} - -// The identifiers for the temporary security credentials that the operation -// returns. -type AssumedRoleUser struct { - _ struct{} `type:"structure"` - - // The ARN of the temporary security credentials that are returned from the - // AssumeRole action. For more information about ARNs and how to use them in - // policies, see IAM Identifiers (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) - // in Using IAM. - // - // Arn is a required field - Arn *string `min:"20" type:"string" required:"true"` - - // A unique identifier that contains the role ID and the role session name of - // the role that is being assumed. The role ID is generated by AWS when the - // role is created. - // - // AssumedRoleId is a required field - AssumedRoleId *string `min:"2" type:"string" required:"true"` -} - -// String returns the string representation -func (s AssumedRoleUser) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s AssumedRoleUser) GoString() string { - return s.String() -} - -// SetArn sets the Arn field's value. -func (s *AssumedRoleUser) SetArn(v string) *AssumedRoleUser { - s.Arn = &v - return s -} - -// SetAssumedRoleId sets the AssumedRoleId field's value. -func (s *AssumedRoleUser) SetAssumedRoleId(v string) *AssumedRoleUser { - s.AssumedRoleId = &v - return s -} - -// AWS credentials for API authentication. -type Credentials struct { - _ struct{} `type:"structure"` - - // The access key ID that identifies the temporary security credentials. - // - // AccessKeyId is a required field - AccessKeyId *string `min:"16" type:"string" required:"true"` - - // The date on which the current credentials expire. - // - // Expiration is a required field - Expiration *time.Time `type:"timestamp" required:"true"` - - // The secret access key that can be used to sign requests. - // - // SecretAccessKey is a required field - SecretAccessKey *string `type:"string" required:"true"` - - // The token that users must pass to the service API to use the temporary credentials. - // - // SessionToken is a required field - SessionToken *string `type:"string" required:"true"` -} - -// String returns the string representation -func (s Credentials) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s Credentials) GoString() string { - return s.String() -} - -// SetAccessKeyId sets the AccessKeyId field's value. -func (s *Credentials) SetAccessKeyId(v string) *Credentials { - s.AccessKeyId = &v - return s -} - -// SetExpiration sets the Expiration field's value. -func (s *Credentials) SetExpiration(v time.Time) *Credentials { - s.Expiration = &v - return s -} - -// SetSecretAccessKey sets the SecretAccessKey field's value. -func (s *Credentials) SetSecretAccessKey(v string) *Credentials { - s.SecretAccessKey = &v - return s -} - -// SetSessionToken sets the SessionToken field's value. -func (s *Credentials) SetSessionToken(v string) *Credentials { - s.SessionToken = &v - return s -} - -type DecodeAuthorizationMessageInput struct { - _ struct{} `type:"structure"` - - // The encoded message that was returned with the response. - // - // EncodedMessage is a required field - EncodedMessage *string `min:"1" type:"string" required:"true"` -} - -// String returns the string representation -func (s DecodeAuthorizationMessageInput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s DecodeAuthorizationMessageInput) GoString() string { - return s.String() -} - -// Validate inspects the fields of the type to determine if they are valid. -func (s *DecodeAuthorizationMessageInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "DecodeAuthorizationMessageInput"} - if s.EncodedMessage == nil { - invalidParams.Add(request.NewErrParamRequired("EncodedMessage")) - } - if s.EncodedMessage != nil && len(*s.EncodedMessage) < 1 { - invalidParams.Add(request.NewErrParamMinLen("EncodedMessage", 1)) - } - - if invalidParams.Len() > 0 { - return invalidParams - } - return nil -} - -// SetEncodedMessage sets the EncodedMessage field's value. -func (s *DecodeAuthorizationMessageInput) SetEncodedMessage(v string) *DecodeAuthorizationMessageInput { - s.EncodedMessage = &v - return s -} - -// A document that contains additional information about the authorization status -// of a request from an encoded message that is returned in response to an AWS -// request. -type DecodeAuthorizationMessageOutput struct { - _ struct{} `type:"structure"` - - // An XML document that contains the decoded message. - DecodedMessage *string `type:"string"` -} - -// String returns the string representation -func (s DecodeAuthorizationMessageOutput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s DecodeAuthorizationMessageOutput) GoString() string { - return s.String() -} - -// SetDecodedMessage sets the DecodedMessage field's value. -func (s *DecodeAuthorizationMessageOutput) SetDecodedMessage(v string) *DecodeAuthorizationMessageOutput { - s.DecodedMessage = &v - return s -} - -// Identifiers for the federated user that is associated with the credentials. -type FederatedUser struct { - _ struct{} `type:"structure"` - - // The ARN that specifies the federated user that is associated with the credentials. - // For more information about ARNs and how to use them in policies, see IAM - // Identifiers (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html) - // in Using IAM. - // - // Arn is a required field - Arn *string `min:"20" type:"string" required:"true"` - - // The string that identifies the federated user associated with the credentials, - // similar to the unique ID of an IAM user. - // - // FederatedUserId is a required field - FederatedUserId *string `min:"2" type:"string" required:"true"` -} - -// String returns the string representation -func (s FederatedUser) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s FederatedUser) GoString() string { - return s.String() -} - -// SetArn sets the Arn field's value. -func (s *FederatedUser) SetArn(v string) *FederatedUser { - s.Arn = &v - return s -} - -// SetFederatedUserId sets the FederatedUserId field's value. -func (s *FederatedUser) SetFederatedUserId(v string) *FederatedUser { - s.FederatedUserId = &v - return s -} - -type GetAccessKeyInfoInput struct { - _ struct{} `type:"structure"` - - // The identifier of an access key. - // - // This parameter allows (through its regex pattern) a string of characters - // that can consist of any upper- or lowercased letter or digit. - // - // AccessKeyId is a required field - AccessKeyId *string `min:"16" type:"string" required:"true"` -} - -// String returns the string representation -func (s GetAccessKeyInfoInput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s GetAccessKeyInfoInput) GoString() string { - return s.String() -} - -// Validate inspects the fields of the type to determine if they are valid. -func (s *GetAccessKeyInfoInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "GetAccessKeyInfoInput"} - if s.AccessKeyId == nil { - invalidParams.Add(request.NewErrParamRequired("AccessKeyId")) - } - if s.AccessKeyId != nil && len(*s.AccessKeyId) < 16 { - invalidParams.Add(request.NewErrParamMinLen("AccessKeyId", 16)) - } - - if invalidParams.Len() > 0 { - return invalidParams - } - return nil -} - -// SetAccessKeyId sets the AccessKeyId field's value. -func (s *GetAccessKeyInfoInput) SetAccessKeyId(v string) *GetAccessKeyInfoInput { - s.AccessKeyId = &v - return s -} - -type GetAccessKeyInfoOutput struct { - _ struct{} `type:"structure"` - - // The number used to identify the AWS account. - Account *string `type:"string"` -} - -// String returns the string representation -func (s GetAccessKeyInfoOutput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s GetAccessKeyInfoOutput) GoString() string { - return s.String() -} - -// SetAccount sets the Account field's value. -func (s *GetAccessKeyInfoOutput) SetAccount(v string) *GetAccessKeyInfoOutput { - s.Account = &v - return s -} - -type GetCallerIdentityInput struct { - _ struct{} `type:"structure"` -} - -// String returns the string representation -func (s GetCallerIdentityInput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s GetCallerIdentityInput) GoString() string { - return s.String() -} - -// Contains the response to a successful GetCallerIdentity request, including -// information about the entity making the request. -type GetCallerIdentityOutput struct { - _ struct{} `type:"structure"` - - // The AWS account ID number of the account that owns or contains the calling - // entity. - Account *string `type:"string"` - - // The AWS ARN associated with the calling entity. - Arn *string `min:"20" type:"string"` - - // The unique identifier of the calling entity. The exact value depends on the - // type of entity that is making the call. The values returned are those listed - // in the aws:userid column in the Principal table (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#principaltable) - // found on the Policy Variables reference page in the IAM User Guide. - UserId *string `type:"string"` -} - -// String returns the string representation -func (s GetCallerIdentityOutput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s GetCallerIdentityOutput) GoString() string { - return s.String() -} - -// SetAccount sets the Account field's value. -func (s *GetCallerIdentityOutput) SetAccount(v string) *GetCallerIdentityOutput { - s.Account = &v - return s -} - -// SetArn sets the Arn field's value. -func (s *GetCallerIdentityOutput) SetArn(v string) *GetCallerIdentityOutput { - s.Arn = &v - return s -} - -// SetUserId sets the UserId field's value. -func (s *GetCallerIdentityOutput) SetUserId(v string) *GetCallerIdentityOutput { - s.UserId = &v - return s -} - -type GetFederationTokenInput struct { - _ struct{} `type:"structure"` - - // The duration, in seconds, that the session should last. Acceptable durations - // for federation sessions range from 900 seconds (15 minutes) to 129,600 seconds - // (36 hours), with 43,200 seconds (12 hours) as the default. Sessions obtained - // using AWS account root user credentials are restricted to a maximum of 3,600 - // seconds (one hour). If the specified duration is longer than one hour, the - // session obtained by using root user credentials defaults to one hour. - DurationSeconds *int64 `min:"900" type:"integer"` - - // The name of the federated user. The name is used as an identifier for the - // temporary security credentials (such as Bob). For example, you can reference - // the federated user name in a resource-based policy, such as in an Amazon - // S3 bucket policy. - // - // The regex used to validate this parameter is a string of characters consisting - // of upper- and lower-case alphanumeric characters with no spaces. You can - // also include underscores or any of the following characters: =,.@- - // - // Name is a required field - Name *string `min:"2" type:"string" required:"true"` - - // An IAM policy in JSON format that you want to use as an inline session policy. - // - // You must pass an inline or managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) - // to this operation. You can pass a single JSON policy document to use as an - // inline session policy. You can also specify up to 10 managed policies to - // use as managed session policies. - // - // This parameter is optional. However, if you do not pass any session policies, - // then the resulting federated user session has no permissions. The only exception - // is when the credentials are used to access a resource that has a resource-based - // policy that specifically references the federated user session in the Principal - // element of the policy. - // - // When you pass session policies, the session permissions are the intersection - // of the IAM user policies and the session policies that you pass. This gives - // you a way to further restrict the permissions for a federated user. You cannot - // use session policies to grant more permissions than those that are defined - // in the permissions policy of the IAM user. For more information, see Session - // Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) - // in the IAM User Guide. - // - // The plain text that you use for both inline and managed session policies - // shouldn't exceed 2048 characters. The JSON policy characters can be any ASCII - // character from the space character to the end of the valid character list - // (\u0020 through \u00FF). It can also include the tab (\u0009), linefeed (\u000A), - // and carriage return (\u000D) characters. - // - // The characters in this parameter count towards the 2048 character session - // policy guideline. However, an AWS conversion compresses the session policies - // into a packed binary format that has a separate limit. This is the enforced - // limit. The PackedPolicySize response element indicates by percentage how - // close the policy is to the upper size limit. - Policy *string `min:"1" type:"string"` - - // The Amazon Resource Names (ARNs) of the IAM managed policies that you want - // to use as a managed session policy. The policies must exist in the same account - // as the IAM user that is requesting federated access. - // - // You must pass an inline or managed session policy (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) - // to this operation. You can pass a single JSON policy document to use as an - // inline session policy. You can also specify up to 10 managed policies to - // use as managed session policies. The plain text that you use for both inline - // and managed session policies shouldn't exceed 2048 characters. You can provide - // up to 10 managed policy ARNs. For more information about ARNs, see Amazon - // Resource Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) - // in the AWS General Reference. - // - // This parameter is optional. However, if you do not pass any session policies, - // then the resulting federated user session has no permissions. The only exception - // is when the credentials are used to access a resource that has a resource-based - // policy that specifically references the federated user session in the Principal - // element of the policy. - // - // When you pass session policies, the session permissions are the intersection - // of the IAM user policies and the session policies that you pass. This gives - // you a way to further restrict the permissions for a federated user. You cannot - // use session policies to grant more permissions than those that are defined - // in the permissions policy of the IAM user. For more information, see Session - // Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session) - // in the IAM User Guide. - // - // The characters in this parameter count towards the 2048 character session - // policy guideline. However, an AWS conversion compresses the session policies - // into a packed binary format that has a separate limit. This is the enforced - // limit. The PackedPolicySize response element indicates by percentage how - // close the policy is to the upper size limit. - PolicyArns []*PolicyDescriptorType `type:"list"` -} - -// String returns the string representation -func (s GetFederationTokenInput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s GetFederationTokenInput) GoString() string { - return s.String() -} - -// Validate inspects the fields of the type to determine if they are valid. -func (s *GetFederationTokenInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "GetFederationTokenInput"} - if s.DurationSeconds != nil && *s.DurationSeconds < 900 { - invalidParams.Add(request.NewErrParamMinValue("DurationSeconds", 900)) - } - if s.Name == nil { - invalidParams.Add(request.NewErrParamRequired("Name")) - } - if s.Name != nil && len(*s.Name) < 2 { - invalidParams.Add(request.NewErrParamMinLen("Name", 2)) - } - if s.Policy != nil && len(*s.Policy) < 1 { - invalidParams.Add(request.NewErrParamMinLen("Policy", 1)) - } - if s.PolicyArns != nil { - for i, v := range s.PolicyArns { - if v == nil { - continue - } - if err := v.Validate(); err != nil { - invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PolicyArns", i), err.(request.ErrInvalidParams)) - } - } - } - - if invalidParams.Len() > 0 { - return invalidParams - } - return nil -} - -// SetDurationSeconds sets the DurationSeconds field's value. -func (s *GetFederationTokenInput) SetDurationSeconds(v int64) *GetFederationTokenInput { - s.DurationSeconds = &v - return s -} - -// SetName sets the Name field's value. -func (s *GetFederationTokenInput) SetName(v string) *GetFederationTokenInput { - s.Name = &v - return s -} - -// SetPolicy sets the Policy field's value. -func (s *GetFederationTokenInput) SetPolicy(v string) *GetFederationTokenInput { - s.Policy = &v - return s -} - -// SetPolicyArns sets the PolicyArns field's value. -func (s *GetFederationTokenInput) SetPolicyArns(v []*PolicyDescriptorType) *GetFederationTokenInput { - s.PolicyArns = v - return s -} - -// Contains the response to a successful GetFederationToken request, including -// temporary AWS credentials that can be used to make AWS requests. -type GetFederationTokenOutput struct { - _ struct{} `type:"structure"` - - // The temporary security credentials, which include an access key ID, a secret - // access key, and a security (or session) token. - // - // The size of the security token that STS API operations return is not fixed. - // We strongly recommend that you make no assumptions about the maximum size. - Credentials *Credentials `type:"structure"` - - // Identifiers for the federated user associated with the credentials (such - // as arn:aws:sts::123456789012:federated-user/Bob or 123456789012:Bob). You - // can use the federated user's ARN in your resource-based policies, such as - // an Amazon S3 bucket policy. - FederatedUser *FederatedUser `type:"structure"` - - // A percentage value indicating the size of the policy in packed form. The - // service rejects policies for which the packed size is greater than 100 percent - // of the allowed value. - PackedPolicySize *int64 `type:"integer"` -} - -// String returns the string representation -func (s GetFederationTokenOutput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s GetFederationTokenOutput) GoString() string { - return s.String() -} - -// SetCredentials sets the Credentials field's value. -func (s *GetFederationTokenOutput) SetCredentials(v *Credentials) *GetFederationTokenOutput { - s.Credentials = v - return s -} - -// SetFederatedUser sets the FederatedUser field's value. -func (s *GetFederationTokenOutput) SetFederatedUser(v *FederatedUser) *GetFederationTokenOutput { - s.FederatedUser = v - return s -} - -// SetPackedPolicySize sets the PackedPolicySize field's value. -func (s *GetFederationTokenOutput) SetPackedPolicySize(v int64) *GetFederationTokenOutput { - s.PackedPolicySize = &v - return s -} - -type GetSessionTokenInput struct { - _ struct{} `type:"structure"` - - // The duration, in seconds, that the credentials should remain valid. Acceptable - // durations for IAM user sessions range from 900 seconds (15 minutes) to 129,600 - // seconds (36 hours), with 43,200 seconds (12 hours) as the default. Sessions - // for AWS account owners are restricted to a maximum of 3,600 seconds (one - // hour). If the duration is longer than one hour, the session for AWS account - // owners defaults to one hour. - DurationSeconds *int64 `min:"900" type:"integer"` - - // The identification number of the MFA device that is associated with the IAM - // user who is making the GetSessionToken call. Specify this value if the IAM - // user has a policy that requires MFA authentication. The value is either the - // serial number for a hardware device (such as GAHT12345678) or an Amazon Resource - // Name (ARN) for a virtual device (such as arn:aws:iam::123456789012:mfa/user). - // You can find the device for an IAM user by going to the AWS Management Console - // and viewing the user's security credentials. - // - // The regex used to validate this parameter is a string of characters consisting - // of upper- and lower-case alphanumeric characters with no spaces. You can - // also include underscores or any of the following characters: =,.@:/- - SerialNumber *string `min:"9" type:"string"` - - // The value provided by the MFA device, if MFA is required. If any policy requires - // the IAM user to submit an MFA code, specify this value. If MFA authentication - // is required, the user must provide a code when requesting a set of temporary - // security credentials. A user who fails to provide the code receives an "access - // denied" response when requesting resources that require MFA authentication. - // - // The format for this parameter, as described by its regex pattern, is a sequence - // of six numeric digits. - TokenCode *string `min:"6" type:"string"` -} - -// String returns the string representation -func (s GetSessionTokenInput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s GetSessionTokenInput) GoString() string { - return s.String() -} - -// Validate inspects the fields of the type to determine if they are valid. -func (s *GetSessionTokenInput) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "GetSessionTokenInput"} - if s.DurationSeconds != nil && *s.DurationSeconds < 900 { - invalidParams.Add(request.NewErrParamMinValue("DurationSeconds", 900)) - } - if s.SerialNumber != nil && len(*s.SerialNumber) < 9 { - invalidParams.Add(request.NewErrParamMinLen("SerialNumber", 9)) - } - if s.TokenCode != nil && len(*s.TokenCode) < 6 { - invalidParams.Add(request.NewErrParamMinLen("TokenCode", 6)) - } - - if invalidParams.Len() > 0 { - return invalidParams - } - return nil -} - -// SetDurationSeconds sets the DurationSeconds field's value. -func (s *GetSessionTokenInput) SetDurationSeconds(v int64) *GetSessionTokenInput { - s.DurationSeconds = &v - return s -} - -// SetSerialNumber sets the SerialNumber field's value. -func (s *GetSessionTokenInput) SetSerialNumber(v string) *GetSessionTokenInput { - s.SerialNumber = &v - return s -} - -// SetTokenCode sets the TokenCode field's value. -func (s *GetSessionTokenInput) SetTokenCode(v string) *GetSessionTokenInput { - s.TokenCode = &v - return s -} - -// Contains the response to a successful GetSessionToken request, including -// temporary AWS credentials that can be used to make AWS requests. -type GetSessionTokenOutput struct { - _ struct{} `type:"structure"` - - // The temporary security credentials, which include an access key ID, a secret - // access key, and a security (or session) token. - // - // The size of the security token that STS API operations return is not fixed. - // We strongly recommend that you make no assumptions about the maximum size. - Credentials *Credentials `type:"structure"` -} - -// String returns the string representation -func (s GetSessionTokenOutput) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s GetSessionTokenOutput) GoString() string { - return s.String() -} - -// SetCredentials sets the Credentials field's value. -func (s *GetSessionTokenOutput) SetCredentials(v *Credentials) *GetSessionTokenOutput { - s.Credentials = v - return s -} - -// A reference to the IAM managed policy that is passed as a session policy -// for a role session or a federated user session. -type PolicyDescriptorType struct { - _ struct{} `type:"structure"` - - // The Amazon Resource Name (ARN) of the IAM managed policy to use as a session - // policy for the role. For more information about ARNs, see Amazon Resource - // Names (ARNs) and AWS Service Namespaces (https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) - // in the AWS General Reference. - Arn *string `locationName:"arn" min:"20" type:"string"` -} - -// String returns the string representation -func (s PolicyDescriptorType) String() string { - return awsutil.Prettify(s) -} - -// GoString returns the string representation -func (s PolicyDescriptorType) GoString() string { - return s.String() -} - -// Validate inspects the fields of the type to determine if they are valid. -func (s *PolicyDescriptorType) Validate() error { - invalidParams := request.ErrInvalidParams{Context: "PolicyDescriptorType"} - if s.Arn != nil && len(*s.Arn) < 20 { - invalidParams.Add(request.NewErrParamMinLen("Arn", 20)) - } - - if invalidParams.Len() > 0 { - return invalidParams - } - return nil -} - -// SetArn sets the Arn field's value. -func (s *PolicyDescriptorType) SetArn(v string) *PolicyDescriptorType { - s.Arn = &v - return s -} diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/customizations.go b/vendor/github.com/aws/aws-sdk-go/service/sts/customizations.go deleted file mode 100644 index d5307fcaa..000000000 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/customizations.go +++ /dev/null @@ -1,11 +0,0 @@ -package sts - -import "github.com/aws/aws-sdk-go/aws/request" - -func init() { - initRequest = customizeRequest -} - -func customizeRequest(r *request.Request) { - r.RetryErrorCodes = append(r.RetryErrorCodes, ErrCodeIDPCommunicationErrorException) -} diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/doc.go b/vendor/github.com/aws/aws-sdk-go/service/sts/doc.go deleted file mode 100644 index fcb720dca..000000000 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/doc.go +++ /dev/null @@ -1,108 +0,0 @@ -// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT. - -// Package sts provides the client and types for making API -// requests to AWS Security Token Service. -// -// The AWS Security Token Service (STS) is a web service that enables you to -// request temporary, limited-privilege credentials for AWS Identity and Access -// Management (IAM) users or for users that you authenticate (federated users). -// This guide provides descriptions of the STS API. For more detailed information -// about using this service, go to Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html). -// -// For information about setting up signatures and authorization through the -// API, go to Signing AWS API Requests (https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) -// in the AWS General Reference. For general information about the Query API, -// go to Making Query Requests (https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html) -// in Using IAM. For information about using security tokens with other AWS -// products, go to AWS Services That Work with IAM (https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html) -// in the IAM User Guide. -// -// If you're new to AWS and need additional technical information about a specific -// AWS product, you can find the product's technical documentation at http://aws.amazon.com/documentation/ -// (http://aws.amazon.com/documentation/). -// -// Endpoints -// -// By default, AWS Security Token Service (STS) is available as a global service, -// and all AWS STS requests go to a single endpoint at https://sts.amazonaws.com. -// Global requests map to the US East (N. Virginia) region. AWS recommends using -// Regional AWS STS endpoints instead of the global endpoint to reduce latency, -// build in redundancy, and increase session token validity. For more information, -// see Managing AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) -// in the IAM User Guide. -// -// Most AWS Regions are enabled for operations in all AWS services by default. -// Those Regions are automatically activated for use with AWS STS. Some Regions, -// such as Asia Pacific (Hong Kong), must be manually enabled. To learn more -// about enabling and disabling AWS Regions, see Managing AWS Regions (https://docs.aws.amazon.com/general/latest/gr/rande-manage.html) -// in the AWS General Reference. When you enable these AWS Regions, they are -// automatically activated for use with AWS STS. You cannot activate the STS -// endpoint for a Region that is disabled. Tokens that are valid in all AWS -// Regions are longer than tokens that are valid in Regions that are enabled -// by default. Changing this setting might affect existing systems where you -// temporarily store tokens. For more information, see Managing Global Endpoint -// Session Tokens (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#sts-regions-manage-tokens) -// in the IAM User Guide. -// -// After you activate a Region for use with AWS STS, you can direct AWS STS -// API calls to that Region. AWS STS recommends that you provide both the Region -// and endpoint when you make calls to a Regional endpoint. You can provide -// the Region alone for manually enabled Regions, such as Asia Pacific (Hong -// Kong). In this case, the calls are directed to the STS Regional endpoint. -// However, if you provide the Region alone for Regions enabled by default, -// the calls are directed to the global endpoint of https://sts.amazonaws.com. -// -// To view the list of AWS STS endpoints and whether they are active by default, -// see Writing Code to Use AWS STS Regions (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#id_credentials_temp_enable-regions_writing_code) -// in the IAM User Guide. -// -// Recording API requests -// -// STS supports AWS CloudTrail, which is a service that records AWS calls for -// your AWS account and delivers log files to an Amazon S3 bucket. By using -// information collected by CloudTrail, you can determine what requests were -// successfully made to STS, who made the request, when it was made, and so -// on. -// -// If you activate AWS STS endpoints in Regions other than the default global -// endpoint, then you must also turn on CloudTrail logging in those Regions. -// This is necessary to record any AWS STS API calls that are made in those -// Regions. For more information, see Turning On CloudTrail in Additional Regions -// (https://docs.aws.amazon.com/awscloudtrail/latest/userguide/aggregating_logs_regions_turn_on_ct.html) -// in the AWS CloudTrail User Guide. -// -// AWS Security Token Service (STS) is a global service with a single endpoint -// at https://sts.amazonaws.com. Calls to this endpoint are logged as calls -// to a global service. However, because this endpoint is physically located -// in the US East (N. Virginia) Region, your logs list us-east-1 as the event -// Region. CloudTrail does not write these logs to the US East (Ohio) Region -// unless you choose to include global service logs in that Region. CloudTrail -// writes calls to all Regional endpoints to their respective Regions. For example, -// calls to sts.us-east-2.amazonaws.com are published to the US East (Ohio) -// Region and calls to sts.eu-central-1.amazonaws.com are published to the EU -// (Frankfurt) Region. -// -// To learn more about CloudTrail, including how to turn it on and find your -// log files, see the AWS CloudTrail User Guide (https://docs.aws.amazon.com/awscloudtrail/latest/userguide/what_is_cloud_trail_top_level.html). -// -// See https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15 for more information on this service. -// -// See sts package documentation for more information. -// https://docs.aws.amazon.com/sdk-for-go/api/service/sts/ -// -// Using the Client -// -// To contact AWS Security Token Service with the SDK use the New function to create -// a new service client. With that client you can make API requests to the service. -// These clients are safe to use concurrently. -// -// See the SDK's documentation for more information on how to use the SDK. -// https://docs.aws.amazon.com/sdk-for-go/api/ -// -// See aws.Config documentation for more information on configuring SDK clients. -// https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config -// -// See the AWS Security Token Service client STS for more -// information on creating client for this service. -// https://docs.aws.amazon.com/sdk-for-go/api/service/sts/#New -package sts diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/errors.go b/vendor/github.com/aws/aws-sdk-go/service/sts/errors.go deleted file mode 100644 index 41ea09c35..000000000 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/errors.go +++ /dev/null @@ -1,73 +0,0 @@ -// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT. - -package sts - -const ( - - // ErrCodeExpiredTokenException for service response error code - // "ExpiredTokenException". - // - // The web identity token that was passed is expired or is not valid. Get a - // new identity token from the identity provider and then retry the request. - ErrCodeExpiredTokenException = "ExpiredTokenException" - - // ErrCodeIDPCommunicationErrorException for service response error code - // "IDPCommunicationError". - // - // The request could not be fulfilled because the non-AWS identity provider - // (IDP) that was asked to verify the incoming identity token could not be reached. - // This is often a transient error caused by network conditions. Retry the request - // a limited number of times so that you don't exceed the request rate. If the - // error persists, the non-AWS identity provider might be down or not responding. - ErrCodeIDPCommunicationErrorException = "IDPCommunicationError" - - // ErrCodeIDPRejectedClaimException for service response error code - // "IDPRejectedClaim". - // - // The identity provider (IdP) reported that authentication failed. This might - // be because the claim is invalid. - // - // If this error is returned for the AssumeRoleWithWebIdentity operation, it - // can also mean that the claim has expired or has been explicitly revoked. - ErrCodeIDPRejectedClaimException = "IDPRejectedClaim" - - // ErrCodeInvalidAuthorizationMessageException for service response error code - // "InvalidAuthorizationMessageException". - // - // The error returned if the message passed to DecodeAuthorizationMessage was - // invalid. This can happen if the token contains invalid characters, such as - // linebreaks. - ErrCodeInvalidAuthorizationMessageException = "InvalidAuthorizationMessageException" - - // ErrCodeInvalidIdentityTokenException for service response error code - // "InvalidIdentityToken". - // - // The web identity token that was passed could not be validated by AWS. Get - // a new identity token from the identity provider and then retry the request. - ErrCodeInvalidIdentityTokenException = "InvalidIdentityToken" - - // ErrCodeMalformedPolicyDocumentException for service response error code - // "MalformedPolicyDocument". - // - // The request was rejected because the policy document was malformed. The error - // message describes the specific error. - ErrCodeMalformedPolicyDocumentException = "MalformedPolicyDocument" - - // ErrCodePackedPolicyTooLargeException for service response error code - // "PackedPolicyTooLarge". - // - // The request was rejected because the policy document was too large. The error - // message describes how big the policy document is, in packed form, as a percentage - // of what the API allows. - ErrCodePackedPolicyTooLargeException = "PackedPolicyTooLarge" - - // ErrCodeRegionDisabledException for service response error code - // "RegionDisabledException". - // - // STS is not activated in the requested region for the account that is being - // asked to generate credentials. The account administrator must use the IAM - // console to activate STS in that region. For more information, see Activating - // and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html) - // in the IAM User Guide. - ErrCodeRegionDisabledException = "RegionDisabledException" -) diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/service.go b/vendor/github.com/aws/aws-sdk-go/service/sts/service.go deleted file mode 100644 index 185c914d1..000000000 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/service.go +++ /dev/null @@ -1,95 +0,0 @@ -// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT. - -package sts - -import ( - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/client" - "github.com/aws/aws-sdk-go/aws/client/metadata" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/aws/signer/v4" - "github.com/aws/aws-sdk-go/private/protocol/query" -) - -// STS provides the API operation methods for making requests to -// AWS Security Token Service. See this package's package overview docs -// for details on the service. -// -// STS methods are safe to use concurrently. It is not safe to -// modify mutate any of the struct's properties though. -type STS struct { - *client.Client -} - -// Used for custom client initialization logic -var initClient func(*client.Client) - -// Used for custom request initialization logic -var initRequest func(*request.Request) - -// Service information constants -const ( - ServiceName = "sts" // Name of service. - EndpointsID = ServiceName // ID to lookup a service endpoint with. - ServiceID = "STS" // ServiceID is a unique identifer of a specific service. -) - -// New creates a new instance of the STS client with a session. -// If additional configuration is needed for the client instance use the optional -// aws.Config parameter to add your extra config. -// -// Example: -// // Create a STS client from just a session. -// svc := sts.New(mySession) -// -// // Create a STS client with additional configuration -// svc := sts.New(mySession, aws.NewConfig().WithRegion("us-west-2")) -func New(p client.ConfigProvider, cfgs ...*aws.Config) *STS { - c := p.ClientConfig(EndpointsID, cfgs...) - return newClient(*c.Config, c.Handlers, c.Endpoint, c.SigningRegion, c.SigningName) -} - -// newClient creates, initializes and returns a new service client instance. -func newClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegion, signingName string) *STS { - svc := &STS{ - Client: client.New( - cfg, - metadata.ClientInfo{ - ServiceName: ServiceName, - ServiceID: ServiceID, - SigningName: signingName, - SigningRegion: signingRegion, - Endpoint: endpoint, - APIVersion: "2011-06-15", - }, - handlers, - ), - } - - // Handlers - svc.Handlers.Sign.PushBackNamed(v4.SignRequestHandler) - svc.Handlers.Build.PushBackNamed(query.BuildHandler) - svc.Handlers.Unmarshal.PushBackNamed(query.UnmarshalHandler) - svc.Handlers.UnmarshalMeta.PushBackNamed(query.UnmarshalMetaHandler) - svc.Handlers.UnmarshalError.PushBackNamed(query.UnmarshalErrorHandler) - - // Run custom client initialization if present - if initClient != nil { - initClient(svc.Client) - } - - return svc -} - -// newRequest creates a new request for a STS operation and runs any -// custom request initialization. -func (c *STS) newRequest(op *request.Operation, params, data interface{}) *request.Request { - req := c.NewRequest(op, params, data) - - // Run custom request initialization if present - if initRequest != nil { - initRequest(req) - } - - return req -} diff --git a/vendor/github.com/aws/aws-sdk-go/service/sts/stsiface/interface.go b/vendor/github.com/aws/aws-sdk-go/service/sts/stsiface/interface.go deleted file mode 100644 index e2e1d6efe..000000000 --- a/vendor/github.com/aws/aws-sdk-go/service/sts/stsiface/interface.go +++ /dev/null @@ -1,96 +0,0 @@ -// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT. - -// Package stsiface provides an interface to enable mocking the AWS Security Token Service service client -// for testing your code. -// -// It is important to note that this interface will have breaking changes -// when the service model is updated and adds new API operations, paginators, -// and waiters. -package stsiface - -import ( - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/service/sts" -) - -// STSAPI provides an interface to enable mocking the -// sts.STS service client's API operation, -// paginators, and waiters. This make unit testing your code that calls out -// to the SDK's service client's calls easier. -// -// The best way to use this interface is so the SDK's service client's calls -// can be stubbed out for unit testing your code with the SDK without needing -// to inject custom request handlers into the SDK's request pipeline. -// -// // myFunc uses an SDK service client to make a request to -// // AWS Security Token Service. -// func myFunc(svc stsiface.STSAPI) bool { -// // Make svc.AssumeRole request -// } -// -// func main() { -// sess := session.New() -// svc := sts.New(sess) -// -// myFunc(svc) -// } -// -// In your _test.go file: -// -// // Define a mock struct to be used in your unit tests of myFunc. -// type mockSTSClient struct { -// stsiface.STSAPI -// } -// func (m *mockSTSClient) AssumeRole(input *sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error) { -// // mock response/functionality -// } -// -// func TestMyFunc(t *testing.T) { -// // Setup Test -// mockSvc := &mockSTSClient{} -// -// myfunc(mockSvc) -// -// // Verify myFunc's functionality -// } -// -// It is important to note that this interface will have breaking changes -// when the service model is updated and adds new API operations, paginators, -// and waiters. Its suggested to use the pattern above for testing, or using -// tooling to generate mocks to satisfy the interfaces. -type STSAPI interface { - AssumeRole(*sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error) - AssumeRoleWithContext(aws.Context, *sts.AssumeRoleInput, ...request.Option) (*sts.AssumeRoleOutput, error) - AssumeRoleRequest(*sts.AssumeRoleInput) (*request.Request, *sts.AssumeRoleOutput) - - AssumeRoleWithSAML(*sts.AssumeRoleWithSAMLInput) (*sts.AssumeRoleWithSAMLOutput, error) - AssumeRoleWithSAMLWithContext(aws.Context, *sts.AssumeRoleWithSAMLInput, ...request.Option) (*sts.AssumeRoleWithSAMLOutput, error) - AssumeRoleWithSAMLRequest(*sts.AssumeRoleWithSAMLInput) (*request.Request, *sts.AssumeRoleWithSAMLOutput) - - AssumeRoleWithWebIdentity(*sts.AssumeRoleWithWebIdentityInput) (*sts.AssumeRoleWithWebIdentityOutput, error) - AssumeRoleWithWebIdentityWithContext(aws.Context, *sts.AssumeRoleWithWebIdentityInput, ...request.Option) (*sts.AssumeRoleWithWebIdentityOutput, error) - AssumeRoleWithWebIdentityRequest(*sts.AssumeRoleWithWebIdentityInput) (*request.Request, *sts.AssumeRoleWithWebIdentityOutput) - - DecodeAuthorizationMessage(*sts.DecodeAuthorizationMessageInput) (*sts.DecodeAuthorizationMessageOutput, error) - DecodeAuthorizationMessageWithContext(aws.Context, *sts.DecodeAuthorizationMessageInput, ...request.Option) (*sts.DecodeAuthorizationMessageOutput, error) - DecodeAuthorizationMessageRequest(*sts.DecodeAuthorizationMessageInput) (*request.Request, *sts.DecodeAuthorizationMessageOutput) - - GetAccessKeyInfo(*sts.GetAccessKeyInfoInput) (*sts.GetAccessKeyInfoOutput, error) - GetAccessKeyInfoWithContext(aws.Context, *sts.GetAccessKeyInfoInput, ...request.Option) (*sts.GetAccessKeyInfoOutput, error) - GetAccessKeyInfoRequest(*sts.GetAccessKeyInfoInput) (*request.Request, *sts.GetAccessKeyInfoOutput) - - GetCallerIdentity(*sts.GetCallerIdentityInput) (*sts.GetCallerIdentityOutput, error) - GetCallerIdentityWithContext(aws.Context, *sts.GetCallerIdentityInput, ...request.Option) (*sts.GetCallerIdentityOutput, error) - GetCallerIdentityRequest(*sts.GetCallerIdentityInput) (*request.Request, *sts.GetCallerIdentityOutput) - - GetFederationToken(*sts.GetFederationTokenInput) (*sts.GetFederationTokenOutput, error) - GetFederationTokenWithContext(aws.Context, *sts.GetFederationTokenInput, ...request.Option) (*sts.GetFederationTokenOutput, error) - GetFederationTokenRequest(*sts.GetFederationTokenInput) (*request.Request, *sts.GetFederationTokenOutput) - - GetSessionToken(*sts.GetSessionTokenInput) (*sts.GetSessionTokenOutput, error) - GetSessionTokenWithContext(aws.Context, *sts.GetSessionTokenInput, ...request.Option) (*sts.GetSessionTokenOutput, error) - GetSessionTokenRequest(*sts.GetSessionTokenInput) (*request.Request, *sts.GetSessionTokenOutput) -} - -var _ STSAPI = (*sts.STS)(nil) diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/AUTHORS b/vendor/github.com/census-instrumentation/opencensus-proto/AUTHORS deleted file mode 100644 index e068e731e..000000000 --- a/vendor/github.com/census-instrumentation/opencensus-proto/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Google Inc. \ No newline at end of file diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/LICENSE b/vendor/github.com/census-instrumentation/opencensus-proto/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/vendor/github.com/census-instrumentation/opencensus-proto/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1/common.pb.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1/common.pb.go deleted file mode 100644 index a6f0febe2..000000000 --- a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1/common.pb.go +++ /dev/null @@ -1,361 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: opencensus/proto/agent/common/v1/common.proto - -package v1 - -import ( - fmt "fmt" - proto "github.com/golang/protobuf/proto" - timestamp "github.com/golang/protobuf/ptypes/timestamp" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -type LibraryInfo_Language int32 - -const ( - LibraryInfo_LANGUAGE_UNSPECIFIED LibraryInfo_Language = 0 - LibraryInfo_CPP LibraryInfo_Language = 1 - LibraryInfo_C_SHARP LibraryInfo_Language = 2 - LibraryInfo_ERLANG LibraryInfo_Language = 3 - LibraryInfo_GO_LANG LibraryInfo_Language = 4 - LibraryInfo_JAVA LibraryInfo_Language = 5 - LibraryInfo_NODE_JS LibraryInfo_Language = 6 - LibraryInfo_PHP LibraryInfo_Language = 7 - LibraryInfo_PYTHON LibraryInfo_Language = 8 - LibraryInfo_RUBY LibraryInfo_Language = 9 - LibraryInfo_WEB_JS LibraryInfo_Language = 10 -) - -var LibraryInfo_Language_name = map[int32]string{ - 0: "LANGUAGE_UNSPECIFIED", - 1: "CPP", - 2: "C_SHARP", - 3: "ERLANG", - 4: "GO_LANG", - 5: "JAVA", - 6: "NODE_JS", - 7: "PHP", - 8: "PYTHON", - 9: "RUBY", - 10: "WEB_JS", -} - -var LibraryInfo_Language_value = map[string]int32{ - "LANGUAGE_UNSPECIFIED": 0, - "CPP": 1, - "C_SHARP": 2, - "ERLANG": 3, - "GO_LANG": 4, - "JAVA": 5, - "NODE_JS": 6, - "PHP": 7, - "PYTHON": 8, - "RUBY": 9, - "WEB_JS": 10, -} - -func (x LibraryInfo_Language) String() string { - return proto.EnumName(LibraryInfo_Language_name, int32(x)) -} - -func (LibraryInfo_Language) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_126c72ed8a252c84, []int{2, 0} -} - -// Identifier metadata of the Node that produces the span or tracing data. -// Note, this is not the metadata about the Node or service that is described by associated spans. -// In the future we plan to extend the identifier proto definition to support -// additional information (e.g cloud id, etc.) -type Node struct { - // Identifier that uniquely identifies a process within a VM/container. - Identifier *ProcessIdentifier `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"` - // Information on the OpenCensus Library that initiates the stream. - LibraryInfo *LibraryInfo `protobuf:"bytes,2,opt,name=library_info,json=libraryInfo,proto3" json:"library_info,omitempty"` - // Additional information on service. - ServiceInfo *ServiceInfo `protobuf:"bytes,3,opt,name=service_info,json=serviceInfo,proto3" json:"service_info,omitempty"` - // Additional attributes. - Attributes map[string]string `protobuf:"bytes,4,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Node) Reset() { *m = Node{} } -func (m *Node) String() string { return proto.CompactTextString(m) } -func (*Node) ProtoMessage() {} -func (*Node) Descriptor() ([]byte, []int) { - return fileDescriptor_126c72ed8a252c84, []int{0} -} - -func (m *Node) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Node.Unmarshal(m, b) -} -func (m *Node) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Node.Marshal(b, m, deterministic) -} -func (m *Node) XXX_Merge(src proto.Message) { - xxx_messageInfo_Node.Merge(m, src) -} -func (m *Node) XXX_Size() int { - return xxx_messageInfo_Node.Size(m) -} -func (m *Node) XXX_DiscardUnknown() { - xxx_messageInfo_Node.DiscardUnknown(m) -} - -var xxx_messageInfo_Node proto.InternalMessageInfo - -func (m *Node) GetIdentifier() *ProcessIdentifier { - if m != nil { - return m.Identifier - } - return nil -} - -func (m *Node) GetLibraryInfo() *LibraryInfo { - if m != nil { - return m.LibraryInfo - } - return nil -} - -func (m *Node) GetServiceInfo() *ServiceInfo { - if m != nil { - return m.ServiceInfo - } - return nil -} - -func (m *Node) GetAttributes() map[string]string { - if m != nil { - return m.Attributes - } - return nil -} - -// Identifier that uniquely identifies a process within a VM/container. -type ProcessIdentifier struct { - // The host name. Usually refers to the machine/container name. - // For example: os.Hostname() in Go, socket.gethostname() in Python. - HostName string `protobuf:"bytes,1,opt,name=host_name,json=hostName,proto3" json:"host_name,omitempty"` - // Process id. - Pid uint32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` - // Start time of this ProcessIdentifier. Represented in epoch time. - StartTimestamp *timestamp.Timestamp `protobuf:"bytes,3,opt,name=start_timestamp,json=startTimestamp,proto3" json:"start_timestamp,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ProcessIdentifier) Reset() { *m = ProcessIdentifier{} } -func (m *ProcessIdentifier) String() string { return proto.CompactTextString(m) } -func (*ProcessIdentifier) ProtoMessage() {} -func (*ProcessIdentifier) Descriptor() ([]byte, []int) { - return fileDescriptor_126c72ed8a252c84, []int{1} -} - -func (m *ProcessIdentifier) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ProcessIdentifier.Unmarshal(m, b) -} -func (m *ProcessIdentifier) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ProcessIdentifier.Marshal(b, m, deterministic) -} -func (m *ProcessIdentifier) XXX_Merge(src proto.Message) { - xxx_messageInfo_ProcessIdentifier.Merge(m, src) -} -func (m *ProcessIdentifier) XXX_Size() int { - return xxx_messageInfo_ProcessIdentifier.Size(m) -} -func (m *ProcessIdentifier) XXX_DiscardUnknown() { - xxx_messageInfo_ProcessIdentifier.DiscardUnknown(m) -} - -var xxx_messageInfo_ProcessIdentifier proto.InternalMessageInfo - -func (m *ProcessIdentifier) GetHostName() string { - if m != nil { - return m.HostName - } - return "" -} - -func (m *ProcessIdentifier) GetPid() uint32 { - if m != nil { - return m.Pid - } - return 0 -} - -func (m *ProcessIdentifier) GetStartTimestamp() *timestamp.Timestamp { - if m != nil { - return m.StartTimestamp - } - return nil -} - -// Information on OpenCensus Library. -type LibraryInfo struct { - // Language of OpenCensus Library. - Language LibraryInfo_Language `protobuf:"varint,1,opt,name=language,proto3,enum=opencensus.proto.agent.common.v1.LibraryInfo_Language" json:"language,omitempty"` - // Version of Agent exporter of Library. - ExporterVersion string `protobuf:"bytes,2,opt,name=exporter_version,json=exporterVersion,proto3" json:"exporter_version,omitempty"` - // Version of OpenCensus Library. - CoreLibraryVersion string `protobuf:"bytes,3,opt,name=core_library_version,json=coreLibraryVersion,proto3" json:"core_library_version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LibraryInfo) Reset() { *m = LibraryInfo{} } -func (m *LibraryInfo) String() string { return proto.CompactTextString(m) } -func (*LibraryInfo) ProtoMessage() {} -func (*LibraryInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_126c72ed8a252c84, []int{2} -} - -func (m *LibraryInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LibraryInfo.Unmarshal(m, b) -} -func (m *LibraryInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LibraryInfo.Marshal(b, m, deterministic) -} -func (m *LibraryInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_LibraryInfo.Merge(m, src) -} -func (m *LibraryInfo) XXX_Size() int { - return xxx_messageInfo_LibraryInfo.Size(m) -} -func (m *LibraryInfo) XXX_DiscardUnknown() { - xxx_messageInfo_LibraryInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_LibraryInfo proto.InternalMessageInfo - -func (m *LibraryInfo) GetLanguage() LibraryInfo_Language { - if m != nil { - return m.Language - } - return LibraryInfo_LANGUAGE_UNSPECIFIED -} - -func (m *LibraryInfo) GetExporterVersion() string { - if m != nil { - return m.ExporterVersion - } - return "" -} - -func (m *LibraryInfo) GetCoreLibraryVersion() string { - if m != nil { - return m.CoreLibraryVersion - } - return "" -} - -// Additional service information. -type ServiceInfo struct { - // Name of the service. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ServiceInfo) Reset() { *m = ServiceInfo{} } -func (m *ServiceInfo) String() string { return proto.CompactTextString(m) } -func (*ServiceInfo) ProtoMessage() {} -func (*ServiceInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_126c72ed8a252c84, []int{3} -} - -func (m *ServiceInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ServiceInfo.Unmarshal(m, b) -} -func (m *ServiceInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ServiceInfo.Marshal(b, m, deterministic) -} -func (m *ServiceInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceInfo.Merge(m, src) -} -func (m *ServiceInfo) XXX_Size() int { - return xxx_messageInfo_ServiceInfo.Size(m) -} -func (m *ServiceInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceInfo proto.InternalMessageInfo - -func (m *ServiceInfo) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func init() { - proto.RegisterEnum("opencensus.proto.agent.common.v1.LibraryInfo_Language", LibraryInfo_Language_name, LibraryInfo_Language_value) - proto.RegisterType((*Node)(nil), "opencensus.proto.agent.common.v1.Node") - proto.RegisterMapType((map[string]string)(nil), "opencensus.proto.agent.common.v1.Node.AttributesEntry") - proto.RegisterType((*ProcessIdentifier)(nil), "opencensus.proto.agent.common.v1.ProcessIdentifier") - proto.RegisterType((*LibraryInfo)(nil), "opencensus.proto.agent.common.v1.LibraryInfo") - proto.RegisterType((*ServiceInfo)(nil), "opencensus.proto.agent.common.v1.ServiceInfo") -} - -func init() { - proto.RegisterFile("opencensus/proto/agent/common/v1/common.proto", fileDescriptor_126c72ed8a252c84) -} - -var fileDescriptor_126c72ed8a252c84 = []byte{ - // 618 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0x4f, 0x6e, 0xda, 0x4e, - 0x14, 0xc7, 0x7f, 0xc6, 0x24, 0x81, 0xe7, 0x5f, 0x13, 0x77, 0x94, 0x05, 0x4a, 0x17, 0xa5, 0x74, - 0x93, 0x2e, 0xb0, 0x9b, 0x44, 0xaa, 0xaa, 0x4a, 0x5d, 0x18, 0xe2, 0x26, 0x44, 0x11, 0x58, 0x26, - 0xa1, 0x4a, 0x37, 0x96, 0x21, 0x83, 0x33, 0x2a, 0x9e, 0x41, 0xe3, 0x31, 0x2a, 0x27, 0xe8, 0x09, - 0xda, 0x03, 0xf4, 0x50, 0x3d, 0x44, 0x4f, 0x51, 0xcd, 0x8c, 0x01, 0xab, 0x59, 0x90, 0xdd, 0xfb, - 0xf3, 0xfd, 0x7e, 0x9e, 0xf5, 0xe6, 0xc9, 0xd0, 0x66, 0x73, 0x4c, 0x27, 0x98, 0x66, 0x79, 0xe6, - 0xce, 0x39, 0x13, 0xcc, 0x8d, 0x13, 0x4c, 0x85, 0x3b, 0x61, 0x69, 0xca, 0xa8, 0xbb, 0x38, 0x29, - 0x22, 0x47, 0x35, 0x51, 0x73, 0x23, 0xd7, 0x15, 0x47, 0xc9, 0x9d, 0x42, 0xb4, 0x38, 0x39, 0x7a, - 0x99, 0x30, 0x96, 0xcc, 0xb0, 0x86, 0x8d, 0xf3, 0xa9, 0x2b, 0x48, 0x8a, 0x33, 0x11, 0xa7, 0x73, - 0x6d, 0x68, 0xfd, 0x34, 0xa1, 0xda, 0x67, 0xf7, 0x18, 0x0d, 0x01, 0xc8, 0x3d, 0xa6, 0x82, 0x4c, - 0x09, 0xe6, 0x0d, 0xa3, 0x69, 0x1c, 0x5b, 0xa7, 0x67, 0xce, 0xb6, 0x01, 0x4e, 0xc0, 0xd9, 0x04, - 0x67, 0x59, 0x6f, 0x6d, 0x0d, 0x4b, 0x18, 0x14, 0xc0, 0xff, 0x33, 0x32, 0xe6, 0x31, 0x5f, 0x46, - 0x84, 0x4e, 0x59, 0xa3, 0xa2, 0xb0, 0xed, 0xed, 0xd8, 0x6b, 0xed, 0xea, 0xd1, 0x29, 0x0b, 0xad, - 0xd9, 0x26, 0x91, 0xc4, 0x0c, 0xf3, 0x05, 0x99, 0x60, 0x4d, 0x34, 0x9f, 0x4a, 0x1c, 0x6a, 0x97, - 0x26, 0x66, 0x9b, 0x04, 0x8d, 0x00, 0x62, 0x21, 0x38, 0x19, 0xe7, 0x02, 0x67, 0x8d, 0x6a, 0xd3, - 0x3c, 0xb6, 0x4e, 0xdf, 0x6d, 0xe7, 0xc9, 0xa5, 0x39, 0xde, 0xda, 0xe8, 0x53, 0xc1, 0x97, 0x61, - 0x89, 0x74, 0xf4, 0x11, 0x0e, 0xfe, 0x69, 0x23, 0x1b, 0xcc, 0xaf, 0x78, 0xa9, 0x96, 0x5b, 0x0f, - 0x65, 0x88, 0x0e, 0x61, 0x67, 0x11, 0xcf, 0x72, 0xac, 0x36, 0x53, 0x0f, 0x75, 0xf2, 0xa1, 0xf2, - 0xde, 0x68, 0x7d, 0x37, 0xe0, 0xf9, 0xa3, 0xe5, 0xa2, 0x17, 0x50, 0x7f, 0x60, 0x99, 0x88, 0x68, - 0x9c, 0xe2, 0x82, 0x53, 0x93, 0x85, 0x7e, 0x9c, 0x62, 0x89, 0x9f, 0x93, 0x7b, 0x85, 0x7a, 0x16, - 0xca, 0x10, 0x75, 0xe1, 0x20, 0x13, 0x31, 0x17, 0xd1, 0xfa, 0xd9, 0x8b, 0x85, 0x1d, 0x39, 0xfa, - 0x30, 0x9c, 0xd5, 0x61, 0x38, 0x37, 0x2b, 0x45, 0xb8, 0xaf, 0x2c, 0xeb, 0xbc, 0xf5, 0xbb, 0x02, - 0x56, 0xe9, 0x3d, 0x50, 0x08, 0xb5, 0x59, 0x4c, 0x93, 0x3c, 0x4e, 0xf4, 0x27, 0xec, 0x3f, 0x65, - 0x5d, 0x25, 0x80, 0x73, 0x5d, 0xb8, 0xc3, 0x35, 0x07, 0xbd, 0x01, 0x1b, 0x7f, 0x9b, 0x33, 0x2e, - 0x30, 0x8f, 0x16, 0x98, 0x67, 0x84, 0xd1, 0x62, 0x25, 0x07, 0xab, 0xfa, 0x48, 0x97, 0xd1, 0x5b, - 0x38, 0x9c, 0x30, 0x8e, 0xa3, 0xd5, 0x61, 0xad, 0xe4, 0xa6, 0x92, 0x23, 0xd9, 0x2b, 0x86, 0x15, - 0x8e, 0xd6, 0x0f, 0x03, 0x6a, 0xab, 0x99, 0xa8, 0x01, 0x87, 0xd7, 0x5e, 0xff, 0xe2, 0xd6, 0xbb, - 0xf0, 0xa3, 0xdb, 0xfe, 0x30, 0xf0, 0xbb, 0xbd, 0x4f, 0x3d, 0xff, 0xdc, 0xfe, 0x0f, 0xed, 0x81, - 0xd9, 0x0d, 0x02, 0xdb, 0x40, 0x16, 0xec, 0x75, 0xa3, 0xe1, 0xa5, 0x17, 0x06, 0x76, 0x05, 0x01, - 0xec, 0xfa, 0xa1, 0x74, 0xd8, 0xa6, 0x6c, 0x5c, 0x0c, 0x22, 0x95, 0x54, 0x51, 0x0d, 0xaa, 0x57, - 0xde, 0xc8, 0xb3, 0x77, 0x64, 0xb9, 0x3f, 0x38, 0xf7, 0xa3, 0xab, 0xa1, 0xbd, 0x2b, 0x29, 0xc1, - 0x65, 0x60, 0xef, 0x49, 0x63, 0x70, 0x77, 0x73, 0x39, 0xe8, 0xdb, 0x35, 0xa9, 0x0d, 0x6f, 0x3b, - 0x77, 0x76, 0x5d, 0x56, 0x3f, 0xfb, 0x1d, 0x29, 0x85, 0xd6, 0x2b, 0xb0, 0x4a, 0x57, 0x89, 0x10, - 0x54, 0x4b, 0xcf, 0xaa, 0xe2, 0xce, 0x2f, 0x03, 0x5e, 0x13, 0xb6, 0x75, 0xbd, 0x1d, 0xab, 0xab, - 0xc2, 0x40, 0x36, 0x03, 0xe3, 0x4b, 0x2f, 0x21, 0xe2, 0x21, 0x1f, 0x4b, 0x81, 0xab, 0x7d, 0x6d, - 0x42, 0x33, 0xc1, 0xf3, 0x14, 0x53, 0x11, 0x0b, 0xc2, 0xa8, 0xbb, 0x41, 0xb6, 0xf5, 0x9f, 0x26, - 0xc1, 0xb4, 0x9d, 0x3c, 0xfa, 0xe1, 0xfc, 0xa9, 0x34, 0x07, 0x73, 0x4c, 0xbb, 0x7a, 0xb8, 0xe2, - 0x3b, 0x9e, 0x1a, 0xae, 0x27, 0x3a, 0xa3, 0x93, 0xf1, 0xae, 0x02, 0x9c, 0xfd, 0x0d, 0x00, 0x00, - 0xff, 0xff, 0xe3, 0x53, 0x74, 0x5e, 0xbe, 0x04, 0x00, 0x00, -} diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1/metrics.pb.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1/metrics.pb.go deleted file mode 100644 index 466b23428..000000000 --- a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1/metrics.pb.go +++ /dev/null @@ -1,1127 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: opencensus/proto/metrics/v1/metrics.proto - -package v1 - -import ( - fmt "fmt" - v1 "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1" - proto "github.com/golang/protobuf/proto" - timestamp "github.com/golang/protobuf/ptypes/timestamp" - wrappers "github.com/golang/protobuf/ptypes/wrappers" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The kind of metric. It describes how the data is reported. -// -// A gauge is an instantaneous measurement of a value. -// -// A cumulative measurement is a value accumulated over a time interval. In -// a time series, cumulative measurements should have the same start time, -// increasing values and increasing end times, until an event resets the -// cumulative value to zero and sets a new start time for the following -// points. -type MetricDescriptor_Type int32 - -const ( - // Do not use this default value. - MetricDescriptor_UNSPECIFIED MetricDescriptor_Type = 0 - // Integer gauge. The value can go both up and down. - MetricDescriptor_GAUGE_INT64 MetricDescriptor_Type = 1 - // Floating point gauge. The value can go both up and down. - MetricDescriptor_GAUGE_DOUBLE MetricDescriptor_Type = 2 - // Distribution gauge measurement. The count and sum can go both up and - // down. Recorded values are always >= 0. - // Used in scenarios like a snapshot of time the current items in a queue - // have spent there. - MetricDescriptor_GAUGE_DISTRIBUTION MetricDescriptor_Type = 3 - // Integer cumulative measurement. The value cannot decrease, if resets - // then the start_time should also be reset. - MetricDescriptor_CUMULATIVE_INT64 MetricDescriptor_Type = 4 - // Floating point cumulative measurement. The value cannot decrease, if - // resets then the start_time should also be reset. Recorded values are - // always >= 0. - MetricDescriptor_CUMULATIVE_DOUBLE MetricDescriptor_Type = 5 - // Distribution cumulative measurement. The count and sum cannot decrease, - // if resets then the start_time should also be reset. - MetricDescriptor_CUMULATIVE_DISTRIBUTION MetricDescriptor_Type = 6 - // Some frameworks implemented Histograms as a summary of observations - // (usually things like request durations and response sizes). While it - // also provides a total count of observations and a sum of all observed - // values, it calculates configurable percentiles over a sliding time - // window. This is not recommended, since it cannot be aggregated. - MetricDescriptor_SUMMARY MetricDescriptor_Type = 7 -) - -var MetricDescriptor_Type_name = map[int32]string{ - 0: "UNSPECIFIED", - 1: "GAUGE_INT64", - 2: "GAUGE_DOUBLE", - 3: "GAUGE_DISTRIBUTION", - 4: "CUMULATIVE_INT64", - 5: "CUMULATIVE_DOUBLE", - 6: "CUMULATIVE_DISTRIBUTION", - 7: "SUMMARY", -} - -var MetricDescriptor_Type_value = map[string]int32{ - "UNSPECIFIED": 0, - "GAUGE_INT64": 1, - "GAUGE_DOUBLE": 2, - "GAUGE_DISTRIBUTION": 3, - "CUMULATIVE_INT64": 4, - "CUMULATIVE_DOUBLE": 5, - "CUMULATIVE_DISTRIBUTION": 6, - "SUMMARY": 7, -} - -func (x MetricDescriptor_Type) String() string { - return proto.EnumName(MetricDescriptor_Type_name, int32(x)) -} - -func (MetricDescriptor_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{1, 0} -} - -// Defines a Metric which has one or more timeseries. -type Metric struct { - // The descriptor of the Metric. - // TODO(issue #152): consider only sending the name of descriptor for - // optimization. - MetricDescriptor *MetricDescriptor `protobuf:"bytes,1,opt,name=metric_descriptor,json=metricDescriptor,proto3" json:"metric_descriptor,omitempty"` - // One or more timeseries for a single metric, where each timeseries has - // one or more points. - Timeseries []*TimeSeries `protobuf:"bytes,2,rep,name=timeseries,proto3" json:"timeseries,omitempty"` - // The resource for the metric. If unset, it may be set to a default value - // provided for a sequence of messages in an RPC stream. - Resource *v1.Resource `protobuf:"bytes,3,opt,name=resource,proto3" json:"resource,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Metric) Reset() { *m = Metric{} } -func (m *Metric) String() string { return proto.CompactTextString(m) } -func (*Metric) ProtoMessage() {} -func (*Metric) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{0} -} - -func (m *Metric) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Metric.Unmarshal(m, b) -} -func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Metric.Marshal(b, m, deterministic) -} -func (m *Metric) XXX_Merge(src proto.Message) { - xxx_messageInfo_Metric.Merge(m, src) -} -func (m *Metric) XXX_Size() int { - return xxx_messageInfo_Metric.Size(m) -} -func (m *Metric) XXX_DiscardUnknown() { - xxx_messageInfo_Metric.DiscardUnknown(m) -} - -var xxx_messageInfo_Metric proto.InternalMessageInfo - -func (m *Metric) GetMetricDescriptor() *MetricDescriptor { - if m != nil { - return m.MetricDescriptor - } - return nil -} - -func (m *Metric) GetTimeseries() []*TimeSeries { - if m != nil { - return m.Timeseries - } - return nil -} - -func (m *Metric) GetResource() *v1.Resource { - if m != nil { - return m.Resource - } - return nil -} - -// Defines a metric type and its schema. -type MetricDescriptor struct { - // The metric type, including its DNS name prefix. It must be unique. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // A detailed description of the metric, which can be used in documentation. - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - // The unit in which the metric value is reported. Follows the format - // described by http://unitsofmeasure.org/ucum.html. - Unit string `protobuf:"bytes,3,opt,name=unit,proto3" json:"unit,omitempty"` - Type MetricDescriptor_Type `protobuf:"varint,4,opt,name=type,proto3,enum=opencensus.proto.metrics.v1.MetricDescriptor_Type" json:"type,omitempty"` - // The label keys associated with the metric descriptor. - LabelKeys []*LabelKey `protobuf:"bytes,5,rep,name=label_keys,json=labelKeys,proto3" json:"label_keys,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MetricDescriptor) Reset() { *m = MetricDescriptor{} } -func (m *MetricDescriptor) String() string { return proto.CompactTextString(m) } -func (*MetricDescriptor) ProtoMessage() {} -func (*MetricDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{1} -} - -func (m *MetricDescriptor) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MetricDescriptor.Unmarshal(m, b) -} -func (m *MetricDescriptor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MetricDescriptor.Marshal(b, m, deterministic) -} -func (m *MetricDescriptor) XXX_Merge(src proto.Message) { - xxx_messageInfo_MetricDescriptor.Merge(m, src) -} -func (m *MetricDescriptor) XXX_Size() int { - return xxx_messageInfo_MetricDescriptor.Size(m) -} -func (m *MetricDescriptor) XXX_DiscardUnknown() { - xxx_messageInfo_MetricDescriptor.DiscardUnknown(m) -} - -var xxx_messageInfo_MetricDescriptor proto.InternalMessageInfo - -func (m *MetricDescriptor) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *MetricDescriptor) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *MetricDescriptor) GetUnit() string { - if m != nil { - return m.Unit - } - return "" -} - -func (m *MetricDescriptor) GetType() MetricDescriptor_Type { - if m != nil { - return m.Type - } - return MetricDescriptor_UNSPECIFIED -} - -func (m *MetricDescriptor) GetLabelKeys() []*LabelKey { - if m != nil { - return m.LabelKeys - } - return nil -} - -// Defines a label key associated with a metric descriptor. -type LabelKey struct { - // The key for the label. - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - // A human-readable description of what this label key represents. - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LabelKey) Reset() { *m = LabelKey{} } -func (m *LabelKey) String() string { return proto.CompactTextString(m) } -func (*LabelKey) ProtoMessage() {} -func (*LabelKey) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{2} -} - -func (m *LabelKey) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LabelKey.Unmarshal(m, b) -} -func (m *LabelKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LabelKey.Marshal(b, m, deterministic) -} -func (m *LabelKey) XXX_Merge(src proto.Message) { - xxx_messageInfo_LabelKey.Merge(m, src) -} -func (m *LabelKey) XXX_Size() int { - return xxx_messageInfo_LabelKey.Size(m) -} -func (m *LabelKey) XXX_DiscardUnknown() { - xxx_messageInfo_LabelKey.DiscardUnknown(m) -} - -var xxx_messageInfo_LabelKey proto.InternalMessageInfo - -func (m *LabelKey) GetKey() string { - if m != nil { - return m.Key - } - return "" -} - -func (m *LabelKey) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -// A collection of data points that describes the time-varying values -// of a metric. -type TimeSeries struct { - // Must be present for cumulative metrics. The time when the cumulative value - // was reset to zero. Exclusive. The cumulative value is over the time interval - // (start_timestamp, timestamp]. If not specified, the backend can use the - // previous recorded value. - StartTimestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=start_timestamp,json=startTimestamp,proto3" json:"start_timestamp,omitempty"` - // The set of label values that uniquely identify this timeseries. Applies to - // all points. The order of label values must match that of label keys in the - // metric descriptor. - LabelValues []*LabelValue `protobuf:"bytes,2,rep,name=label_values,json=labelValues,proto3" json:"label_values,omitempty"` - // The data points of this timeseries. Point.value type MUST match the - // MetricDescriptor.type. - Points []*Point `protobuf:"bytes,3,rep,name=points,proto3" json:"points,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TimeSeries) Reset() { *m = TimeSeries{} } -func (m *TimeSeries) String() string { return proto.CompactTextString(m) } -func (*TimeSeries) ProtoMessage() {} -func (*TimeSeries) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{3} -} - -func (m *TimeSeries) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_TimeSeries.Unmarshal(m, b) -} -func (m *TimeSeries) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_TimeSeries.Marshal(b, m, deterministic) -} -func (m *TimeSeries) XXX_Merge(src proto.Message) { - xxx_messageInfo_TimeSeries.Merge(m, src) -} -func (m *TimeSeries) XXX_Size() int { - return xxx_messageInfo_TimeSeries.Size(m) -} -func (m *TimeSeries) XXX_DiscardUnknown() { - xxx_messageInfo_TimeSeries.DiscardUnknown(m) -} - -var xxx_messageInfo_TimeSeries proto.InternalMessageInfo - -func (m *TimeSeries) GetStartTimestamp() *timestamp.Timestamp { - if m != nil { - return m.StartTimestamp - } - return nil -} - -func (m *TimeSeries) GetLabelValues() []*LabelValue { - if m != nil { - return m.LabelValues - } - return nil -} - -func (m *TimeSeries) GetPoints() []*Point { - if m != nil { - return m.Points - } - return nil -} - -type LabelValue struct { - // The value for the label. - Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - // If false the value field is ignored and considered not set. - // This is used to differentiate a missing label from an empty string. - HasValue bool `protobuf:"varint,2,opt,name=has_value,json=hasValue,proto3" json:"has_value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LabelValue) Reset() { *m = LabelValue{} } -func (m *LabelValue) String() string { return proto.CompactTextString(m) } -func (*LabelValue) ProtoMessage() {} -func (*LabelValue) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{4} -} - -func (m *LabelValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LabelValue.Unmarshal(m, b) -} -func (m *LabelValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LabelValue.Marshal(b, m, deterministic) -} -func (m *LabelValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_LabelValue.Merge(m, src) -} -func (m *LabelValue) XXX_Size() int { - return xxx_messageInfo_LabelValue.Size(m) -} -func (m *LabelValue) XXX_DiscardUnknown() { - xxx_messageInfo_LabelValue.DiscardUnknown(m) -} - -var xxx_messageInfo_LabelValue proto.InternalMessageInfo - -func (m *LabelValue) GetValue() string { - if m != nil { - return m.Value - } - return "" -} - -func (m *LabelValue) GetHasValue() bool { - if m != nil { - return m.HasValue - } - return false -} - -// A timestamped measurement. -type Point struct { - // The moment when this point was recorded. Inclusive. - // If not specified, the timestamp will be decided by the backend. - Timestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // The actual point value. - // - // Types that are valid to be assigned to Value: - // *Point_Int64Value - // *Point_DoubleValue - // *Point_DistributionValue - // *Point_SummaryValue - Value isPoint_Value `protobuf_oneof:"value"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Point) Reset() { *m = Point{} } -func (m *Point) String() string { return proto.CompactTextString(m) } -func (*Point) ProtoMessage() {} -func (*Point) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{5} -} - -func (m *Point) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Point.Unmarshal(m, b) -} -func (m *Point) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Point.Marshal(b, m, deterministic) -} -func (m *Point) XXX_Merge(src proto.Message) { - xxx_messageInfo_Point.Merge(m, src) -} -func (m *Point) XXX_Size() int { - return xxx_messageInfo_Point.Size(m) -} -func (m *Point) XXX_DiscardUnknown() { - xxx_messageInfo_Point.DiscardUnknown(m) -} - -var xxx_messageInfo_Point proto.InternalMessageInfo - -func (m *Point) GetTimestamp() *timestamp.Timestamp { - if m != nil { - return m.Timestamp - } - return nil -} - -type isPoint_Value interface { - isPoint_Value() -} - -type Point_Int64Value struct { - Int64Value int64 `protobuf:"varint,2,opt,name=int64_value,json=int64Value,proto3,oneof"` -} - -type Point_DoubleValue struct { - DoubleValue float64 `protobuf:"fixed64,3,opt,name=double_value,json=doubleValue,proto3,oneof"` -} - -type Point_DistributionValue struct { - DistributionValue *DistributionValue `protobuf:"bytes,4,opt,name=distribution_value,json=distributionValue,proto3,oneof"` -} - -type Point_SummaryValue struct { - SummaryValue *SummaryValue `protobuf:"bytes,5,opt,name=summary_value,json=summaryValue,proto3,oneof"` -} - -func (*Point_Int64Value) isPoint_Value() {} - -func (*Point_DoubleValue) isPoint_Value() {} - -func (*Point_DistributionValue) isPoint_Value() {} - -func (*Point_SummaryValue) isPoint_Value() {} - -func (m *Point) GetValue() isPoint_Value { - if m != nil { - return m.Value - } - return nil -} - -func (m *Point) GetInt64Value() int64 { - if x, ok := m.GetValue().(*Point_Int64Value); ok { - return x.Int64Value - } - return 0 -} - -func (m *Point) GetDoubleValue() float64 { - if x, ok := m.GetValue().(*Point_DoubleValue); ok { - return x.DoubleValue - } - return 0 -} - -func (m *Point) GetDistributionValue() *DistributionValue { - if x, ok := m.GetValue().(*Point_DistributionValue); ok { - return x.DistributionValue - } - return nil -} - -func (m *Point) GetSummaryValue() *SummaryValue { - if x, ok := m.GetValue().(*Point_SummaryValue); ok { - return x.SummaryValue - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Point) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Point_Int64Value)(nil), - (*Point_DoubleValue)(nil), - (*Point_DistributionValue)(nil), - (*Point_SummaryValue)(nil), - } -} - -// Distribution contains summary statistics for a population of values. It -// optionally contains a histogram representing the distribution of those -// values across a set of buckets. -type DistributionValue struct { - // The number of values in the population. Must be non-negative. This value - // must equal the sum of the values in bucket_counts if a histogram is - // provided. - Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` - // The sum of the values in the population. If count is zero then this field - // must be zero. - Sum float64 `protobuf:"fixed64,2,opt,name=sum,proto3" json:"sum,omitempty"` - // The sum of squared deviations from the mean of the values in the - // population. For values x_i this is: - // - // Sum[i=1..n]((x_i - mean)^2) - // - // Knuth, "The Art of Computer Programming", Vol. 2, page 323, 3rd edition - // describes Welford's method for accumulating this sum in one pass. - // - // If count is zero then this field must be zero. - SumOfSquaredDeviation float64 `protobuf:"fixed64,3,opt,name=sum_of_squared_deviation,json=sumOfSquaredDeviation,proto3" json:"sum_of_squared_deviation,omitempty"` - // Don't change bucket boundaries within a TimeSeries if your backend doesn't - // support this. - // TODO(issue #152): consider not required to send bucket options for - // optimization. - BucketOptions *DistributionValue_BucketOptions `protobuf:"bytes,4,opt,name=bucket_options,json=bucketOptions,proto3" json:"bucket_options,omitempty"` - // If the distribution does not have a histogram, then omit this field. - // If there is a histogram, then the sum of the values in the Bucket counts - // must equal the value in the count field of the distribution. - Buckets []*DistributionValue_Bucket `protobuf:"bytes,5,rep,name=buckets,proto3" json:"buckets,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DistributionValue) Reset() { *m = DistributionValue{} } -func (m *DistributionValue) String() string { return proto.CompactTextString(m) } -func (*DistributionValue) ProtoMessage() {} -func (*DistributionValue) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{6} -} - -func (m *DistributionValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DistributionValue.Unmarshal(m, b) -} -func (m *DistributionValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DistributionValue.Marshal(b, m, deterministic) -} -func (m *DistributionValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_DistributionValue.Merge(m, src) -} -func (m *DistributionValue) XXX_Size() int { - return xxx_messageInfo_DistributionValue.Size(m) -} -func (m *DistributionValue) XXX_DiscardUnknown() { - xxx_messageInfo_DistributionValue.DiscardUnknown(m) -} - -var xxx_messageInfo_DistributionValue proto.InternalMessageInfo - -func (m *DistributionValue) GetCount() int64 { - if m != nil { - return m.Count - } - return 0 -} - -func (m *DistributionValue) GetSum() float64 { - if m != nil { - return m.Sum - } - return 0 -} - -func (m *DistributionValue) GetSumOfSquaredDeviation() float64 { - if m != nil { - return m.SumOfSquaredDeviation - } - return 0 -} - -func (m *DistributionValue) GetBucketOptions() *DistributionValue_BucketOptions { - if m != nil { - return m.BucketOptions - } - return nil -} - -func (m *DistributionValue) GetBuckets() []*DistributionValue_Bucket { - if m != nil { - return m.Buckets - } - return nil -} - -// A Distribution may optionally contain a histogram of the values in the -// population. The bucket boundaries for that histogram are described by -// BucketOptions. -// -// If bucket_options has no type, then there is no histogram associated with -// the Distribution. -type DistributionValue_BucketOptions struct { - // Types that are valid to be assigned to Type: - // *DistributionValue_BucketOptions_Explicit_ - Type isDistributionValue_BucketOptions_Type `protobuf_oneof:"type"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DistributionValue_BucketOptions) Reset() { *m = DistributionValue_BucketOptions{} } -func (m *DistributionValue_BucketOptions) String() string { return proto.CompactTextString(m) } -func (*DistributionValue_BucketOptions) ProtoMessage() {} -func (*DistributionValue_BucketOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{6, 0} -} - -func (m *DistributionValue_BucketOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DistributionValue_BucketOptions.Unmarshal(m, b) -} -func (m *DistributionValue_BucketOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DistributionValue_BucketOptions.Marshal(b, m, deterministic) -} -func (m *DistributionValue_BucketOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_DistributionValue_BucketOptions.Merge(m, src) -} -func (m *DistributionValue_BucketOptions) XXX_Size() int { - return xxx_messageInfo_DistributionValue_BucketOptions.Size(m) -} -func (m *DistributionValue_BucketOptions) XXX_DiscardUnknown() { - xxx_messageInfo_DistributionValue_BucketOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_DistributionValue_BucketOptions proto.InternalMessageInfo - -type isDistributionValue_BucketOptions_Type interface { - isDistributionValue_BucketOptions_Type() -} - -type DistributionValue_BucketOptions_Explicit_ struct { - Explicit *DistributionValue_BucketOptions_Explicit `protobuf:"bytes,1,opt,name=explicit,proto3,oneof"` -} - -func (*DistributionValue_BucketOptions_Explicit_) isDistributionValue_BucketOptions_Type() {} - -func (m *DistributionValue_BucketOptions) GetType() isDistributionValue_BucketOptions_Type { - if m != nil { - return m.Type - } - return nil -} - -func (m *DistributionValue_BucketOptions) GetExplicit() *DistributionValue_BucketOptions_Explicit { - if x, ok := m.GetType().(*DistributionValue_BucketOptions_Explicit_); ok { - return x.Explicit - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*DistributionValue_BucketOptions) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*DistributionValue_BucketOptions_Explicit_)(nil), - } -} - -// Specifies a set of buckets with arbitrary upper-bounds. -// This defines size(bounds) + 1 (= N) buckets. The boundaries for bucket -// index i are: -// -// [0, bucket_bounds[i]) for i == 0 -// [bucket_bounds[i-1], bucket_bounds[i]) for 0 < i < N-1 -// [bucket_bounds[i], +infinity) for i == N-1 -type DistributionValue_BucketOptions_Explicit struct { - // The values must be strictly increasing and > 0. - Bounds []float64 `protobuf:"fixed64,1,rep,packed,name=bounds,proto3" json:"bounds,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DistributionValue_BucketOptions_Explicit) Reset() { - *m = DistributionValue_BucketOptions_Explicit{} -} -func (m *DistributionValue_BucketOptions_Explicit) String() string { return proto.CompactTextString(m) } -func (*DistributionValue_BucketOptions_Explicit) ProtoMessage() {} -func (*DistributionValue_BucketOptions_Explicit) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{6, 0, 0} -} - -func (m *DistributionValue_BucketOptions_Explicit) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Unmarshal(m, b) -} -func (m *DistributionValue_BucketOptions_Explicit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Marshal(b, m, deterministic) -} -func (m *DistributionValue_BucketOptions_Explicit) XXX_Merge(src proto.Message) { - xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Merge(m, src) -} -func (m *DistributionValue_BucketOptions_Explicit) XXX_Size() int { - return xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Size(m) -} -func (m *DistributionValue_BucketOptions_Explicit) XXX_DiscardUnknown() { - xxx_messageInfo_DistributionValue_BucketOptions_Explicit.DiscardUnknown(m) -} - -var xxx_messageInfo_DistributionValue_BucketOptions_Explicit proto.InternalMessageInfo - -func (m *DistributionValue_BucketOptions_Explicit) GetBounds() []float64 { - if m != nil { - return m.Bounds - } - return nil -} - -type DistributionValue_Bucket struct { - // The number of values in each bucket of the histogram, as described in - // bucket_bounds. - Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` - // If the distribution does not have a histogram, then omit this field. - Exemplar *DistributionValue_Exemplar `protobuf:"bytes,2,opt,name=exemplar,proto3" json:"exemplar,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DistributionValue_Bucket) Reset() { *m = DistributionValue_Bucket{} } -func (m *DistributionValue_Bucket) String() string { return proto.CompactTextString(m) } -func (*DistributionValue_Bucket) ProtoMessage() {} -func (*DistributionValue_Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{6, 1} -} - -func (m *DistributionValue_Bucket) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DistributionValue_Bucket.Unmarshal(m, b) -} -func (m *DistributionValue_Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DistributionValue_Bucket.Marshal(b, m, deterministic) -} -func (m *DistributionValue_Bucket) XXX_Merge(src proto.Message) { - xxx_messageInfo_DistributionValue_Bucket.Merge(m, src) -} -func (m *DistributionValue_Bucket) XXX_Size() int { - return xxx_messageInfo_DistributionValue_Bucket.Size(m) -} -func (m *DistributionValue_Bucket) XXX_DiscardUnknown() { - xxx_messageInfo_DistributionValue_Bucket.DiscardUnknown(m) -} - -var xxx_messageInfo_DistributionValue_Bucket proto.InternalMessageInfo - -func (m *DistributionValue_Bucket) GetCount() int64 { - if m != nil { - return m.Count - } - return 0 -} - -func (m *DistributionValue_Bucket) GetExemplar() *DistributionValue_Exemplar { - if m != nil { - return m.Exemplar - } - return nil -} - -// Exemplars are example points that may be used to annotate aggregated -// Distribution values. They are metadata that gives information about a -// particular value added to a Distribution bucket. -type DistributionValue_Exemplar struct { - // Value of the exemplar point. It determines which bucket the exemplar - // belongs to. - Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` - // The observation (sampling) time of the above value. - Timestamp *timestamp.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Contextual information about the example value. - Attachments map[string]string `protobuf:"bytes,3,rep,name=attachments,proto3" json:"attachments,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DistributionValue_Exemplar) Reset() { *m = DistributionValue_Exemplar{} } -func (m *DistributionValue_Exemplar) String() string { return proto.CompactTextString(m) } -func (*DistributionValue_Exemplar) ProtoMessage() {} -func (*DistributionValue_Exemplar) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{6, 2} -} - -func (m *DistributionValue_Exemplar) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DistributionValue_Exemplar.Unmarshal(m, b) -} -func (m *DistributionValue_Exemplar) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DistributionValue_Exemplar.Marshal(b, m, deterministic) -} -func (m *DistributionValue_Exemplar) XXX_Merge(src proto.Message) { - xxx_messageInfo_DistributionValue_Exemplar.Merge(m, src) -} -func (m *DistributionValue_Exemplar) XXX_Size() int { - return xxx_messageInfo_DistributionValue_Exemplar.Size(m) -} -func (m *DistributionValue_Exemplar) XXX_DiscardUnknown() { - xxx_messageInfo_DistributionValue_Exemplar.DiscardUnknown(m) -} - -var xxx_messageInfo_DistributionValue_Exemplar proto.InternalMessageInfo - -func (m *DistributionValue_Exemplar) GetValue() float64 { - if m != nil { - return m.Value - } - return 0 -} - -func (m *DistributionValue_Exemplar) GetTimestamp() *timestamp.Timestamp { - if m != nil { - return m.Timestamp - } - return nil -} - -func (m *DistributionValue_Exemplar) GetAttachments() map[string]string { - if m != nil { - return m.Attachments - } - return nil -} - -// The start_timestamp only applies to the count and sum in the SummaryValue. -type SummaryValue struct { - // The total number of recorded values since start_time. Optional since - // some systems don't expose this. - Count *wrappers.Int64Value `protobuf:"bytes,1,opt,name=count,proto3" json:"count,omitempty"` - // The total sum of recorded values since start_time. Optional since some - // systems don't expose this. If count is zero then this field must be zero. - // This field must be unset if the sum is not available. - Sum *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=sum,proto3" json:"sum,omitempty"` - // Values calculated over an arbitrary time window. - Snapshot *SummaryValue_Snapshot `protobuf:"bytes,3,opt,name=snapshot,proto3" json:"snapshot,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SummaryValue) Reset() { *m = SummaryValue{} } -func (m *SummaryValue) String() string { return proto.CompactTextString(m) } -func (*SummaryValue) ProtoMessage() {} -func (*SummaryValue) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{7} -} - -func (m *SummaryValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SummaryValue.Unmarshal(m, b) -} -func (m *SummaryValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SummaryValue.Marshal(b, m, deterministic) -} -func (m *SummaryValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_SummaryValue.Merge(m, src) -} -func (m *SummaryValue) XXX_Size() int { - return xxx_messageInfo_SummaryValue.Size(m) -} -func (m *SummaryValue) XXX_DiscardUnknown() { - xxx_messageInfo_SummaryValue.DiscardUnknown(m) -} - -var xxx_messageInfo_SummaryValue proto.InternalMessageInfo - -func (m *SummaryValue) GetCount() *wrappers.Int64Value { - if m != nil { - return m.Count - } - return nil -} - -func (m *SummaryValue) GetSum() *wrappers.DoubleValue { - if m != nil { - return m.Sum - } - return nil -} - -func (m *SummaryValue) GetSnapshot() *SummaryValue_Snapshot { - if m != nil { - return m.Snapshot - } - return nil -} - -// The values in this message can be reset at arbitrary unknown times, with -// the requirement that all of them are reset at the same time. -type SummaryValue_Snapshot struct { - // The number of values in the snapshot. Optional since some systems don't - // expose this. - Count *wrappers.Int64Value `protobuf:"bytes,1,opt,name=count,proto3" json:"count,omitempty"` - // The sum of values in the snapshot. Optional since some systems don't - // expose this. If count is zero then this field must be zero or not set - // (if not supported). - Sum *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=sum,proto3" json:"sum,omitempty"` - // A list of values at different percentiles of the distribution calculated - // from the current snapshot. The percentiles must be strictly increasing. - PercentileValues []*SummaryValue_Snapshot_ValueAtPercentile `protobuf:"bytes,3,rep,name=percentile_values,json=percentileValues,proto3" json:"percentile_values,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SummaryValue_Snapshot) Reset() { *m = SummaryValue_Snapshot{} } -func (m *SummaryValue_Snapshot) String() string { return proto.CompactTextString(m) } -func (*SummaryValue_Snapshot) ProtoMessage() {} -func (*SummaryValue_Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{7, 0} -} - -func (m *SummaryValue_Snapshot) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SummaryValue_Snapshot.Unmarshal(m, b) -} -func (m *SummaryValue_Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SummaryValue_Snapshot.Marshal(b, m, deterministic) -} -func (m *SummaryValue_Snapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_SummaryValue_Snapshot.Merge(m, src) -} -func (m *SummaryValue_Snapshot) XXX_Size() int { - return xxx_messageInfo_SummaryValue_Snapshot.Size(m) -} -func (m *SummaryValue_Snapshot) XXX_DiscardUnknown() { - xxx_messageInfo_SummaryValue_Snapshot.DiscardUnknown(m) -} - -var xxx_messageInfo_SummaryValue_Snapshot proto.InternalMessageInfo - -func (m *SummaryValue_Snapshot) GetCount() *wrappers.Int64Value { - if m != nil { - return m.Count - } - return nil -} - -func (m *SummaryValue_Snapshot) GetSum() *wrappers.DoubleValue { - if m != nil { - return m.Sum - } - return nil -} - -func (m *SummaryValue_Snapshot) GetPercentileValues() []*SummaryValue_Snapshot_ValueAtPercentile { - if m != nil { - return m.PercentileValues - } - return nil -} - -// Represents the value at a given percentile of a distribution. -type SummaryValue_Snapshot_ValueAtPercentile struct { - // The percentile of a distribution. Must be in the interval - // (0.0, 100.0]. - Percentile float64 `protobuf:"fixed64,1,opt,name=percentile,proto3" json:"percentile,omitempty"` - // The value at the given percentile of a distribution. - Value float64 `protobuf:"fixed64,2,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SummaryValue_Snapshot_ValueAtPercentile) Reset() { - *m = SummaryValue_Snapshot_ValueAtPercentile{} -} -func (m *SummaryValue_Snapshot_ValueAtPercentile) String() string { return proto.CompactTextString(m) } -func (*SummaryValue_Snapshot_ValueAtPercentile) ProtoMessage() {} -func (*SummaryValue_Snapshot_ValueAtPercentile) Descriptor() ([]byte, []int) { - return fileDescriptor_0ee3deb72053811a, []int{7, 0, 0} -} - -func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Unmarshal(m, b) -} -func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Marshal(b, m, deterministic) -} -func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Merge(src proto.Message) { - xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Merge(m, src) -} -func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Size() int { - return xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Size(m) -} -func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_DiscardUnknown() { - xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.DiscardUnknown(m) -} - -var xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile proto.InternalMessageInfo - -func (m *SummaryValue_Snapshot_ValueAtPercentile) GetPercentile() float64 { - if m != nil { - return m.Percentile - } - return 0 -} - -func (m *SummaryValue_Snapshot_ValueAtPercentile) GetValue() float64 { - if m != nil { - return m.Value - } - return 0 -} - -func init() { - proto.RegisterEnum("opencensus.proto.metrics.v1.MetricDescriptor_Type", MetricDescriptor_Type_name, MetricDescriptor_Type_value) - proto.RegisterType((*Metric)(nil), "opencensus.proto.metrics.v1.Metric") - proto.RegisterType((*MetricDescriptor)(nil), "opencensus.proto.metrics.v1.MetricDescriptor") - proto.RegisterType((*LabelKey)(nil), "opencensus.proto.metrics.v1.LabelKey") - proto.RegisterType((*TimeSeries)(nil), "opencensus.proto.metrics.v1.TimeSeries") - proto.RegisterType((*LabelValue)(nil), "opencensus.proto.metrics.v1.LabelValue") - proto.RegisterType((*Point)(nil), "opencensus.proto.metrics.v1.Point") - proto.RegisterType((*DistributionValue)(nil), "opencensus.proto.metrics.v1.DistributionValue") - proto.RegisterType((*DistributionValue_BucketOptions)(nil), "opencensus.proto.metrics.v1.DistributionValue.BucketOptions") - proto.RegisterType((*DistributionValue_BucketOptions_Explicit)(nil), "opencensus.proto.metrics.v1.DistributionValue.BucketOptions.Explicit") - proto.RegisterType((*DistributionValue_Bucket)(nil), "opencensus.proto.metrics.v1.DistributionValue.Bucket") - proto.RegisterType((*DistributionValue_Exemplar)(nil), "opencensus.proto.metrics.v1.DistributionValue.Exemplar") - proto.RegisterMapType((map[string]string)(nil), "opencensus.proto.metrics.v1.DistributionValue.Exemplar.AttachmentsEntry") - proto.RegisterType((*SummaryValue)(nil), "opencensus.proto.metrics.v1.SummaryValue") - proto.RegisterType((*SummaryValue_Snapshot)(nil), "opencensus.proto.metrics.v1.SummaryValue.Snapshot") - proto.RegisterType((*SummaryValue_Snapshot_ValueAtPercentile)(nil), "opencensus.proto.metrics.v1.SummaryValue.Snapshot.ValueAtPercentile") -} - -func init() { - proto.RegisterFile("opencensus/proto/metrics/v1/metrics.proto", fileDescriptor_0ee3deb72053811a) -} - -var fileDescriptor_0ee3deb72053811a = []byte{ - // 1118 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xdd, 0x6e, 0x1b, 0xc5, - 0x17, 0xcf, 0xda, 0x8e, 0xe3, 0x9c, 0x75, 0xd2, 0xf5, 0xa8, 0xed, 0xdf, 0x72, 0xfe, 0x0a, 0x61, - 0x11, 0x90, 0x0a, 0x65, 0xad, 0x98, 0xd2, 0x56, 0x15, 0x2a, 0x8a, 0x63, 0x37, 0x31, 0x24, 0xb1, - 0x35, 0xb6, 0x23, 0xd1, 0x1b, 0x6b, 0xbd, 0x9e, 0x24, 0x4b, 0xbc, 0x1f, 0xdd, 0x99, 0x0d, 0xf8, - 0x05, 0x78, 0x02, 0xc4, 0x35, 0xb7, 0x88, 0xe7, 0xe0, 0x8a, 0x27, 0xe0, 0x15, 0xb8, 0x41, 0xbc, - 0x01, 0xda, 0x99, 0xd9, 0x8f, 0xc4, 0x60, 0xea, 0x22, 0x71, 0x77, 0xe6, 0xcc, 0x39, 0xbf, 0xfd, - 0x9d, 0xcf, 0x1d, 0x78, 0xe4, 0xf9, 0xc4, 0xb5, 0x88, 0x4b, 0x43, 0x5a, 0xf7, 0x03, 0x8f, 0x79, - 0x75, 0x87, 0xb0, 0xc0, 0xb6, 0x68, 0xfd, 0x66, 0x3f, 0x16, 0x0d, 0x7e, 0x81, 0xb6, 0x52, 0x53, - 0xa1, 0x31, 0xe2, 0xfb, 0x9b, 0xfd, 0xda, 0x3b, 0x97, 0x9e, 0x77, 0x39, 0x25, 0x02, 0x63, 0x1c, - 0x5e, 0xd4, 0x99, 0xed, 0x10, 0xca, 0x4c, 0xc7, 0x17, 0xb6, 0xb5, 0xed, 0xbb, 0x06, 0x5f, 0x07, - 0xa6, 0xef, 0x93, 0x40, 0x62, 0xd5, 0x3e, 0x9a, 0x23, 0x12, 0x10, 0xea, 0x85, 0x81, 0x45, 0x22, - 0x26, 0xb1, 0x2c, 0x8c, 0xf5, 0x3f, 0x14, 0x28, 0x9e, 0xf2, 0x8f, 0xa3, 0x57, 0x50, 0x11, 0x34, - 0x46, 0x13, 0x42, 0xad, 0xc0, 0xf6, 0x99, 0x17, 0x54, 0x95, 0x1d, 0x65, 0x57, 0x6d, 0xec, 0x19, - 0x0b, 0x18, 0x1b, 0xc2, 0xbf, 0x95, 0x38, 0x61, 0xcd, 0xb9, 0xa3, 0x41, 0x47, 0x00, 0x3c, 0x0c, - 0x12, 0xd8, 0x84, 0x56, 0x73, 0x3b, 0xf9, 0x5d, 0xb5, 0xf1, 0xe1, 0x42, 0xd0, 0x81, 0xed, 0x90, - 0x3e, 0x37, 0xc7, 0x19, 0x57, 0xd4, 0x84, 0x52, 0x1c, 0x41, 0x35, 0xcf, 0xb9, 0x7d, 0x30, 0x0f, - 0x93, 0xc4, 0x78, 0xb3, 0x6f, 0x60, 0x29, 0xe3, 0xc4, 0x4f, 0xff, 0x3e, 0x0f, 0xda, 0x5d, 0xce, - 0x08, 0x41, 0xc1, 0x35, 0x1d, 0xc2, 0x03, 0x5e, 0xc7, 0x5c, 0x46, 0x3b, 0xa0, 0xc6, 0xa9, 0xb0, - 0x3d, 0xb7, 0x9a, 0xe3, 0x57, 0x59, 0x55, 0xe4, 0x15, 0xba, 0x36, 0xe3, 0x54, 0xd6, 0x31, 0x97, - 0xd1, 0x4b, 0x28, 0xb0, 0x99, 0x4f, 0xaa, 0x85, 0x1d, 0x65, 0x77, 0xb3, 0xd1, 0x58, 0x2a, 0x75, - 0xc6, 0x60, 0xe6, 0x13, 0xcc, 0xfd, 0x51, 0x0b, 0x60, 0x6a, 0x8e, 0xc9, 0x74, 0x74, 0x4d, 0x66, - 0xb4, 0xba, 0xca, 0x73, 0xf6, 0xfe, 0x42, 0xb4, 0x93, 0xc8, 0xfc, 0x0b, 0x32, 0xc3, 0xeb, 0x53, - 0x29, 0x51, 0xfd, 0x47, 0x05, 0x0a, 0x11, 0x28, 0xba, 0x07, 0xea, 0xf0, 0xac, 0xdf, 0x6b, 0x1f, - 0x76, 0x5e, 0x76, 0xda, 0x2d, 0x6d, 0x25, 0x52, 0x1c, 0x1d, 0x0c, 0x8f, 0xda, 0xa3, 0xce, 0xd9, - 0xe0, 0xc9, 0x63, 0x4d, 0x41, 0x1a, 0x94, 0x85, 0xa2, 0xd5, 0x1d, 0x36, 0x4f, 0xda, 0x5a, 0x0e, - 0x3d, 0x04, 0x24, 0x35, 0x9d, 0xfe, 0x00, 0x77, 0x9a, 0xc3, 0x41, 0xa7, 0x7b, 0xa6, 0xe5, 0xd1, - 0x7d, 0xd0, 0x0e, 0x87, 0xa7, 0xc3, 0x93, 0x83, 0x41, 0xe7, 0x3c, 0xf6, 0x2f, 0xa0, 0x07, 0x50, - 0xc9, 0x68, 0x25, 0xc8, 0x2a, 0xda, 0x82, 0xff, 0x65, 0xd5, 0x59, 0xa4, 0x22, 0x52, 0x61, 0xad, - 0x3f, 0x3c, 0x3d, 0x3d, 0xc0, 0x5f, 0x6a, 0x6b, 0xfa, 0x0b, 0x28, 0xc5, 0x21, 0x20, 0x0d, 0xf2, - 0xd7, 0x64, 0x26, 0xcb, 0x11, 0x89, 0xff, 0x5c, 0x0d, 0xfd, 0x57, 0x05, 0x20, 0xed, 0x1b, 0x74, - 0x08, 0xf7, 0x28, 0x33, 0x03, 0x36, 0x4a, 0x26, 0x48, 0xb6, 0x73, 0xcd, 0x10, 0x23, 0x64, 0xc4, - 0x23, 0xc4, 0xbb, 0x8d, 0x5b, 0xe0, 0x4d, 0xee, 0x92, 0x9c, 0xd1, 0xe7, 0x50, 0x16, 0x55, 0xb8, - 0x31, 0xa7, 0xe1, 0x1b, 0xf6, 0x2e, 0x0f, 0xe2, 0x3c, 0xb2, 0xc7, 0xea, 0x34, 0x91, 0x29, 0x7a, - 0x0e, 0x45, 0xdf, 0xb3, 0x5d, 0x46, 0xab, 0x79, 0x8e, 0xa2, 0x2f, 0x44, 0xe9, 0x45, 0xa6, 0x58, - 0x7a, 0xe8, 0x9f, 0x01, 0xa4, 0xb0, 0xe8, 0x3e, 0xac, 0x72, 0x3e, 0x32, 0x3f, 0xe2, 0x80, 0xb6, - 0x60, 0xfd, 0xca, 0xa4, 0x82, 0x29, 0xcf, 0x4f, 0x09, 0x97, 0xae, 0x4c, 0xca, 0x5d, 0xf4, 0x9f, - 0x73, 0xb0, 0xca, 0x21, 0xd1, 0x33, 0x58, 0x5f, 0x26, 0x23, 0xa9, 0x31, 0x7a, 0x17, 0x54, 0xdb, - 0x65, 0x4f, 0x1e, 0x67, 0x3e, 0x91, 0x3f, 0x5e, 0xc1, 0xc0, 0x95, 0x82, 0xd9, 0x7b, 0x50, 0x9e, - 0x78, 0xe1, 0x78, 0x4a, 0xa4, 0x4d, 0x34, 0x19, 0xca, 0xf1, 0x0a, 0x56, 0x85, 0x56, 0x18, 0x8d, - 0x00, 0x4d, 0x6c, 0xca, 0x02, 0x7b, 0x1c, 0x46, 0x85, 0x93, 0xa6, 0x05, 0x4e, 0xc5, 0x58, 0x98, - 0x94, 0x56, 0xc6, 0x8d, 0x63, 0x1d, 0xaf, 0xe0, 0xca, 0xe4, 0xae, 0x12, 0xf5, 0x60, 0x83, 0x86, - 0x8e, 0x63, 0x06, 0x33, 0x89, 0xbd, 0xca, 0xb1, 0x1f, 0x2d, 0xc4, 0xee, 0x0b, 0x8f, 0x18, 0xb6, - 0x4c, 0x33, 0xe7, 0xe6, 0x9a, 0xcc, 0xb8, 0xfe, 0x4b, 0x11, 0x2a, 0x73, 0x2c, 0xa2, 0x82, 0x58, - 0x5e, 0xe8, 0x32, 0x9e, 0xcf, 0x3c, 0x16, 0x87, 0xa8, 0x89, 0x69, 0xe8, 0xf0, 0x3c, 0x29, 0x38, - 0x12, 0xd1, 0x53, 0xa8, 0xd2, 0xd0, 0x19, 0x79, 0x17, 0x23, 0xfa, 0x3a, 0x34, 0x03, 0x32, 0x19, - 0x4d, 0xc8, 0x8d, 0x6d, 0xf2, 0x8e, 0xe6, 0xa9, 0xc2, 0x0f, 0x68, 0xe8, 0x74, 0x2f, 0xfa, 0xe2, - 0xb6, 0x15, 0x5f, 0x22, 0x0b, 0x36, 0xc7, 0xa1, 0x75, 0x4d, 0xd8, 0xc8, 0xe3, 0xcd, 0x4e, 0x65, - 0xba, 0x3e, 0x5d, 0x2e, 0x5d, 0x46, 0x93, 0x83, 0x74, 0x05, 0x06, 0xde, 0x18, 0x67, 0x8f, 0xa8, - 0x0b, 0x6b, 0x42, 0x11, 0xef, 0x9b, 0x4f, 0xde, 0x0a, 0x1d, 0xc7, 0x28, 0xb5, 0x1f, 0x14, 0xd8, - 0xb8, 0xf5, 0x45, 0x64, 0x41, 0x89, 0x7c, 0xe3, 0x4f, 0x6d, 0xcb, 0x66, 0xb2, 0xf7, 0xda, 0xff, - 0x26, 0x02, 0xa3, 0x2d, 0xc1, 0x8e, 0x57, 0x70, 0x02, 0x5c, 0xd3, 0xa1, 0x14, 0xeb, 0xd1, 0x43, - 0x28, 0x8e, 0xbd, 0xd0, 0x9d, 0xd0, 0xaa, 0xb2, 0x93, 0xdf, 0x55, 0xb0, 0x3c, 0x35, 0x8b, 0x62, - 0x4d, 0xd7, 0x28, 0x14, 0x05, 0xe2, 0xdf, 0xd4, 0xb0, 0x1f, 0x11, 0x26, 0x8e, 0x3f, 0x35, 0x03, - 0x5e, 0x48, 0xb5, 0xf1, 0x74, 0x49, 0xc2, 0x6d, 0xe9, 0x8e, 0x13, 0xa0, 0xda, 0xb7, 0xb9, 0x88, - 0xa1, 0x38, 0xdc, 0x1e, 0x66, 0x25, 0x1e, 0xe6, 0x5b, 0x53, 0x9a, 0x5b, 0x66, 0x4a, 0xbf, 0x02, - 0xd5, 0x64, 0xcc, 0xb4, 0xae, 0x1c, 0x92, 0xee, 0x9a, 0xe3, 0xb7, 0x24, 0x6d, 0x1c, 0xa4, 0x50, - 0x6d, 0x97, 0x05, 0x33, 0x9c, 0x05, 0xaf, 0xbd, 0x00, 0xed, 0xae, 0xc1, 0x5f, 0xac, 0xee, 0x24, - 0xc2, 0x5c, 0x66, 0x5d, 0x3d, 0xcf, 0x3d, 0x53, 0xf4, 0xdf, 0xf3, 0x50, 0xce, 0xce, 0x1d, 0xda, - 0xcf, 0x16, 0x41, 0x6d, 0x6c, 0xcd, 0x85, 0xdc, 0x49, 0x76, 0x4d, 0x5c, 0x21, 0x23, 0x9d, 0x32, - 0xb5, 0xf1, 0xff, 0x39, 0x87, 0x56, 0xba, 0x78, 0xc4, 0x0c, 0x9e, 0x41, 0x89, 0xba, 0xa6, 0x4f, - 0xaf, 0x3c, 0x26, 0xdf, 0x10, 0x8d, 0x37, 0xde, 0x0b, 0x46, 0x5f, 0x7a, 0xe2, 0x04, 0xa3, 0xf6, - 0x53, 0x0e, 0x4a, 0xb1, 0xfa, 0xbf, 0xe0, 0xff, 0x1a, 0x2a, 0x3e, 0x09, 0x2c, 0xe2, 0x32, 0x3b, - 0x5e, 0xb3, 0x71, 0x95, 0x5b, 0xcb, 0x07, 0x62, 0xf0, 0xe3, 0x01, 0xeb, 0x25, 0x90, 0x58, 0x4b, - 0xe1, 0xc5, 0x9f, 0xab, 0xd6, 0x81, 0xca, 0x9c, 0x19, 0xda, 0x06, 0x48, 0x0d, 0x65, 0xf3, 0x66, - 0x34, 0xb7, 0xab, 0x1e, 0xf7, 0x75, 0xf3, 0x3b, 0x05, 0xb6, 0x6d, 0x6f, 0x11, 0xcf, 0x66, 0x59, - 0x3c, 0x8b, 0x68, 0x2f, 0xba, 0xe8, 0x29, 0xaf, 0x5a, 0x97, 0x36, 0xbb, 0x0a, 0xc7, 0x86, 0xe5, - 0x39, 0x75, 0xe1, 0xb3, 0x67, 0xbb, 0x94, 0x05, 0x61, 0xd4, 0x74, 0x7c, 0x3d, 0xd6, 0x53, 0xb8, - 0x3d, 0xf1, 0xe6, 0xbd, 0x24, 0xee, 0xde, 0x65, 0xf6, 0x0d, 0xfe, 0x5b, 0x6e, 0xab, 0xeb, 0x13, - 0xf7, 0x50, 0x7c, 0x93, 0x43, 0xcb, 0xe7, 0x17, 0x35, 0xce, 0xf7, 0xc7, 0x45, 0xee, 0xf6, 0xf1, - 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf8, 0xd0, 0xb4, 0x8d, 0xc7, 0x0b, 0x00, 0x00, -} diff --git a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1/resource.pb.go b/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1/resource.pb.go deleted file mode 100644 index 5dba6a2a0..000000000 --- a/vendor/github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1/resource.pb.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: opencensus/proto/resource/v1/resource.proto - -package v1 - -import ( - fmt "fmt" - proto "github.com/golang/protobuf/proto" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// Resource information. -type Resource struct { - // Type identifier for the resource. - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - // Set of labels that describe the resource. - Labels map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Resource) Reset() { *m = Resource{} } -func (m *Resource) String() string { return proto.CompactTextString(m) } -func (*Resource) ProtoMessage() {} -func (*Resource) Descriptor() ([]byte, []int) { - return fileDescriptor_584700775a2fc762, []int{0} -} - -func (m *Resource) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Resource.Unmarshal(m, b) -} -func (m *Resource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Resource.Marshal(b, m, deterministic) -} -func (m *Resource) XXX_Merge(src proto.Message) { - xxx_messageInfo_Resource.Merge(m, src) -} -func (m *Resource) XXX_Size() int { - return xxx_messageInfo_Resource.Size(m) -} -func (m *Resource) XXX_DiscardUnknown() { - xxx_messageInfo_Resource.DiscardUnknown(m) -} - -var xxx_messageInfo_Resource proto.InternalMessageInfo - -func (m *Resource) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *Resource) GetLabels() map[string]string { - if m != nil { - return m.Labels - } - return nil -} - -func init() { - proto.RegisterType((*Resource)(nil), "opencensus.proto.resource.v1.Resource") - proto.RegisterMapType((map[string]string)(nil), "opencensus.proto.resource.v1.Resource.LabelsEntry") -} - -func init() { - proto.RegisterFile("opencensus/proto/resource/v1/resource.proto", fileDescriptor_584700775a2fc762) -} - -var fileDescriptor_584700775a2fc762 = []byte{ - // 251 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0xce, 0x2f, 0x48, 0xcd, - 0x4b, 0x4e, 0xcd, 0x2b, 0x2e, 0x2d, 0xd6, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x2f, 0x4a, 0x2d, - 0xce, 0x2f, 0x2d, 0x4a, 0x4e, 0xd5, 0x2f, 0x33, 0x84, 0xb3, 0xf5, 0xc0, 0x52, 0x42, 0x32, 0x08, - 0xc5, 0x10, 0x11, 0x3d, 0xb8, 0x82, 0x32, 0x43, 0xa5, 0xa5, 0x8c, 0x5c, 0x1c, 0x41, 0x50, 0xbe, - 0x90, 0x10, 0x17, 0x4b, 0x49, 0x65, 0x41, 0xaa, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x98, - 0x2d, 0xe4, 0xc5, 0xc5, 0x96, 0x93, 0x98, 0x94, 0x9a, 0x53, 0x2c, 0xc1, 0xa4, 0xc0, 0xac, 0xc1, - 0x6d, 0x64, 0xa4, 0x87, 0xcf, 0x3c, 0x3d, 0x98, 0x59, 0x7a, 0x3e, 0x60, 0x4d, 0xae, 0x79, 0x25, - 0x45, 0x95, 0x41, 0x50, 0x13, 0xa4, 0x2c, 0xb9, 0xb8, 0x91, 0x84, 0x85, 0x04, 0xb8, 0x98, 0xb3, - 0x53, 0x2b, 0xa1, 0xb6, 0x81, 0x98, 0x42, 0x22, 0x5c, 0xac, 0x65, 0x89, 0x39, 0xa5, 0xa9, 0x12, - 0x4c, 0x60, 0x31, 0x08, 0xc7, 0x8a, 0xc9, 0x82, 0xd1, 0x69, 0x06, 0x23, 0x97, 0x7c, 0x66, 0x3e, - 0x5e, 0xbb, 0x9d, 0x78, 0x61, 0x96, 0x07, 0x80, 0xa4, 0x02, 0x18, 0xa3, 0x5c, 0xd3, 0x33, 0x4b, - 0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0x21, 0xba, 0x74, 0x33, 0xf3, 0x8a, 0x4b, 0x8a, - 0x4a, 0x73, 0x53, 0xf3, 0x4a, 0x12, 0x4b, 0x32, 0xf3, 0xf3, 0xf4, 0x11, 0x06, 0xea, 0x42, 0x42, - 0x32, 0x3d, 0x35, 0x4f, 0x37, 0x1d, 0x25, 0x40, 0x5f, 0x31, 0xc9, 0xf8, 0x17, 0xa4, 0xe6, 0x39, - 0x43, 0xac, 0x05, 0x9b, 0x8d, 0xf0, 0x66, 0x98, 0x61, 0x12, 0x1b, 0x58, 0xa3, 0x31, 0x20, 0x00, - 0x00, 0xff, 0xff, 0xcf, 0x32, 0xff, 0x46, 0x96, 0x01, 0x00, 0x00, -} diff --git a/vendor/github.com/golang/groupcache/LICENSE b/vendor/github.com/golang/groupcache/LICENSE deleted file mode 100644 index 37ec93a14..000000000 --- a/vendor/github.com/golang/groupcache/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and -distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright -owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities -that control, are controlled by, or are under common control with that entity. -For the purposes of this definition, "control" means (i) the power, direct or -indirect, to cause the direction or management of such entity, whether by -contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising -permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including -but not limited to software source code, documentation source, and configuration -files. - -"Object" form shall mean any form resulting from mechanical transformation or -translation of a Source form, including but not limited to compiled object code, -generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made -available under the License, as indicated by a copyright notice that is included -in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that -is based on (or derived from) the Work and for which the editorial revisions, -annotations, elaborations, or other modifications represent, as a whole, an -original work of authorship. For the purposes of this License, Derivative Works -shall not include works that remain separable from, or merely link (or bind by -name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version -of the Work and any modifications or additions to that Work or Derivative Works -thereof, that is intentionally submitted to Licensor for inclusion in the Work -by the copyright owner or by an individual or Legal Entity authorized to submit -on behalf of the copyright owner. For the purposes of this definition, -"submitted" means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, and -issue tracking systems that are managed by, or on behalf of, the Licensor for -the purpose of discussing and improving the Work, but excluding communication -that is conspicuously marked or otherwise designated in writing by the copyright -owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf -of whom a Contribution has been received by Licensor and subsequently -incorporated within the Work. - -2. Grant of Copyright License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the Work and such -Derivative Works in Source or Object form. - -3. Grant of Patent License. - -Subject to the terms and conditions of this License, each Contributor hereby -grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, -irrevocable (except as stated in this section) patent license to make, have -made, use, offer to sell, sell, import, and otherwise transfer the Work, where -such license applies only to those patent claims licensable by such Contributor -that are necessarily infringed by their Contribution(s) alone or by combination -of their Contribution(s) with the Work to which such Contribution(s) was -submitted. If You institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work or a -Contribution incorporated within the Work constitutes direct or contributory -patent infringement, then any patent licenses granted to You under this License -for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. - -You may reproduce and distribute copies of the Work or Derivative Works thereof -in any medium, with or without modifications, and in Source or Object form, -provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of -this License; and -You must cause any modified files to carry prominent notices stating that You -changed the files; and -You must retain, in the Source form of any Derivative Works that You distribute, -all copyright, patent, trademark, and attribution notices from the Source form -of the Work, excluding those notices that do not pertain to any part of the -Derivative Works; and -If the Work includes a "NOTICE" text file as part of its distribution, then any -Derivative Works that You distribute must include a readable copy of the -attribution notices contained within such NOTICE file, excluding those notices -that do not pertain to any part of the Derivative Works, in at least one of the -following places: within a NOTICE text file distributed as part of the -Derivative Works; within the Source form or documentation, if provided along -with the Derivative Works; or, within a display generated by the Derivative -Works, if and wherever such third-party notices normally appear. The contents of -the NOTICE file are for informational purposes only and do not modify the -License. You may add Your own attribution notices within Derivative Works that -You distribute, alongside or as an addendum to the NOTICE text from the Work, -provided that such additional attribution notices cannot be construed as -modifying the License. -You may add Your own copyright statement to Your modifications and may provide -additional or different license terms and conditions for use, reproduction, or -distribution of Your modifications, or for any such Derivative Works as a whole, -provided Your use, reproduction, and distribution of the Work otherwise complies -with the conditions stated in this License. - -5. Submission of Contributions. - -Unless You explicitly state otherwise, any Contribution intentionally submitted -for inclusion in the Work by You to the Licensor shall be under the terms and -conditions of this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify the terms of -any separate license agreement you may have executed with Licensor regarding -such Contributions. - -6. Trademarks. - -This License does not grant permission to use the trade names, trademarks, -service marks, or product names of the Licensor, except as required for -reasonable and customary use in describing the origin of the Work and -reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. - -Unless required by applicable law or agreed to in writing, Licensor provides the -Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, -including, without limitation, any warranties or conditions of TITLE, -NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are -solely responsible for determining the appropriateness of using or -redistributing the Work and assume any risks associated with Your exercise of -permissions under this License. - -8. Limitation of Liability. - -In no event and under no legal theory, whether in tort (including negligence), -contract, or otherwise, unless required by applicable law (such as deliberate -and grossly negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, incidental, -or consequential damages of any character arising as a result of this License or -out of the use or inability to use the Work (including but not limited to -damages for loss of goodwill, work stoppage, computer failure or malfunction, or -any and all other commercial damages or losses), even if such Contributor has -been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. - -While redistributing the Work or Derivative Works thereof, You may choose to -offer, and charge a fee for, acceptance of support, warranty, indemnity, or -other liability obligations and/or rights consistent with this License. However, -in accepting such obligations, You may act only on Your own behalf and on Your -sole responsibility, not on behalf of any other Contributor, and only if You -agree to indemnify, defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason of your -accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work - -To apply the Apache License to your work, attach the following boilerplate -notice, with the fields enclosed by brackets "[]" replaced with your own -identifying information. (Don't include the brackets!) The text should be -enclosed in the appropriate comment syntax for the file format. We also -recommend that a file or class name and description of purpose be included on -the same "printed page" as the copyright notice for easier identification within -third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/golang/groupcache/lru/lru.go b/vendor/github.com/golang/groupcache/lru/lru.go deleted file mode 100644 index eac1c7664..000000000 --- a/vendor/github.com/golang/groupcache/lru/lru.go +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright 2013 Google Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package lru implements an LRU cache. -package lru - -import "container/list" - -// Cache is an LRU cache. It is not safe for concurrent access. -type Cache struct { - // MaxEntries is the maximum number of cache entries before - // an item is evicted. Zero means no limit. - MaxEntries int - - // OnEvicted optionally specifies a callback function to be - // executed when an entry is purged from the cache. - OnEvicted func(key Key, value interface{}) - - ll *list.List - cache map[interface{}]*list.Element -} - -// A Key may be any value that is comparable. See http://golang.org/ref/spec#Comparison_operators -type Key interface{} - -type entry struct { - key Key - value interface{} -} - -// New creates a new Cache. -// If maxEntries is zero, the cache has no limit and it's assumed -// that eviction is done by the caller. -func New(maxEntries int) *Cache { - return &Cache{ - MaxEntries: maxEntries, - ll: list.New(), - cache: make(map[interface{}]*list.Element), - } -} - -// Add adds a value to the cache. -func (c *Cache) Add(key Key, value interface{}) { - if c.cache == nil { - c.cache = make(map[interface{}]*list.Element) - c.ll = list.New() - } - if ee, ok := c.cache[key]; ok { - c.ll.MoveToFront(ee) - ee.Value.(*entry).value = value - return - } - ele := c.ll.PushFront(&entry{key, value}) - c.cache[key] = ele - if c.MaxEntries != 0 && c.ll.Len() > c.MaxEntries { - c.RemoveOldest() - } -} - -// Get looks up a key's value from the cache. -func (c *Cache) Get(key Key) (value interface{}, ok bool) { - if c.cache == nil { - return - } - if ele, hit := c.cache[key]; hit { - c.ll.MoveToFront(ele) - return ele.Value.(*entry).value, true - } - return -} - -// Remove removes the provided key from the cache. -func (c *Cache) Remove(key Key) { - if c.cache == nil { - return - } - if ele, hit := c.cache[key]; hit { - c.removeElement(ele) - } -} - -// RemoveOldest removes the oldest item from the cache. -func (c *Cache) RemoveOldest() { - if c.cache == nil { - return - } - ele := c.ll.Back() - if ele != nil { - c.removeElement(ele) - } -} - -func (c *Cache) removeElement(e *list.Element) { - c.ll.Remove(e) - kv := e.Value.(*entry) - delete(c.cache, kv.key) - if c.OnEvicted != nil { - c.OnEvicted(kv.key, kv.value) - } -} - -// Len returns the number of items in the cache. -func (c *Cache) Len() int { - if c.cache == nil { - return 0 - } - return c.ll.Len() -} - -// Clear purges all stored items from the cache. -func (c *Cache) Clear() { - if c.OnEvicted != nil { - for _, e := range c.cache { - kv := e.Value.(*entry) - c.OnEvicted(kv.key, kv.value) - } - } - c.ll = nil - c.cache = nil -} diff --git a/vendor/github.com/google/go-cmp/LICENSE b/vendor/github.com/google/go-cmp/LICENSE deleted file mode 100644 index 32017f8fa..000000000 --- a/vendor/github.com/google/go-cmp/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2017 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go deleted file mode 100644 index 41bbddc61..000000000 --- a/vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// Package cmpopts provides common options for the cmp package. -package cmpopts - -import ( - "math" - "reflect" - - "github.com/google/go-cmp/cmp" -) - -func equateAlways(_, _ interface{}) bool { return true } - -// EquateEmpty returns a Comparer option that determines all maps and slices -// with a length of zero to be equal, regardless of whether they are nil. -// -// EquateEmpty can be used in conjunction with SortSlices and SortMaps. -func EquateEmpty() cmp.Option { - return cmp.FilterValues(isEmpty, cmp.Comparer(equateAlways)) -} - -func isEmpty(x, y interface{}) bool { - vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) - return (x != nil && y != nil && vx.Type() == vy.Type()) && - (vx.Kind() == reflect.Slice || vx.Kind() == reflect.Map) && - (vx.Len() == 0 && vy.Len() == 0) -} - -// EquateApprox returns a Comparer option that determines float32 or float64 -// values to be equal if they are within a relative fraction or absolute margin. -// This option is not used when either x or y is NaN or infinite. -// -// The fraction determines that the difference of two values must be within the -// smaller fraction of the two values, while the margin determines that the two -// values must be within some absolute margin. -// To express only a fraction or only a margin, use 0 for the other parameter. -// The fraction and margin must be non-negative. -// -// The mathematical expression used is equivalent to: -// |x-y| ≤ max(fraction*min(|x|, |y|), margin) -// -// EquateApprox can be used in conjunction with EquateNaNs. -func EquateApprox(fraction, margin float64) cmp.Option { - if margin < 0 || fraction < 0 || math.IsNaN(margin) || math.IsNaN(fraction) { - panic("margin or fraction must be a non-negative number") - } - a := approximator{fraction, margin} - return cmp.Options{ - cmp.FilterValues(areRealF64s, cmp.Comparer(a.compareF64)), - cmp.FilterValues(areRealF32s, cmp.Comparer(a.compareF32)), - } -} - -type approximator struct{ frac, marg float64 } - -func areRealF64s(x, y float64) bool { - return !math.IsNaN(x) && !math.IsNaN(y) && !math.IsInf(x, 0) && !math.IsInf(y, 0) -} -func areRealF32s(x, y float32) bool { - return areRealF64s(float64(x), float64(y)) -} -func (a approximator) compareF64(x, y float64) bool { - relMarg := a.frac * math.Min(math.Abs(x), math.Abs(y)) - return math.Abs(x-y) <= math.Max(a.marg, relMarg) -} -func (a approximator) compareF32(x, y float32) bool { - return a.compareF64(float64(x), float64(y)) -} - -// EquateNaNs returns a Comparer option that determines float32 and float64 -// NaN values to be equal. -// -// EquateNaNs can be used in conjunction with EquateApprox. -func EquateNaNs() cmp.Option { - return cmp.Options{ - cmp.FilterValues(areNaNsF64s, cmp.Comparer(equateAlways)), - cmp.FilterValues(areNaNsF32s, cmp.Comparer(equateAlways)), - } -} - -func areNaNsF64s(x, y float64) bool { - return math.IsNaN(x) && math.IsNaN(y) -} -func areNaNsF32s(x, y float32) bool { - return areNaNsF64s(float64(x), float64(y)) -} diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go deleted file mode 100644 index ff8e785d4..000000000 --- a/vendor/github.com/google/go-cmp/cmp/cmpopts/ignore.go +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmpopts - -import ( - "fmt" - "reflect" - "unicode" - "unicode/utf8" - - "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/internal/function" -) - -// IgnoreFields returns an Option that ignores exported fields of the -// given names on a single struct type. -// The struct type is specified by passing in a value of that type. -// -// The name may be a dot-delimited string (e.g., "Foo.Bar") to ignore a -// specific sub-field that is embedded or nested within the parent struct. -// -// This does not handle unexported fields; use IgnoreUnexported instead. -func IgnoreFields(typ interface{}, names ...string) cmp.Option { - sf := newStructFilter(typ, names...) - return cmp.FilterPath(sf.filter, cmp.Ignore()) -} - -// IgnoreTypes returns an Option that ignores all values assignable to -// certain types, which are specified by passing in a value of each type. -func IgnoreTypes(typs ...interface{}) cmp.Option { - tf := newTypeFilter(typs...) - return cmp.FilterPath(tf.filter, cmp.Ignore()) -} - -type typeFilter []reflect.Type - -func newTypeFilter(typs ...interface{}) (tf typeFilter) { - for _, typ := range typs { - t := reflect.TypeOf(typ) - if t == nil { - // This occurs if someone tries to pass in sync.Locker(nil) - panic("cannot determine type; consider using IgnoreInterfaces") - } - tf = append(tf, t) - } - return tf -} -func (tf typeFilter) filter(p cmp.Path) bool { - if len(p) < 1 { - return false - } - t := p.Last().Type() - for _, ti := range tf { - if t.AssignableTo(ti) { - return true - } - } - return false -} - -// IgnoreInterfaces returns an Option that ignores all values or references of -// values assignable to certain interface types. These interfaces are specified -// by passing in an anonymous struct with the interface types embedded in it. -// For example, to ignore sync.Locker, pass in struct{sync.Locker}{}. -func IgnoreInterfaces(ifaces interface{}) cmp.Option { - tf := newIfaceFilter(ifaces) - return cmp.FilterPath(tf.filter, cmp.Ignore()) -} - -type ifaceFilter []reflect.Type - -func newIfaceFilter(ifaces interface{}) (tf ifaceFilter) { - t := reflect.TypeOf(ifaces) - if ifaces == nil || t.Name() != "" || t.Kind() != reflect.Struct { - panic("input must be an anonymous struct") - } - for i := 0; i < t.NumField(); i++ { - fi := t.Field(i) - switch { - case !fi.Anonymous: - panic("struct cannot have named fields") - case fi.Type.Kind() != reflect.Interface: - panic("embedded field must be an interface type") - case fi.Type.NumMethod() == 0: - // This matches everything; why would you ever want this? - panic("cannot ignore empty interface") - default: - tf = append(tf, fi.Type) - } - } - return tf -} -func (tf ifaceFilter) filter(p cmp.Path) bool { - if len(p) < 1 { - return false - } - t := p.Last().Type() - for _, ti := range tf { - if t.AssignableTo(ti) { - return true - } - if t.Kind() != reflect.Ptr && reflect.PtrTo(t).AssignableTo(ti) { - return true - } - } - return false -} - -// IgnoreUnexported returns an Option that only ignores the immediate unexported -// fields of a struct, including anonymous fields of unexported types. -// In particular, unexported fields within the struct's exported fields -// of struct types, including anonymous fields, will not be ignored unless the -// type of the field itself is also passed to IgnoreUnexported. -// -// Avoid ignoring unexported fields of a type which you do not control (i.e. a -// type from another repository), as changes to the implementation of such types -// may change how the comparison behaves. Prefer a custom Comparer instead. -func IgnoreUnexported(typs ...interface{}) cmp.Option { - ux := newUnexportedFilter(typs...) - return cmp.FilterPath(ux.filter, cmp.Ignore()) -} - -type unexportedFilter struct{ m map[reflect.Type]bool } - -func newUnexportedFilter(typs ...interface{}) unexportedFilter { - ux := unexportedFilter{m: make(map[reflect.Type]bool)} - for _, typ := range typs { - t := reflect.TypeOf(typ) - if t == nil || t.Kind() != reflect.Struct { - panic(fmt.Sprintf("invalid struct type: %T", typ)) - } - ux.m[t] = true - } - return ux -} -func (xf unexportedFilter) filter(p cmp.Path) bool { - sf, ok := p.Index(-1).(cmp.StructField) - if !ok { - return false - } - return xf.m[p.Index(-2).Type()] && !isExported(sf.Name()) -} - -// isExported reports whether the identifier is exported. -func isExported(id string) bool { - r, _ := utf8.DecodeRuneInString(id) - return unicode.IsUpper(r) -} - -// IgnoreSliceElements returns an Option that ignores elements of []V. -// The discard function must be of the form "func(T) bool" which is used to -// ignore slice elements of type V, where V is assignable to T. -// Elements are ignored if the function reports true. -func IgnoreSliceElements(discardFunc interface{}) cmp.Option { - vf := reflect.ValueOf(discardFunc) - if !function.IsType(vf.Type(), function.ValuePredicate) || vf.IsNil() { - panic(fmt.Sprintf("invalid discard function: %T", discardFunc)) - } - return cmp.FilterPath(func(p cmp.Path) bool { - si, ok := p.Index(-1).(cmp.SliceIndex) - if !ok { - return false - } - if !si.Type().AssignableTo(vf.Type().In(0)) { - return false - } - vx, vy := si.Values() - if vx.IsValid() && vf.Call([]reflect.Value{vx})[0].Bool() { - return true - } - if vy.IsValid() && vf.Call([]reflect.Value{vy})[0].Bool() { - return true - } - return false - }, cmp.Ignore()) -} - -// IgnoreMapEntries returns an Option that ignores entries of map[K]V. -// The discard function must be of the form "func(T, R) bool" which is used to -// ignore map entries of type K and V, where K and V are assignable to T and R. -// Entries are ignored if the function reports true. -func IgnoreMapEntries(discardFunc interface{}) cmp.Option { - vf := reflect.ValueOf(discardFunc) - if !function.IsType(vf.Type(), function.KeyValuePredicate) || vf.IsNil() { - panic(fmt.Sprintf("invalid discard function: %T", discardFunc)) - } - return cmp.FilterPath(func(p cmp.Path) bool { - mi, ok := p.Index(-1).(cmp.MapIndex) - if !ok { - return false - } - if !mi.Key().Type().AssignableTo(vf.Type().In(0)) || !mi.Type().AssignableTo(vf.Type().In(1)) { - return false - } - k := mi.Key() - vx, vy := mi.Values() - if vx.IsValid() && vf.Call([]reflect.Value{k, vx})[0].Bool() { - return true - } - if vy.IsValid() && vf.Call([]reflect.Value{k, vy})[0].Bool() { - return true - } - return false - }, cmp.Ignore()) -} diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go deleted file mode 100644 index 3a4804621..000000000 --- a/vendor/github.com/google/go-cmp/cmp/cmpopts/sort.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmpopts - -import ( - "fmt" - "reflect" - "sort" - - "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/internal/function" -) - -// SortSlices returns a Transformer option that sorts all []V. -// The less function must be of the form "func(T, T) bool" which is used to -// sort any slice with element type V that is assignable to T. -// -// The less function must be: -// • Deterministic: less(x, y) == less(x, y) -// • Irreflexive: !less(x, x) -// • Transitive: if !less(x, y) and !less(y, z), then !less(x, z) -// -// The less function does not have to be "total". That is, if !less(x, y) and -// !less(y, x) for two elements x and y, their relative order is maintained. -// -// SortSlices can be used in conjunction with EquateEmpty. -func SortSlices(lessFunc interface{}) cmp.Option { - vf := reflect.ValueOf(lessFunc) - if !function.IsType(vf.Type(), function.Less) || vf.IsNil() { - panic(fmt.Sprintf("invalid less function: %T", lessFunc)) - } - ss := sliceSorter{vf.Type().In(0), vf} - return cmp.FilterValues(ss.filter, cmp.Transformer("cmpopts.SortSlices", ss.sort)) -} - -type sliceSorter struct { - in reflect.Type // T - fnc reflect.Value // func(T, T) bool -} - -func (ss sliceSorter) filter(x, y interface{}) bool { - vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) - if !(x != nil && y != nil && vx.Type() == vy.Type()) || - !(vx.Kind() == reflect.Slice && vx.Type().Elem().AssignableTo(ss.in)) || - (vx.Len() <= 1 && vy.Len() <= 1) { - return false - } - // Check whether the slices are already sorted to avoid an infinite - // recursion cycle applying the same transform to itself. - ok1 := sort.SliceIsSorted(x, func(i, j int) bool { return ss.less(vx, i, j) }) - ok2 := sort.SliceIsSorted(y, func(i, j int) bool { return ss.less(vy, i, j) }) - return !ok1 || !ok2 -} -func (ss sliceSorter) sort(x interface{}) interface{} { - src := reflect.ValueOf(x) - dst := reflect.MakeSlice(src.Type(), src.Len(), src.Len()) - for i := 0; i < src.Len(); i++ { - dst.Index(i).Set(src.Index(i)) - } - sort.SliceStable(dst.Interface(), func(i, j int) bool { return ss.less(dst, i, j) }) - ss.checkSort(dst) - return dst.Interface() -} -func (ss sliceSorter) checkSort(v reflect.Value) { - start := -1 // Start of a sequence of equal elements. - for i := 1; i < v.Len(); i++ { - if ss.less(v, i-1, i) { - // Check that first and last elements in v[start:i] are equal. - if start >= 0 && (ss.less(v, start, i-1) || ss.less(v, i-1, start)) { - panic(fmt.Sprintf("incomparable values detected: want equal elements: %v", v.Slice(start, i))) - } - start = -1 - } else if start == -1 { - start = i - } - } -} -func (ss sliceSorter) less(v reflect.Value, i, j int) bool { - vx, vy := v.Index(i), v.Index(j) - return ss.fnc.Call([]reflect.Value{vx, vy})[0].Bool() -} - -// SortMaps returns a Transformer option that flattens map[K]V types to be a -// sorted []struct{K, V}. The less function must be of the form -// "func(T, T) bool" which is used to sort any map with key K that is -// assignable to T. -// -// Flattening the map into a slice has the property that cmp.Equal is able to -// use Comparers on K or the K.Equal method if it exists. -// -// The less function must be: -// • Deterministic: less(x, y) == less(x, y) -// • Irreflexive: !less(x, x) -// • Transitive: if !less(x, y) and !less(y, z), then !less(x, z) -// • Total: if x != y, then either less(x, y) or less(y, x) -// -// SortMaps can be used in conjunction with EquateEmpty. -func SortMaps(lessFunc interface{}) cmp.Option { - vf := reflect.ValueOf(lessFunc) - if !function.IsType(vf.Type(), function.Less) || vf.IsNil() { - panic(fmt.Sprintf("invalid less function: %T", lessFunc)) - } - ms := mapSorter{vf.Type().In(0), vf} - return cmp.FilterValues(ms.filter, cmp.Transformer("cmpopts.SortMaps", ms.sort)) -} - -type mapSorter struct { - in reflect.Type // T - fnc reflect.Value // func(T, T) bool -} - -func (ms mapSorter) filter(x, y interface{}) bool { - vx, vy := reflect.ValueOf(x), reflect.ValueOf(y) - return (x != nil && y != nil && vx.Type() == vy.Type()) && - (vx.Kind() == reflect.Map && vx.Type().Key().AssignableTo(ms.in)) && - (vx.Len() != 0 || vy.Len() != 0) -} -func (ms mapSorter) sort(x interface{}) interface{} { - src := reflect.ValueOf(x) - outType := reflect.StructOf([]reflect.StructField{ - {Name: "K", Type: src.Type().Key()}, - {Name: "V", Type: src.Type().Elem()}, - }) - dst := reflect.MakeSlice(reflect.SliceOf(outType), src.Len(), src.Len()) - for i, k := range src.MapKeys() { - v := reflect.New(outType).Elem() - v.Field(0).Set(k) - v.Field(1).Set(src.MapIndex(k)) - dst.Index(i).Set(v) - } - sort.Slice(dst.Interface(), func(i, j int) bool { return ms.less(dst, i, j) }) - ms.checkSort(dst) - return dst.Interface() -} -func (ms mapSorter) checkSort(v reflect.Value) { - for i := 1; i < v.Len(); i++ { - if !ms.less(v, i-1, i) { - panic(fmt.Sprintf("partial order detected: want %v < %v", v.Index(i-1), v.Index(i))) - } - } -} -func (ms mapSorter) less(v reflect.Value, i, j int) bool { - vx, vy := v.Index(i).Field(0), v.Index(j).Field(0) - return ms.fnc.Call([]reflect.Value{vx, vy})[0].Bool() -} diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go deleted file mode 100644 index 97f707983..000000000 --- a/vendor/github.com/google/go-cmp/cmp/cmpopts/struct_filter.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmpopts - -import ( - "fmt" - "reflect" - "strings" - - "github.com/google/go-cmp/cmp" -) - -// filterField returns a new Option where opt is only evaluated on paths that -// include a specific exported field on a single struct type. -// The struct type is specified by passing in a value of that type. -// -// The name may be a dot-delimited string (e.g., "Foo.Bar") to select a -// specific sub-field that is embedded or nested within the parent struct. -func filterField(typ interface{}, name string, opt cmp.Option) cmp.Option { - // TODO: This is currently unexported over concerns of how helper filters - // can be composed together easily. - // TODO: Add tests for FilterField. - - sf := newStructFilter(typ, name) - return cmp.FilterPath(sf.filter, opt) -} - -type structFilter struct { - t reflect.Type // The root struct type to match on - ft fieldTree // Tree of fields to match on -} - -func newStructFilter(typ interface{}, names ...string) structFilter { - // TODO: Perhaps allow * as a special identifier to allow ignoring any - // number of path steps until the next field match? - // This could be useful when a concrete struct gets transformed into - // an anonymous struct where it is not possible to specify that by type, - // but the transformer happens to provide guarantees about the names of - // the transformed fields. - - t := reflect.TypeOf(typ) - if t == nil || t.Kind() != reflect.Struct { - panic(fmt.Sprintf("%T must be a struct", typ)) - } - var ft fieldTree - for _, name := range names { - cname, err := canonicalName(t, name) - if err != nil { - panic(fmt.Sprintf("%s: %v", strings.Join(cname, "."), err)) - } - ft.insert(cname) - } - return structFilter{t, ft} -} - -func (sf structFilter) filter(p cmp.Path) bool { - for i, ps := range p { - if ps.Type().AssignableTo(sf.t) && sf.ft.matchPrefix(p[i+1:]) { - return true - } - } - return false -} - -// fieldTree represents a set of dot-separated identifiers. -// -// For example, inserting the following selectors: -// Foo -// Foo.Bar.Baz -// Foo.Buzz -// Nuka.Cola.Quantum -// -// Results in a tree of the form: -// {sub: { -// "Foo": {ok: true, sub: { -// "Bar": {sub: { -// "Baz": {ok: true}, -// }}, -// "Buzz": {ok: true}, -// }}, -// "Nuka": {sub: { -// "Cola": {sub: { -// "Quantum": {ok: true}, -// }}, -// }}, -// }} -type fieldTree struct { - ok bool // Whether this is a specified node - sub map[string]fieldTree // The sub-tree of fields under this node -} - -// insert inserts a sequence of field accesses into the tree. -func (ft *fieldTree) insert(cname []string) { - if ft.sub == nil { - ft.sub = make(map[string]fieldTree) - } - if len(cname) == 0 { - ft.ok = true - return - } - sub := ft.sub[cname[0]] - sub.insert(cname[1:]) - ft.sub[cname[0]] = sub -} - -// matchPrefix reports whether any selector in the fieldTree matches -// the start of path p. -func (ft fieldTree) matchPrefix(p cmp.Path) bool { - for _, ps := range p { - switch ps := ps.(type) { - case cmp.StructField: - ft = ft.sub[ps.Name()] - if ft.ok { - return true - } - if len(ft.sub) == 0 { - return false - } - case cmp.Indirect: - default: - return false - } - } - return false -} - -// canonicalName returns a list of identifiers where any struct field access -// through an embedded field is expanded to include the names of the embedded -// types themselves. -// -// For example, suppose field "Foo" is not directly in the parent struct, -// but actually from an embedded struct of type "Bar". Then, the canonical name -// of "Foo" is actually "Bar.Foo". -// -// Suppose field "Foo" is not directly in the parent struct, but actually -// a field in two different embedded structs of types "Bar" and "Baz". -// Then the selector "Foo" causes a panic since it is ambiguous which one it -// refers to. The user must specify either "Bar.Foo" or "Baz.Foo". -func canonicalName(t reflect.Type, sel string) ([]string, error) { - var name string - sel = strings.TrimPrefix(sel, ".") - if sel == "" { - return nil, fmt.Errorf("name must not be empty") - } - if i := strings.IndexByte(sel, '.'); i < 0 { - name, sel = sel, "" - } else { - name, sel = sel[:i], sel[i:] - } - - // Type must be a struct or pointer to struct. - if t.Kind() == reflect.Ptr { - t = t.Elem() - } - if t.Kind() != reflect.Struct { - return nil, fmt.Errorf("%v must be a struct", t) - } - - // Find the canonical name for this current field name. - // If the field exists in an embedded struct, then it will be expanded. - if !isExported(name) { - // Disallow unexported fields: - // * To discourage people from actually touching unexported fields - // * FieldByName is buggy (https://golang.org/issue/4876) - return []string{name}, fmt.Errorf("name must be exported") - } - sf, ok := t.FieldByName(name) - if !ok { - return []string{name}, fmt.Errorf("does not exist") - } - var ss []string - for i := range sf.Index { - ss = append(ss, t.FieldByIndex(sf.Index[:i+1]).Name) - } - if sel == "" { - return ss, nil - } - ssPost, err := canonicalName(sf.Type, sel) - return append(ss, ssPost...), err -} diff --git a/vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go b/vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go deleted file mode 100644 index 9d651553d..000000000 --- a/vendor/github.com/google/go-cmp/cmp/cmpopts/xform.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2018, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmpopts - -import ( - "github.com/google/go-cmp/cmp" -) - -type xformFilter struct{ xform cmp.Option } - -func (xf xformFilter) filter(p cmp.Path) bool { - for _, ps := range p { - if t, ok := ps.(cmp.Transform); ok && t.Option() == xf.xform { - return false - } - } - return true -} - -// AcyclicTransformer returns a Transformer with a filter applied that ensures -// that the transformer cannot be recursively applied upon its own output. -// -// An example use case is a transformer that splits a string by lines: -// AcyclicTransformer("SplitLines", func(s string) []string{ -// return strings.Split(s, "\n") -// }) -// -// Had this been an unfiltered Transformer instead, this would result in an -// infinite cycle converting a string to []string to [][]string and so on. -func AcyclicTransformer(name string, xformFunc interface{}) cmp.Option { - xf := xformFilter{cmp.Transformer(name, xformFunc)} - return cmp.FilterPath(xf.filter, xf.xform) -} diff --git a/vendor/github.com/google/go-cmp/cmp/compare.go b/vendor/github.com/google/go-cmp/cmp/compare.go deleted file mode 100644 index 2133562b0..000000000 --- a/vendor/github.com/google/go-cmp/cmp/compare.go +++ /dev/null @@ -1,616 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// Package cmp determines equality of values. -// -// This package is intended to be a more powerful and safer alternative to -// reflect.DeepEqual for comparing whether two values are semantically equal. -// -// The primary features of cmp are: -// -// • When the default behavior of equality does not suit the needs of the test, -// custom equality functions can override the equality operation. -// For example, an equality function may report floats as equal so long as they -// are within some tolerance of each other. -// -// • Types that have an Equal method may use that method to determine equality. -// This allows package authors to determine the equality operation for the types -// that they define. -// -// • If no custom equality functions are used and no Equal method is defined, -// equality is determined by recursively comparing the primitive kinds on both -// values, much like reflect.DeepEqual. Unlike reflect.DeepEqual, unexported -// fields are not compared by default; they result in panics unless suppressed -// by using an Ignore option (see cmpopts.IgnoreUnexported) or explicitly compared -// using the AllowUnexported option. -package cmp - -import ( - "fmt" - "reflect" - "strings" - - "github.com/google/go-cmp/cmp/internal/diff" - "github.com/google/go-cmp/cmp/internal/flags" - "github.com/google/go-cmp/cmp/internal/function" - "github.com/google/go-cmp/cmp/internal/value" -) - -// Equal reports whether x and y are equal by recursively applying the -// following rules in the given order to x and y and all of their sub-values: -// -// • Let S be the set of all Ignore, Transformer, and Comparer options that -// remain after applying all path filters, value filters, and type filters. -// If at least one Ignore exists in S, then the comparison is ignored. -// If the number of Transformer and Comparer options in S is greater than one, -// then Equal panics because it is ambiguous which option to use. -// If S contains a single Transformer, then use that to transform the current -// values and recursively call Equal on the output values. -// If S contains a single Comparer, then use that to compare the current values. -// Otherwise, evaluation proceeds to the next rule. -// -// • If the values have an Equal method of the form "(T) Equal(T) bool" or -// "(T) Equal(I) bool" where T is assignable to I, then use the result of -// x.Equal(y) even if x or y is nil. Otherwise, no such method exists and -// evaluation proceeds to the next rule. -// -// • Lastly, try to compare x and y based on their basic kinds. -// Simple kinds like booleans, integers, floats, complex numbers, strings, and -// channels are compared using the equivalent of the == operator in Go. -// Functions are only equal if they are both nil, otherwise they are unequal. -// -// Structs are equal if recursively calling Equal on all fields report equal. -// If a struct contains unexported fields, Equal panics unless an Ignore option -// (e.g., cmpopts.IgnoreUnexported) ignores that field or the AllowUnexported -// option explicitly permits comparing the unexported field. -// -// Slices are equal if they are both nil or both non-nil, where recursively -// calling Equal on all non-ignored slice or array elements report equal. -// Empty non-nil slices and nil slices are not equal; to equate empty slices, -// consider using cmpopts.EquateEmpty. -// -// Maps are equal if they are both nil or both non-nil, where recursively -// calling Equal on all non-ignored map entries report equal. -// Map keys are equal according to the == operator. -// To use custom comparisons for map keys, consider using cmpopts.SortMaps. -// Empty non-nil maps and nil maps are not equal; to equate empty maps, -// consider using cmpopts.EquateEmpty. -// -// Pointers and interfaces are equal if they are both nil or both non-nil, -// where they have the same underlying concrete type and recursively -// calling Equal on the underlying values reports equal. -func Equal(x, y interface{}, opts ...Option) bool { - vx := reflect.ValueOf(x) - vy := reflect.ValueOf(y) - - // If the inputs are different types, auto-wrap them in an empty interface - // so that they have the same parent type. - var t reflect.Type - if !vx.IsValid() || !vy.IsValid() || vx.Type() != vy.Type() { - t = reflect.TypeOf((*interface{})(nil)).Elem() - if vx.IsValid() { - vvx := reflect.New(t).Elem() - vvx.Set(vx) - vx = vvx - } - if vy.IsValid() { - vvy := reflect.New(t).Elem() - vvy.Set(vy) - vy = vvy - } - } else { - t = vx.Type() - } - - s := newState(opts) - s.compareAny(&pathStep{t, vx, vy}) - return s.result.Equal() -} - -// Diff returns a human-readable report of the differences between two values. -// It returns an empty string if and only if Equal returns true for the same -// input values and options. -// -// The output is displayed as a literal in pseudo-Go syntax. -// At the start of each line, a "-" prefix indicates an element removed from x, -// a "+" prefix to indicates an element added to y, and the lack of a prefix -// indicates an element common to both x and y. If possible, the output -// uses fmt.Stringer.String or error.Error methods to produce more humanly -// readable outputs. In such cases, the string is prefixed with either an -// 's' or 'e' character, respectively, to indicate that the method was called. -// -// Do not depend on this output being stable. If you need the ability to -// programmatically interpret the difference, consider using a custom Reporter. -func Diff(x, y interface{}, opts ...Option) string { - r := new(defaultReporter) - eq := Equal(x, y, Options(opts), Reporter(r)) - d := r.String() - if (d == "") != eq { - panic("inconsistent difference and equality results") - } - return d -} - -type state struct { - // These fields represent the "comparison state". - // Calling statelessCompare must not result in observable changes to these. - result diff.Result // The current result of comparison - curPath Path // The current path in the value tree - reporters []reporter // Optional reporters - - // recChecker checks for infinite cycles applying the same set of - // transformers upon the output of itself. - recChecker recChecker - - // dynChecker triggers pseudo-random checks for option correctness. - // It is safe for statelessCompare to mutate this value. - dynChecker dynChecker - - // These fields, once set by processOption, will not change. - exporters map[reflect.Type]bool // Set of structs with unexported field visibility - opts Options // List of all fundamental and filter options -} - -func newState(opts []Option) *state { - // Always ensure a validator option exists to validate the inputs. - s := &state{opts: Options{validator{}}} - s.processOption(Options(opts)) - return s -} - -func (s *state) processOption(opt Option) { - switch opt := opt.(type) { - case nil: - case Options: - for _, o := range opt { - s.processOption(o) - } - case coreOption: - type filtered interface { - isFiltered() bool - } - if fopt, ok := opt.(filtered); ok && !fopt.isFiltered() { - panic(fmt.Sprintf("cannot use an unfiltered option: %v", opt)) - } - s.opts = append(s.opts, opt) - case visibleStructs: - if s.exporters == nil { - s.exporters = make(map[reflect.Type]bool) - } - for t := range opt { - s.exporters[t] = true - } - case reporter: - s.reporters = append(s.reporters, opt) - default: - panic(fmt.Sprintf("unknown option %T", opt)) - } -} - -// statelessCompare compares two values and returns the result. -// This function is stateless in that it does not alter the current result, -// or output to any registered reporters. -func (s *state) statelessCompare(step PathStep) diff.Result { - // We do not save and restore the curPath because all of the compareX - // methods should properly push and pop from the path. - // It is an implementation bug if the contents of curPath differs from - // when calling this function to when returning from it. - - oldResult, oldReporters := s.result, s.reporters - s.result = diff.Result{} // Reset result - s.reporters = nil // Remove reporters to avoid spurious printouts - s.compareAny(step) - res := s.result - s.result, s.reporters = oldResult, oldReporters - return res -} - -func (s *state) compareAny(step PathStep) { - // Update the path stack. - s.curPath.push(step) - defer s.curPath.pop() - for _, r := range s.reporters { - r.PushStep(step) - defer r.PopStep() - } - s.recChecker.Check(s.curPath) - - // Obtain the current type and values. - t := step.Type() - vx, vy := step.Values() - - // Rule 1: Check whether an option applies on this node in the value tree. - if s.tryOptions(t, vx, vy) { - return - } - - // Rule 2: Check whether the type has a valid Equal method. - if s.tryMethod(t, vx, vy) { - return - } - - // Rule 3: Compare based on the underlying kind. - switch t.Kind() { - case reflect.Bool: - s.report(vx.Bool() == vy.Bool(), 0) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - s.report(vx.Int() == vy.Int(), 0) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - s.report(vx.Uint() == vy.Uint(), 0) - case reflect.Float32, reflect.Float64: - s.report(vx.Float() == vy.Float(), 0) - case reflect.Complex64, reflect.Complex128: - s.report(vx.Complex() == vy.Complex(), 0) - case reflect.String: - s.report(vx.String() == vy.String(), 0) - case reflect.Chan, reflect.UnsafePointer: - s.report(vx.Pointer() == vy.Pointer(), 0) - case reflect.Func: - s.report(vx.IsNil() && vy.IsNil(), 0) - case reflect.Struct: - s.compareStruct(t, vx, vy) - case reflect.Slice, reflect.Array: - s.compareSlice(t, vx, vy) - case reflect.Map: - s.compareMap(t, vx, vy) - case reflect.Ptr: - s.comparePtr(t, vx, vy) - case reflect.Interface: - s.compareInterface(t, vx, vy) - default: - panic(fmt.Sprintf("%v kind not handled", t.Kind())) - } -} - -func (s *state) tryOptions(t reflect.Type, vx, vy reflect.Value) bool { - // Evaluate all filters and apply the remaining options. - if opt := s.opts.filter(s, t, vx, vy); opt != nil { - opt.apply(s, vx, vy) - return true - } - return false -} - -func (s *state) tryMethod(t reflect.Type, vx, vy reflect.Value) bool { - // Check if this type even has an Equal method. - m, ok := t.MethodByName("Equal") - if !ok || !function.IsType(m.Type, function.EqualAssignable) { - return false - } - - eq := s.callTTBFunc(m.Func, vx, vy) - s.report(eq, reportByMethod) - return true -} - -func (s *state) callTRFunc(f, v reflect.Value, step Transform) reflect.Value { - v = sanitizeValue(v, f.Type().In(0)) - if !s.dynChecker.Next() { - return f.Call([]reflect.Value{v})[0] - } - - // Run the function twice and ensure that we get the same results back. - // We run in goroutines so that the race detector (if enabled) can detect - // unsafe mutations to the input. - c := make(chan reflect.Value) - go detectRaces(c, f, v) - got := <-c - want := f.Call([]reflect.Value{v})[0] - if step.vx, step.vy = got, want; !s.statelessCompare(step).Equal() { - // To avoid false-positives with non-reflexive equality operations, - // we sanity check whether a value is equal to itself. - if step.vx, step.vy = want, want; !s.statelessCompare(step).Equal() { - return want - } - panic(fmt.Sprintf("non-deterministic function detected: %s", function.NameOf(f))) - } - return want -} - -func (s *state) callTTBFunc(f, x, y reflect.Value) bool { - x = sanitizeValue(x, f.Type().In(0)) - y = sanitizeValue(y, f.Type().In(1)) - if !s.dynChecker.Next() { - return f.Call([]reflect.Value{x, y})[0].Bool() - } - - // Swapping the input arguments is sufficient to check that - // f is symmetric and deterministic. - // We run in goroutines so that the race detector (if enabled) can detect - // unsafe mutations to the input. - c := make(chan reflect.Value) - go detectRaces(c, f, y, x) - got := <-c - want := f.Call([]reflect.Value{x, y})[0].Bool() - if !got.IsValid() || got.Bool() != want { - panic(fmt.Sprintf("non-deterministic or non-symmetric function detected: %s", function.NameOf(f))) - } - return want -} - -func detectRaces(c chan<- reflect.Value, f reflect.Value, vs ...reflect.Value) { - var ret reflect.Value - defer func() { - recover() // Ignore panics, let the other call to f panic instead - c <- ret - }() - ret = f.Call(vs)[0] -} - -// sanitizeValue converts nil interfaces of type T to those of type R, -// assuming that T is assignable to R. -// Otherwise, it returns the input value as is. -func sanitizeValue(v reflect.Value, t reflect.Type) reflect.Value { - // TODO(dsnet): Workaround for reflect bug (https://golang.org/issue/22143). - if !flags.AtLeastGo110 { - if v.Kind() == reflect.Interface && v.IsNil() && v.Type() != t { - return reflect.New(t).Elem() - } - } - return v -} - -func (s *state) compareStruct(t reflect.Type, vx, vy reflect.Value) { - var vax, vay reflect.Value // Addressable versions of vx and vy - - step := StructField{&structField{}} - for i := 0; i < t.NumField(); i++ { - step.typ = t.Field(i).Type - step.vx = vx.Field(i) - step.vy = vy.Field(i) - step.name = t.Field(i).Name - step.idx = i - step.unexported = !isExported(step.name) - if step.unexported { - if step.name == "_" { - continue - } - // Defer checking of unexported fields until later to give an - // Ignore a chance to ignore the field. - if !vax.IsValid() || !vay.IsValid() { - // For retrieveUnexportedField to work, the parent struct must - // be addressable. Create a new copy of the values if - // necessary to make them addressable. - vax = makeAddressable(vx) - vay = makeAddressable(vy) - } - step.mayForce = s.exporters[t] - step.pvx = vax - step.pvy = vay - step.field = t.Field(i) - } - s.compareAny(step) - } -} - -func (s *state) compareSlice(t reflect.Type, vx, vy reflect.Value) { - isSlice := t.Kind() == reflect.Slice - if isSlice && (vx.IsNil() || vy.IsNil()) { - s.report(vx.IsNil() && vy.IsNil(), 0) - return - } - - // TODO: Support cyclic data structures. - - step := SliceIndex{&sliceIndex{pathStep: pathStep{typ: t.Elem()}}} - withIndexes := func(ix, iy int) SliceIndex { - if ix >= 0 { - step.vx, step.xkey = vx.Index(ix), ix - } else { - step.vx, step.xkey = reflect.Value{}, -1 - } - if iy >= 0 { - step.vy, step.ykey = vy.Index(iy), iy - } else { - step.vy, step.ykey = reflect.Value{}, -1 - } - return step - } - - // Ignore options are able to ignore missing elements in a slice. - // However, detecting these reliably requires an optimal differencing - // algorithm, for which diff.Difference is not. - // - // Instead, we first iterate through both slices to detect which elements - // would be ignored if standing alone. The index of non-discarded elements - // are stored in a separate slice, which diffing is then performed on. - var indexesX, indexesY []int - var ignoredX, ignoredY []bool - for ix := 0; ix < vx.Len(); ix++ { - ignored := s.statelessCompare(withIndexes(ix, -1)).NumDiff == 0 - if !ignored { - indexesX = append(indexesX, ix) - } - ignoredX = append(ignoredX, ignored) - } - for iy := 0; iy < vy.Len(); iy++ { - ignored := s.statelessCompare(withIndexes(-1, iy)).NumDiff == 0 - if !ignored { - indexesY = append(indexesY, iy) - } - ignoredY = append(ignoredY, ignored) - } - - // Compute an edit-script for slices vx and vy (excluding ignored elements). - edits := diff.Difference(len(indexesX), len(indexesY), func(ix, iy int) diff.Result { - return s.statelessCompare(withIndexes(indexesX[ix], indexesY[iy])) - }) - - // Replay the ignore-scripts and the edit-script. - var ix, iy int - for ix < vx.Len() || iy < vy.Len() { - var e diff.EditType - switch { - case ix < len(ignoredX) && ignoredX[ix]: - e = diff.UniqueX - case iy < len(ignoredY) && ignoredY[iy]: - e = diff.UniqueY - default: - e, edits = edits[0], edits[1:] - } - switch e { - case diff.UniqueX: - s.compareAny(withIndexes(ix, -1)) - ix++ - case diff.UniqueY: - s.compareAny(withIndexes(-1, iy)) - iy++ - default: - s.compareAny(withIndexes(ix, iy)) - ix++ - iy++ - } - } -} - -func (s *state) compareMap(t reflect.Type, vx, vy reflect.Value) { - if vx.IsNil() || vy.IsNil() { - s.report(vx.IsNil() && vy.IsNil(), 0) - return - } - - // TODO: Support cyclic data structures. - - // We combine and sort the two map keys so that we can perform the - // comparisons in a deterministic order. - step := MapIndex{&mapIndex{pathStep: pathStep{typ: t.Elem()}}} - for _, k := range value.SortKeys(append(vx.MapKeys(), vy.MapKeys()...)) { - step.vx = vx.MapIndex(k) - step.vy = vy.MapIndex(k) - step.key = k - if !step.vx.IsValid() && !step.vy.IsValid() { - // It is possible for both vx and vy to be invalid if the - // key contained a NaN value in it. - // - // Even with the ability to retrieve NaN keys in Go 1.12, - // there still isn't a sensible way to compare the values since - // a NaN key may map to multiple unordered values. - // The most reasonable way to compare NaNs would be to compare the - // set of values. However, this is impossible to do efficiently - // since set equality is provably an O(n^2) operation given only - // an Equal function. If we had a Less function or Hash function, - // this could be done in O(n*log(n)) or O(n), respectively. - // - // Rather than adding complex logic to deal with NaNs, make it - // the user's responsibility to compare such obscure maps. - const help = "consider providing a Comparer to compare the map" - panic(fmt.Sprintf("%#v has map key with NaNs\n%s", s.curPath, help)) - } - s.compareAny(step) - } -} - -func (s *state) comparePtr(t reflect.Type, vx, vy reflect.Value) { - if vx.IsNil() || vy.IsNil() { - s.report(vx.IsNil() && vy.IsNil(), 0) - return - } - - // TODO: Support cyclic data structures. - - vx, vy = vx.Elem(), vy.Elem() - s.compareAny(Indirect{&indirect{pathStep{t.Elem(), vx, vy}}}) -} - -func (s *state) compareInterface(t reflect.Type, vx, vy reflect.Value) { - if vx.IsNil() || vy.IsNil() { - s.report(vx.IsNil() && vy.IsNil(), 0) - return - } - vx, vy = vx.Elem(), vy.Elem() - if vx.Type() != vy.Type() { - s.report(false, 0) - return - } - s.compareAny(TypeAssertion{&typeAssertion{pathStep{vx.Type(), vx, vy}}}) -} - -func (s *state) report(eq bool, rf resultFlags) { - if rf&reportByIgnore == 0 { - if eq { - s.result.NumSame++ - rf |= reportEqual - } else { - s.result.NumDiff++ - rf |= reportUnequal - } - } - for _, r := range s.reporters { - r.Report(Result{flags: rf}) - } -} - -// recChecker tracks the state needed to periodically perform checks that -// user provided transformers are not stuck in an infinitely recursive cycle. -type recChecker struct{ next int } - -// Check scans the Path for any recursive transformers and panics when any -// recursive transformers are detected. Note that the presence of a -// recursive Transformer does not necessarily imply an infinite cycle. -// As such, this check only activates after some minimal number of path steps. -func (rc *recChecker) Check(p Path) { - const minLen = 1 << 16 - if rc.next == 0 { - rc.next = minLen - } - if len(p) < rc.next { - return - } - rc.next <<= 1 - - // Check whether the same transformer has appeared at least twice. - var ss []string - m := map[Option]int{} - for _, ps := range p { - if t, ok := ps.(Transform); ok { - t := t.Option() - if m[t] == 1 { // Transformer was used exactly once before - tf := t.(*transformer).fnc.Type() - ss = append(ss, fmt.Sprintf("%v: %v => %v", t, tf.In(0), tf.Out(0))) - } - m[t]++ - } - } - if len(ss) > 0 { - const warning = "recursive set of Transformers detected" - const help = "consider using cmpopts.AcyclicTransformer" - set := strings.Join(ss, "\n\t") - panic(fmt.Sprintf("%s:\n\t%s\n%s", warning, set, help)) - } -} - -// dynChecker tracks the state needed to periodically perform checks that -// user provided functions are symmetric and deterministic. -// The zero value is safe for immediate use. -type dynChecker struct{ curr, next int } - -// Next increments the state and reports whether a check should be performed. -// -// Checks occur every Nth function call, where N is a triangular number: -// 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 ... -// See https://en.wikipedia.org/wiki/Triangular_number -// -// This sequence ensures that the cost of checks drops significantly as -// the number of functions calls grows larger. -func (dc *dynChecker) Next() bool { - ok := dc.curr == dc.next - if ok { - dc.curr = 0 - dc.next++ - } - dc.curr++ - return ok -} - -// makeAddressable returns a value that is always addressable. -// It returns the input verbatim if it is already addressable, -// otherwise it creates a new value and returns an addressable copy. -func makeAddressable(v reflect.Value) reflect.Value { - if v.CanAddr() { - return v - } - vc := reflect.New(v.Type()).Elem() - vc.Set(v) - return vc -} diff --git a/vendor/github.com/google/go-cmp/cmp/export_panic.go b/vendor/github.com/google/go-cmp/cmp/export_panic.go deleted file mode 100644 index abc3a1c3e..000000000 --- a/vendor/github.com/google/go-cmp/cmp/export_panic.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// +build purego - -package cmp - -import "reflect" - -const supportAllowUnexported = false - -func retrieveUnexportedField(reflect.Value, reflect.StructField) reflect.Value { - panic("retrieveUnexportedField is not implemented") -} diff --git a/vendor/github.com/google/go-cmp/cmp/export_unsafe.go b/vendor/github.com/google/go-cmp/cmp/export_unsafe.go deleted file mode 100644 index 59d4ee91b..000000000 --- a/vendor/github.com/google/go-cmp/cmp/export_unsafe.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// +build !purego - -package cmp - -import ( - "reflect" - "unsafe" -) - -const supportAllowUnexported = true - -// retrieveUnexportedField uses unsafe to forcibly retrieve any field from -// a struct such that the value has read-write permissions. -// -// The parent struct, v, must be addressable, while f must be a StructField -// describing the field to retrieve. -func retrieveUnexportedField(v reflect.Value, f reflect.StructField) reflect.Value { - return reflect.NewAt(f.Type, unsafe.Pointer(v.UnsafeAddr()+f.Offset)).Elem() -} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go deleted file mode 100644 index fe98dcc67..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_disable.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// +build !cmp_debug - -package diff - -var debug debugger - -type debugger struct{} - -func (debugger) Begin(_, _ int, f EqualFunc, _, _ *EditScript) EqualFunc { - return f -} -func (debugger) Update() {} -func (debugger) Finish() {} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go deleted file mode 100644 index 597b6ae56..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/diff/debug_enable.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// +build cmp_debug - -package diff - -import ( - "fmt" - "strings" - "sync" - "time" -) - -// The algorithm can be seen running in real-time by enabling debugging: -// go test -tags=cmp_debug -v -// -// Example output: -// === RUN TestDifference/#34 -// ┌───────────────────────────────┐ -// │ \ · · · · · · · · · · · · · · │ -// │ · # · · · · · · · · · · · · · │ -// │ · \ · · · · · · · · · · · · · │ -// │ · · \ · · · · · · · · · · · · │ -// │ · · · X # · · · · · · · · · · │ -// │ · · · # \ · · · · · · · · · · │ -// │ · · · · · # # · · · · · · · · │ -// │ · · · · · # \ · · · · · · · · │ -// │ · · · · · · · \ · · · · · · · │ -// │ · · · · · · · · \ · · · · · · │ -// │ · · · · · · · · · \ · · · · · │ -// │ · · · · · · · · · · \ · · # · │ -// │ · · · · · · · · · · · \ # # · │ -// │ · · · · · · · · · · · # # # · │ -// │ · · · · · · · · · · # # # # · │ -// │ · · · · · · · · · # # # # # · │ -// │ · · · · · · · · · · · · · · \ │ -// └───────────────────────────────┘ -// [.Y..M.XY......YXYXY.|] -// -// The grid represents the edit-graph where the horizontal axis represents -// list X and the vertical axis represents list Y. The start of the two lists -// is the top-left, while the ends are the bottom-right. The '·' represents -// an unexplored node in the graph. The '\' indicates that the two symbols -// from list X and Y are equal. The 'X' indicates that two symbols are similar -// (but not exactly equal) to each other. The '#' indicates that the two symbols -// are different (and not similar). The algorithm traverses this graph trying to -// make the paths starting in the top-left and the bottom-right connect. -// -// The series of '.', 'X', 'Y', and 'M' characters at the bottom represents -// the currently established path from the forward and reverse searches, -// separated by a '|' character. - -const ( - updateDelay = 100 * time.Millisecond - finishDelay = 500 * time.Millisecond - ansiTerminal = true // ANSI escape codes used to move terminal cursor -) - -var debug debugger - -type debugger struct { - sync.Mutex - p1, p2 EditScript - fwdPath, revPath *EditScript - grid []byte - lines int -} - -func (dbg *debugger) Begin(nx, ny int, f EqualFunc, p1, p2 *EditScript) EqualFunc { - dbg.Lock() - dbg.fwdPath, dbg.revPath = p1, p2 - top := "┌─" + strings.Repeat("──", nx) + "┐\n" - row := "│ " + strings.Repeat("· ", nx) + "│\n" - btm := "└─" + strings.Repeat("──", nx) + "┘\n" - dbg.grid = []byte(top + strings.Repeat(row, ny) + btm) - dbg.lines = strings.Count(dbg.String(), "\n") - fmt.Print(dbg) - - // Wrap the EqualFunc so that we can intercept each result. - return func(ix, iy int) (r Result) { - cell := dbg.grid[len(top)+iy*len(row):][len("│ ")+len("· ")*ix:][:len("·")] - for i := range cell { - cell[i] = 0 // Zero out the multiple bytes of UTF-8 middle-dot - } - switch r = f(ix, iy); { - case r.Equal(): - cell[0] = '\\' - case r.Similar(): - cell[0] = 'X' - default: - cell[0] = '#' - } - return - } -} - -func (dbg *debugger) Update() { - dbg.print(updateDelay) -} - -func (dbg *debugger) Finish() { - dbg.print(finishDelay) - dbg.Unlock() -} - -func (dbg *debugger) String() string { - dbg.p1, dbg.p2 = *dbg.fwdPath, dbg.p2[:0] - for i := len(*dbg.revPath) - 1; i >= 0; i-- { - dbg.p2 = append(dbg.p2, (*dbg.revPath)[i]) - } - return fmt.Sprintf("%s[%v|%v]\n\n", dbg.grid, dbg.p1, dbg.p2) -} - -func (dbg *debugger) print(d time.Duration) { - if ansiTerminal { - fmt.Printf("\x1b[%dA", dbg.lines) // Reset terminal cursor - } - fmt.Print(dbg) - time.Sleep(d) -} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go b/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go deleted file mode 100644 index 3d2e42662..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/diff/diff.go +++ /dev/null @@ -1,372 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// Package diff implements an algorithm for producing edit-scripts. -// The edit-script is a sequence of operations needed to transform one list -// of symbols into another (or vice-versa). The edits allowed are insertions, -// deletions, and modifications. The summation of all edits is called the -// Levenshtein distance as this problem is well-known in computer science. -// -// This package prioritizes performance over accuracy. That is, the run time -// is more important than obtaining a minimal Levenshtein distance. -package diff - -// EditType represents a single operation within an edit-script. -type EditType uint8 - -const ( - // Identity indicates that a symbol pair is identical in both list X and Y. - Identity EditType = iota - // UniqueX indicates that a symbol only exists in X and not Y. - UniqueX - // UniqueY indicates that a symbol only exists in Y and not X. - UniqueY - // Modified indicates that a symbol pair is a modification of each other. - Modified -) - -// EditScript represents the series of differences between two lists. -type EditScript []EditType - -// String returns a human-readable string representing the edit-script where -// Identity, UniqueX, UniqueY, and Modified are represented by the -// '.', 'X', 'Y', and 'M' characters, respectively. -func (es EditScript) String() string { - b := make([]byte, len(es)) - for i, e := range es { - switch e { - case Identity: - b[i] = '.' - case UniqueX: - b[i] = 'X' - case UniqueY: - b[i] = 'Y' - case Modified: - b[i] = 'M' - default: - panic("invalid edit-type") - } - } - return string(b) -} - -// stats returns a histogram of the number of each type of edit operation. -func (es EditScript) stats() (s struct{ NI, NX, NY, NM int }) { - for _, e := range es { - switch e { - case Identity: - s.NI++ - case UniqueX: - s.NX++ - case UniqueY: - s.NY++ - case Modified: - s.NM++ - default: - panic("invalid edit-type") - } - } - return -} - -// Dist is the Levenshtein distance and is guaranteed to be 0 if and only if -// lists X and Y are equal. -func (es EditScript) Dist() int { return len(es) - es.stats().NI } - -// LenX is the length of the X list. -func (es EditScript) LenX() int { return len(es) - es.stats().NY } - -// LenY is the length of the Y list. -func (es EditScript) LenY() int { return len(es) - es.stats().NX } - -// EqualFunc reports whether the symbols at indexes ix and iy are equal. -// When called by Difference, the index is guaranteed to be within nx and ny. -type EqualFunc func(ix int, iy int) Result - -// Result is the result of comparison. -// NumSame is the number of sub-elements that are equal. -// NumDiff is the number of sub-elements that are not equal. -type Result struct{ NumSame, NumDiff int } - -// BoolResult returns a Result that is either Equal or not Equal. -func BoolResult(b bool) Result { - if b { - return Result{NumSame: 1} // Equal, Similar - } else { - return Result{NumDiff: 2} // Not Equal, not Similar - } -} - -// Equal indicates whether the symbols are equal. Two symbols are equal -// if and only if NumDiff == 0. If Equal, then they are also Similar. -func (r Result) Equal() bool { return r.NumDiff == 0 } - -// Similar indicates whether two symbols are similar and may be represented -// by using the Modified type. As a special case, we consider binary comparisons -// (i.e., those that return Result{1, 0} or Result{0, 1}) to be similar. -// -// The exact ratio of NumSame to NumDiff to determine similarity may change. -func (r Result) Similar() bool { - // Use NumSame+1 to offset NumSame so that binary comparisons are similar. - return r.NumSame+1 >= r.NumDiff -} - -// Difference reports whether two lists of lengths nx and ny are equal -// given the definition of equality provided as f. -// -// This function returns an edit-script, which is a sequence of operations -// needed to convert one list into the other. The following invariants for -// the edit-script are maintained: -// • eq == (es.Dist()==0) -// • nx == es.LenX() -// • ny == es.LenY() -// -// This algorithm is not guaranteed to be an optimal solution (i.e., one that -// produces an edit-script with a minimal Levenshtein distance). This algorithm -// favors performance over optimality. The exact output is not guaranteed to -// be stable and may change over time. -func Difference(nx, ny int, f EqualFunc) (es EditScript) { - // This algorithm is based on traversing what is known as an "edit-graph". - // See Figure 1 from "An O(ND) Difference Algorithm and Its Variations" - // by Eugene W. Myers. Since D can be as large as N itself, this is - // effectively O(N^2). Unlike the algorithm from that paper, we are not - // interested in the optimal path, but at least some "decent" path. - // - // For example, let X and Y be lists of symbols: - // X = [A B C A B B A] - // Y = [C B A B A C] - // - // The edit-graph can be drawn as the following: - // A B C A B B A - // ┌─────────────┐ - // C │_|_|\|_|_|_|_│ 0 - // B │_|\|_|_|\|\|_│ 1 - // A │\|_|_|\|_|_|\│ 2 - // B │_|\|_|_|\|\|_│ 3 - // A │\|_|_|\|_|_|\│ 4 - // C │ | |\| | | | │ 5 - // └─────────────┘ 6 - // 0 1 2 3 4 5 6 7 - // - // List X is written along the horizontal axis, while list Y is written - // along the vertical axis. At any point on this grid, if the symbol in - // list X matches the corresponding symbol in list Y, then a '\' is drawn. - // The goal of any minimal edit-script algorithm is to find a path from the - // top-left corner to the bottom-right corner, while traveling through the - // fewest horizontal or vertical edges. - // A horizontal edge is equivalent to inserting a symbol from list X. - // A vertical edge is equivalent to inserting a symbol from list Y. - // A diagonal edge is equivalent to a matching symbol between both X and Y. - - // Invariants: - // • 0 ≤ fwdPath.X ≤ (fwdFrontier.X, revFrontier.X) ≤ revPath.X ≤ nx - // • 0 ≤ fwdPath.Y ≤ (fwdFrontier.Y, revFrontier.Y) ≤ revPath.Y ≤ ny - // - // In general: - // • fwdFrontier.X < revFrontier.X - // • fwdFrontier.Y < revFrontier.Y - // Unless, it is time for the algorithm to terminate. - fwdPath := path{+1, point{0, 0}, make(EditScript, 0, (nx+ny)/2)} - revPath := path{-1, point{nx, ny}, make(EditScript, 0)} - fwdFrontier := fwdPath.point // Forward search frontier - revFrontier := revPath.point // Reverse search frontier - - // Search budget bounds the cost of searching for better paths. - // The longest sequence of non-matching symbols that can be tolerated is - // approximately the square-root of the search budget. - searchBudget := 4 * (nx + ny) // O(n) - - // The algorithm below is a greedy, meet-in-the-middle algorithm for - // computing sub-optimal edit-scripts between two lists. - // - // The algorithm is approximately as follows: - // • Searching for differences switches back-and-forth between - // a search that starts at the beginning (the top-left corner), and - // a search that starts at the end (the bottom-right corner). The goal of - // the search is connect with the search from the opposite corner. - // • As we search, we build a path in a greedy manner, where the first - // match seen is added to the path (this is sub-optimal, but provides a - // decent result in practice). When matches are found, we try the next pair - // of symbols in the lists and follow all matches as far as possible. - // • When searching for matches, we search along a diagonal going through - // through the "frontier" point. If no matches are found, we advance the - // frontier towards the opposite corner. - // • This algorithm terminates when either the X coordinates or the - // Y coordinates of the forward and reverse frontier points ever intersect. - // - // This algorithm is correct even if searching only in the forward direction - // or in the reverse direction. We do both because it is commonly observed - // that two lists commonly differ because elements were added to the front - // or end of the other list. - // - // Running the tests with the "cmp_debug" build tag prints a visualization - // of the algorithm running in real-time. This is educational for - // understanding how the algorithm works. See debug_enable.go. - f = debug.Begin(nx, ny, f, &fwdPath.es, &revPath.es) - for { - // Forward search from the beginning. - if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 { - break - } - for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ { - // Search in a diagonal pattern for a match. - z := zigzag(i) - p := point{fwdFrontier.X + z, fwdFrontier.Y - z} - switch { - case p.X >= revPath.X || p.Y < fwdPath.Y: - stop1 = true // Hit top-right corner - case p.Y >= revPath.Y || p.X < fwdPath.X: - stop2 = true // Hit bottom-left corner - case f(p.X, p.Y).Equal(): - // Match found, so connect the path to this point. - fwdPath.connect(p, f) - fwdPath.append(Identity) - // Follow sequence of matches as far as possible. - for fwdPath.X < revPath.X && fwdPath.Y < revPath.Y { - if !f(fwdPath.X, fwdPath.Y).Equal() { - break - } - fwdPath.append(Identity) - } - fwdFrontier = fwdPath.point - stop1, stop2 = true, true - default: - searchBudget-- // Match not found - } - debug.Update() - } - // Advance the frontier towards reverse point. - if revPath.X-fwdFrontier.X >= revPath.Y-fwdFrontier.Y { - fwdFrontier.X++ - } else { - fwdFrontier.Y++ - } - - // Reverse search from the end. - if fwdFrontier.X >= revFrontier.X || fwdFrontier.Y >= revFrontier.Y || searchBudget == 0 { - break - } - for stop1, stop2, i := false, false, 0; !(stop1 && stop2) && searchBudget > 0; i++ { - // Search in a diagonal pattern for a match. - z := zigzag(i) - p := point{revFrontier.X - z, revFrontier.Y + z} - switch { - case fwdPath.X >= p.X || revPath.Y < p.Y: - stop1 = true // Hit bottom-left corner - case fwdPath.Y >= p.Y || revPath.X < p.X: - stop2 = true // Hit top-right corner - case f(p.X-1, p.Y-1).Equal(): - // Match found, so connect the path to this point. - revPath.connect(p, f) - revPath.append(Identity) - // Follow sequence of matches as far as possible. - for fwdPath.X < revPath.X && fwdPath.Y < revPath.Y { - if !f(revPath.X-1, revPath.Y-1).Equal() { - break - } - revPath.append(Identity) - } - revFrontier = revPath.point - stop1, stop2 = true, true - default: - searchBudget-- // Match not found - } - debug.Update() - } - // Advance the frontier towards forward point. - if revFrontier.X-fwdPath.X >= revFrontier.Y-fwdPath.Y { - revFrontier.X-- - } else { - revFrontier.Y-- - } - } - - // Join the forward and reverse paths and then append the reverse path. - fwdPath.connect(revPath.point, f) - for i := len(revPath.es) - 1; i >= 0; i-- { - t := revPath.es[i] - revPath.es = revPath.es[:i] - fwdPath.append(t) - } - debug.Finish() - return fwdPath.es -} - -type path struct { - dir int // +1 if forward, -1 if reverse - point // Leading point of the EditScript path - es EditScript -} - -// connect appends any necessary Identity, Modified, UniqueX, or UniqueY types -// to the edit-script to connect p.point to dst. -func (p *path) connect(dst point, f EqualFunc) { - if p.dir > 0 { - // Connect in forward direction. - for dst.X > p.X && dst.Y > p.Y { - switch r := f(p.X, p.Y); { - case r.Equal(): - p.append(Identity) - case r.Similar(): - p.append(Modified) - case dst.X-p.X >= dst.Y-p.Y: - p.append(UniqueX) - default: - p.append(UniqueY) - } - } - for dst.X > p.X { - p.append(UniqueX) - } - for dst.Y > p.Y { - p.append(UniqueY) - } - } else { - // Connect in reverse direction. - for p.X > dst.X && p.Y > dst.Y { - switch r := f(p.X-1, p.Y-1); { - case r.Equal(): - p.append(Identity) - case r.Similar(): - p.append(Modified) - case p.Y-dst.Y >= p.X-dst.X: - p.append(UniqueY) - default: - p.append(UniqueX) - } - } - for p.X > dst.X { - p.append(UniqueX) - } - for p.Y > dst.Y { - p.append(UniqueY) - } - } -} - -func (p *path) append(t EditType) { - p.es = append(p.es, t) - switch t { - case Identity, Modified: - p.add(p.dir, p.dir) - case UniqueX: - p.add(p.dir, 0) - case UniqueY: - p.add(0, p.dir) - } - debug.Update() -} - -type point struct{ X, Y int } - -func (p *point) add(dx, dy int) { p.X += dx; p.Y += dy } - -// zigzag maps a consecutive sequence of integers to a zig-zag sequence. -// [0 1 2 3 4 5 ...] => [0 -1 +1 -2 +2 ...] -func zigzag(x int) int { - if x&1 != 0 { - x = ^x - } - return x >> 1 -} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go b/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go deleted file mode 100644 index a9e7fc0b5..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/flags/flags.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2019, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package flags - -// Deterministic controls whether the output of Diff should be deterministic. -// This is only used for testing. -var Deterministic bool diff --git a/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go b/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go deleted file mode 100644 index 01aed0a15..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_legacy.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2019, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// +build !go1.10 - -package flags - -// AtLeastGo110 reports whether the Go toolchain is at least Go 1.10. -const AtLeastGo110 = false diff --git a/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go b/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go deleted file mode 100644 index c0b667f58..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/flags/toolchain_recent.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2019, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// +build go1.10 - -package flags - -// AtLeastGo110 reports whether the Go toolchain is at least Go 1.10. -const AtLeastGo110 = true diff --git a/vendor/github.com/google/go-cmp/cmp/internal/function/func.go b/vendor/github.com/google/go-cmp/cmp/internal/function/func.go deleted file mode 100644 index ace1dbe86..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/function/func.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// Package function provides functionality for identifying function types. -package function - -import ( - "reflect" - "regexp" - "runtime" - "strings" -) - -type funcType int - -const ( - _ funcType = iota - - tbFunc // func(T) bool - ttbFunc // func(T, T) bool - trbFunc // func(T, R) bool - tibFunc // func(T, I) bool - trFunc // func(T) R - - Equal = ttbFunc // func(T, T) bool - EqualAssignable = tibFunc // func(T, I) bool; encapsulates func(T, T) bool - Transformer = trFunc // func(T) R - ValueFilter = ttbFunc // func(T, T) bool - Less = ttbFunc // func(T, T) bool - ValuePredicate = tbFunc // func(T) bool - KeyValuePredicate = trbFunc // func(T, R) bool -) - -var boolType = reflect.TypeOf(true) - -// IsType reports whether the reflect.Type is of the specified function type. -func IsType(t reflect.Type, ft funcType) bool { - if t == nil || t.Kind() != reflect.Func || t.IsVariadic() { - return false - } - ni, no := t.NumIn(), t.NumOut() - switch ft { - case tbFunc: // func(T) bool - if ni == 1 && no == 1 && t.Out(0) == boolType { - return true - } - case ttbFunc: // func(T, T) bool - if ni == 2 && no == 1 && t.In(0) == t.In(1) && t.Out(0) == boolType { - return true - } - case trbFunc: // func(T, R) bool - if ni == 2 && no == 1 && t.Out(0) == boolType { - return true - } - case tibFunc: // func(T, I) bool - if ni == 2 && no == 1 && t.In(0).AssignableTo(t.In(1)) && t.Out(0) == boolType { - return true - } - case trFunc: // func(T) R - if ni == 1 && no == 1 { - return true - } - } - return false -} - -var lastIdentRx = regexp.MustCompile(`[_\p{L}][_\p{L}\p{N}]*$`) - -// NameOf returns the name of the function value. -func NameOf(v reflect.Value) string { - fnc := runtime.FuncForPC(v.Pointer()) - if fnc == nil { - return "" - } - fullName := fnc.Name() // e.g., "long/path/name/mypkg.(*MyType).(long/path/name/mypkg.myMethod)-fm" - - // Method closures have a "-fm" suffix. - fullName = strings.TrimSuffix(fullName, "-fm") - - var name string - for len(fullName) > 0 { - inParen := strings.HasSuffix(fullName, ")") - fullName = strings.TrimSuffix(fullName, ")") - - s := lastIdentRx.FindString(fullName) - if s == "" { - break - } - name = s + "." + name - fullName = strings.TrimSuffix(fullName, s) - - if i := strings.LastIndexByte(fullName, '('); inParen && i >= 0 { - fullName = fullName[:i] - } - fullName = strings.TrimSuffix(fullName, ".") - } - return strings.TrimSuffix(name, ".") -} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go deleted file mode 100644 index 0a01c4796..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_purego.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2018, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// +build purego - -package value - -import "reflect" - -// Pointer is an opaque typed pointer and is guaranteed to be comparable. -type Pointer struct { - p uintptr - t reflect.Type -} - -// PointerOf returns a Pointer from v, which must be a -// reflect.Ptr, reflect.Slice, or reflect.Map. -func PointerOf(v reflect.Value) Pointer { - // NOTE: Storing a pointer as an uintptr is technically incorrect as it - // assumes that the GC implementation does not use a moving collector. - return Pointer{v.Pointer(), v.Type()} -} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go b/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go deleted file mode 100644 index da134ae2a..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/pointer_unsafe.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2018, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -// +build !purego - -package value - -import ( - "reflect" - "unsafe" -) - -// Pointer is an opaque typed pointer and is guaranteed to be comparable. -type Pointer struct { - p unsafe.Pointer - t reflect.Type -} - -// PointerOf returns a Pointer from v, which must be a -// reflect.Ptr, reflect.Slice, or reflect.Map. -func PointerOf(v reflect.Value) Pointer { - // The proper representation of a pointer is unsafe.Pointer, - // which is necessary if the GC ever uses a moving collector. - return Pointer{unsafe.Pointer(v.Pointer()), v.Type()} -} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go b/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go deleted file mode 100644 index 24fbae6e3..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/sort.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package value - -import ( - "fmt" - "math" - "reflect" - "sort" -) - -// SortKeys sorts a list of map keys, deduplicating keys if necessary. -// The type of each value must be comparable. -func SortKeys(vs []reflect.Value) []reflect.Value { - if len(vs) == 0 { - return vs - } - - // Sort the map keys. - sort.SliceStable(vs, func(i, j int) bool { return isLess(vs[i], vs[j]) }) - - // Deduplicate keys (fails for NaNs). - vs2 := vs[:1] - for _, v := range vs[1:] { - if isLess(vs2[len(vs2)-1], v) { - vs2 = append(vs2, v) - } - } - return vs2 -} - -// isLess is a generic function for sorting arbitrary map keys. -// The inputs must be of the same type and must be comparable. -func isLess(x, y reflect.Value) bool { - switch x.Type().Kind() { - case reflect.Bool: - return !x.Bool() && y.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return x.Int() < y.Int() - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return x.Uint() < y.Uint() - case reflect.Float32, reflect.Float64: - // NOTE: This does not sort -0 as less than +0 - // since Go maps treat -0 and +0 as equal keys. - fx, fy := x.Float(), y.Float() - return fx < fy || math.IsNaN(fx) && !math.IsNaN(fy) - case reflect.Complex64, reflect.Complex128: - cx, cy := x.Complex(), y.Complex() - rx, ix, ry, iy := real(cx), imag(cx), real(cy), imag(cy) - if rx == ry || (math.IsNaN(rx) && math.IsNaN(ry)) { - return ix < iy || math.IsNaN(ix) && !math.IsNaN(iy) - } - return rx < ry || math.IsNaN(rx) && !math.IsNaN(ry) - case reflect.Ptr, reflect.UnsafePointer, reflect.Chan: - return x.Pointer() < y.Pointer() - case reflect.String: - return x.String() < y.String() - case reflect.Array: - for i := 0; i < x.Len(); i++ { - if isLess(x.Index(i), y.Index(i)) { - return true - } - if isLess(y.Index(i), x.Index(i)) { - return false - } - } - return false - case reflect.Struct: - for i := 0; i < x.NumField(); i++ { - if isLess(x.Field(i), y.Field(i)) { - return true - } - if isLess(y.Field(i), x.Field(i)) { - return false - } - } - return false - case reflect.Interface: - vx, vy := x.Elem(), y.Elem() - if !vx.IsValid() || !vy.IsValid() { - return !vx.IsValid() && vy.IsValid() - } - tx, ty := vx.Type(), vy.Type() - if tx == ty { - return isLess(x.Elem(), y.Elem()) - } - if tx.Kind() != ty.Kind() { - return vx.Kind() < vy.Kind() - } - if tx.String() != ty.String() { - return tx.String() < ty.String() - } - if tx.PkgPath() != ty.PkgPath() { - return tx.PkgPath() < ty.PkgPath() - } - // This can happen in rare situations, so we fallback to just comparing - // the unique pointer for a reflect.Type. This guarantees deterministic - // ordering within a program, but it is obviously not stable. - return reflect.ValueOf(vx.Type()).Pointer() < reflect.ValueOf(vy.Type()).Pointer() - default: - // Must be Func, Map, or Slice; which are not comparable. - panic(fmt.Sprintf("%T is not comparable", x.Type())) - } -} diff --git a/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go b/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go deleted file mode 100644 index 06a8ffd03..000000000 --- a/vendor/github.com/google/go-cmp/cmp/internal/value/zero.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package value - -import ( - "math" - "reflect" -) - -// IsZero reports whether v is the zero value. -// This does not rely on Interface and so can be used on unexported fields. -func IsZero(v reflect.Value) bool { - switch v.Kind() { - case reflect.Bool: - return v.Bool() == false - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return math.Float64bits(v.Float()) == 0 - case reflect.Complex64, reflect.Complex128: - return math.Float64bits(real(v.Complex())) == 0 && math.Float64bits(imag(v.Complex())) == 0 - case reflect.String: - return v.String() == "" - case reflect.UnsafePointer: - return v.Pointer() == 0 - case reflect.Chan, reflect.Func, reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: - return v.IsNil() - case reflect.Array: - for i := 0; i < v.Len(); i++ { - if !IsZero(v.Index(i)) { - return false - } - } - return true - case reflect.Struct: - for i := 0; i < v.NumField(); i++ { - if !IsZero(v.Field(i)) { - return false - } - } - return true - } - return false -} diff --git a/vendor/github.com/google/go-cmp/cmp/options.go b/vendor/github.com/google/go-cmp/cmp/options.go deleted file mode 100644 index 793448160..000000000 --- a/vendor/github.com/google/go-cmp/cmp/options.go +++ /dev/null @@ -1,524 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmp - -import ( - "fmt" - "reflect" - "regexp" - "strings" - - "github.com/google/go-cmp/cmp/internal/function" -) - -// Option configures for specific behavior of Equal and Diff. In particular, -// the fundamental Option functions (Ignore, Transformer, and Comparer), -// configure how equality is determined. -// -// The fundamental options may be composed with filters (FilterPath and -// FilterValues) to control the scope over which they are applied. -// -// The cmp/cmpopts package provides helper functions for creating options that -// may be used with Equal and Diff. -type Option interface { - // filter applies all filters and returns the option that remains. - // Each option may only read s.curPath and call s.callTTBFunc. - // - // An Options is returned only if multiple comparers or transformers - // can apply simultaneously and will only contain values of those types - // or sub-Options containing values of those types. - filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption -} - -// applicableOption represents the following types: -// Fundamental: ignore | validator | *comparer | *transformer -// Grouping: Options -type applicableOption interface { - Option - - // apply executes the option, which may mutate s or panic. - apply(s *state, vx, vy reflect.Value) -} - -// coreOption represents the following types: -// Fundamental: ignore | validator | *comparer | *transformer -// Filters: *pathFilter | *valuesFilter -type coreOption interface { - Option - isCore() -} - -type core struct{} - -func (core) isCore() {} - -// Options is a list of Option values that also satisfies the Option interface. -// Helper comparison packages may return an Options value when packing multiple -// Option values into a single Option. When this package processes an Options, -// it will be implicitly expanded into a flat list. -// -// Applying a filter on an Options is equivalent to applying that same filter -// on all individual options held within. -type Options []Option - -func (opts Options) filter(s *state, t reflect.Type, vx, vy reflect.Value) (out applicableOption) { - for _, opt := range opts { - switch opt := opt.filter(s, t, vx, vy); opt.(type) { - case ignore: - return ignore{} // Only ignore can short-circuit evaluation - case validator: - out = validator{} // Takes precedence over comparer or transformer - case *comparer, *transformer, Options: - switch out.(type) { - case nil: - out = opt - case validator: - // Keep validator - case *comparer, *transformer, Options: - out = Options{out, opt} // Conflicting comparers or transformers - } - } - } - return out -} - -func (opts Options) apply(s *state, _, _ reflect.Value) { - const warning = "ambiguous set of applicable options" - const help = "consider using filters to ensure at most one Comparer or Transformer may apply" - var ss []string - for _, opt := range flattenOptions(nil, opts) { - ss = append(ss, fmt.Sprint(opt)) - } - set := strings.Join(ss, "\n\t") - panic(fmt.Sprintf("%s at %#v:\n\t%s\n%s", warning, s.curPath, set, help)) -} - -func (opts Options) String() string { - var ss []string - for _, opt := range opts { - ss = append(ss, fmt.Sprint(opt)) - } - return fmt.Sprintf("Options{%s}", strings.Join(ss, ", ")) -} - -// FilterPath returns a new Option where opt is only evaluated if filter f -// returns true for the current Path in the value tree. -// -// This filter is called even if a slice element or map entry is missing and -// provides an opportunity to ignore such cases. The filter function must be -// symmetric such that the filter result is identical regardless of whether the -// missing value is from x or y. -// -// The option passed in may be an Ignore, Transformer, Comparer, Options, or -// a previously filtered Option. -func FilterPath(f func(Path) bool, opt Option) Option { - if f == nil { - panic("invalid path filter function") - } - if opt := normalizeOption(opt); opt != nil { - return &pathFilter{fnc: f, opt: opt} - } - return nil -} - -type pathFilter struct { - core - fnc func(Path) bool - opt Option -} - -func (f pathFilter) filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption { - if f.fnc(s.curPath) { - return f.opt.filter(s, t, vx, vy) - } - return nil -} - -func (f pathFilter) String() string { - return fmt.Sprintf("FilterPath(%s, %v)", function.NameOf(reflect.ValueOf(f.fnc)), f.opt) -} - -// FilterValues returns a new Option where opt is only evaluated if filter f, -// which is a function of the form "func(T, T) bool", returns true for the -// current pair of values being compared. If either value is invalid or -// the type of the values is not assignable to T, then this filter implicitly -// returns false. -// -// The filter function must be -// symmetric (i.e., agnostic to the order of the inputs) and -// deterministic (i.e., produces the same result when given the same inputs). -// If T is an interface, it is possible that f is called with two values with -// different concrete types that both implement T. -// -// The option passed in may be an Ignore, Transformer, Comparer, Options, or -// a previously filtered Option. -func FilterValues(f interface{}, opt Option) Option { - v := reflect.ValueOf(f) - if !function.IsType(v.Type(), function.ValueFilter) || v.IsNil() { - panic(fmt.Sprintf("invalid values filter function: %T", f)) - } - if opt := normalizeOption(opt); opt != nil { - vf := &valuesFilter{fnc: v, opt: opt} - if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 { - vf.typ = ti - } - return vf - } - return nil -} - -type valuesFilter struct { - core - typ reflect.Type // T - fnc reflect.Value // func(T, T) bool - opt Option -} - -func (f valuesFilter) filter(s *state, t reflect.Type, vx, vy reflect.Value) applicableOption { - if !vx.IsValid() || !vx.CanInterface() || !vy.IsValid() || !vy.CanInterface() { - return nil - } - if (f.typ == nil || t.AssignableTo(f.typ)) && s.callTTBFunc(f.fnc, vx, vy) { - return f.opt.filter(s, t, vx, vy) - } - return nil -} - -func (f valuesFilter) String() string { - return fmt.Sprintf("FilterValues(%s, %v)", function.NameOf(f.fnc), f.opt) -} - -// Ignore is an Option that causes all comparisons to be ignored. -// This value is intended to be combined with FilterPath or FilterValues. -// It is an error to pass an unfiltered Ignore option to Equal. -func Ignore() Option { return ignore{} } - -type ignore struct{ core } - -func (ignore) isFiltered() bool { return false } -func (ignore) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption { return ignore{} } -func (ignore) apply(s *state, _, _ reflect.Value) { s.report(true, reportByIgnore) } -func (ignore) String() string { return "Ignore()" } - -// validator is a sentinel Option type to indicate that some options could not -// be evaluated due to unexported fields, missing slice elements, or -// missing map entries. Both values are validator only for unexported fields. -type validator struct{ core } - -func (validator) filter(_ *state, _ reflect.Type, vx, vy reflect.Value) applicableOption { - if !vx.IsValid() || !vy.IsValid() { - return validator{} - } - if !vx.CanInterface() || !vy.CanInterface() { - return validator{} - } - return nil -} -func (validator) apply(s *state, vx, vy reflect.Value) { - // Implies missing slice element or map entry. - if !vx.IsValid() || !vy.IsValid() { - s.report(vx.IsValid() == vy.IsValid(), 0) - return - } - - // Unable to Interface implies unexported field without visibility access. - if !vx.CanInterface() || !vy.CanInterface() { - const help = "consider using a custom Comparer; if you control the implementation of type, you can also consider AllowUnexported or cmpopts.IgnoreUnexported" - panic(fmt.Sprintf("cannot handle unexported field: %#v\n%s", s.curPath, help)) - } - - panic("not reachable") -} - -// identRx represents a valid identifier according to the Go specification. -const identRx = `[_\p{L}][_\p{L}\p{N}]*` - -var identsRx = regexp.MustCompile(`^` + identRx + `(\.` + identRx + `)*$`) - -// Transformer returns an Option that applies a transformation function that -// converts values of a certain type into that of another. -// -// The transformer f must be a function "func(T) R" that converts values of -// type T to those of type R and is implicitly filtered to input values -// assignable to T. The transformer must not mutate T in any way. -// -// To help prevent some cases of infinite recursive cycles applying the -// same transform to the output of itself (e.g., in the case where the -// input and output types are the same), an implicit filter is added such that -// a transformer is applicable only if that exact transformer is not already -// in the tail of the Path since the last non-Transform step. -// For situations where the implicit filter is still insufficient, -// consider using cmpopts.AcyclicTransformer, which adds a filter -// to prevent the transformer from being recursively applied upon itself. -// -// The name is a user provided label that is used as the Transform.Name in the -// transformation PathStep (and eventually shown in the Diff output). -// The name must be a valid identifier or qualified identifier in Go syntax. -// If empty, an arbitrary name is used. -func Transformer(name string, f interface{}) Option { - v := reflect.ValueOf(f) - if !function.IsType(v.Type(), function.Transformer) || v.IsNil() { - panic(fmt.Sprintf("invalid transformer function: %T", f)) - } - if name == "" { - name = function.NameOf(v) - if !identsRx.MatchString(name) { - name = "λ" // Lambda-symbol as placeholder name - } - } else if !identsRx.MatchString(name) { - panic(fmt.Sprintf("invalid name: %q", name)) - } - tr := &transformer{name: name, fnc: reflect.ValueOf(f)} - if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 { - tr.typ = ti - } - return tr -} - -type transformer struct { - core - name string - typ reflect.Type // T - fnc reflect.Value // func(T) R -} - -func (tr *transformer) isFiltered() bool { return tr.typ != nil } - -func (tr *transformer) filter(s *state, t reflect.Type, _, _ reflect.Value) applicableOption { - for i := len(s.curPath) - 1; i >= 0; i-- { - if t, ok := s.curPath[i].(Transform); !ok { - break // Hit most recent non-Transform step - } else if tr == t.trans { - return nil // Cannot directly use same Transform - } - } - if tr.typ == nil || t.AssignableTo(tr.typ) { - return tr - } - return nil -} - -func (tr *transformer) apply(s *state, vx, vy reflect.Value) { - step := Transform{&transform{pathStep{typ: tr.fnc.Type().Out(0)}, tr}} - vvx := s.callTRFunc(tr.fnc, vx, step) - vvy := s.callTRFunc(tr.fnc, vy, step) - step.vx, step.vy = vvx, vvy - s.compareAny(step) -} - -func (tr transformer) String() string { - return fmt.Sprintf("Transformer(%s, %s)", tr.name, function.NameOf(tr.fnc)) -} - -// Comparer returns an Option that determines whether two values are equal -// to each other. -// -// The comparer f must be a function "func(T, T) bool" and is implicitly -// filtered to input values assignable to T. If T is an interface, it is -// possible that f is called with two values of different concrete types that -// both implement T. -// -// The equality function must be: -// • Symmetric: equal(x, y) == equal(y, x) -// • Deterministic: equal(x, y) == equal(x, y) -// • Pure: equal(x, y) does not modify x or y -func Comparer(f interface{}) Option { - v := reflect.ValueOf(f) - if !function.IsType(v.Type(), function.Equal) || v.IsNil() { - panic(fmt.Sprintf("invalid comparer function: %T", f)) - } - cm := &comparer{fnc: v} - if ti := v.Type().In(0); ti.Kind() != reflect.Interface || ti.NumMethod() > 0 { - cm.typ = ti - } - return cm -} - -type comparer struct { - core - typ reflect.Type // T - fnc reflect.Value // func(T, T) bool -} - -func (cm *comparer) isFiltered() bool { return cm.typ != nil } - -func (cm *comparer) filter(_ *state, t reflect.Type, _, _ reflect.Value) applicableOption { - if cm.typ == nil || t.AssignableTo(cm.typ) { - return cm - } - return nil -} - -func (cm *comparer) apply(s *state, vx, vy reflect.Value) { - eq := s.callTTBFunc(cm.fnc, vx, vy) - s.report(eq, reportByFunc) -} - -func (cm comparer) String() string { - return fmt.Sprintf("Comparer(%s)", function.NameOf(cm.fnc)) -} - -// AllowUnexported returns an Option that forcibly allows operations on -// unexported fields in certain structs, which are specified by passing in a -// value of each struct type. -// -// Users of this option must understand that comparing on unexported fields -// from external packages is not safe since changes in the internal -// implementation of some external package may cause the result of Equal -// to unexpectedly change. However, it may be valid to use this option on types -// defined in an internal package where the semantic meaning of an unexported -// field is in the control of the user. -// -// In many cases, a custom Comparer should be used instead that defines -// equality as a function of the public API of a type rather than the underlying -// unexported implementation. -// -// For example, the reflect.Type documentation defines equality to be determined -// by the == operator on the interface (essentially performing a shallow pointer -// comparison) and most attempts to compare *regexp.Regexp types are interested -// in only checking that the regular expression strings are equal. -// Both of these are accomplished using Comparers: -// -// Comparer(func(x, y reflect.Type) bool { return x == y }) -// Comparer(func(x, y *regexp.Regexp) bool { return x.String() == y.String() }) -// -// In other cases, the cmpopts.IgnoreUnexported option can be used to ignore -// all unexported fields on specified struct types. -func AllowUnexported(types ...interface{}) Option { - if !supportAllowUnexported { - panic("AllowUnexported is not supported on purego builds, Google App Engine Standard, or GopherJS") - } - m := make(map[reflect.Type]bool) - for _, typ := range types { - t := reflect.TypeOf(typ) - if t.Kind() != reflect.Struct { - panic(fmt.Sprintf("invalid struct type: %T", typ)) - } - m[t] = true - } - return visibleStructs(m) -} - -type visibleStructs map[reflect.Type]bool - -func (visibleStructs) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption { - panic("not implemented") -} - -// Result represents the comparison result for a single node and -// is provided by cmp when calling Result (see Reporter). -type Result struct { - _ [0]func() // Make Result incomparable - flags resultFlags -} - -// Equal reports whether the node was determined to be equal or not. -// As a special case, ignored nodes are considered equal. -func (r Result) Equal() bool { - return r.flags&(reportEqual|reportByIgnore) != 0 -} - -// ByIgnore reports whether the node is equal because it was ignored. -// This never reports true if Equal reports false. -func (r Result) ByIgnore() bool { - return r.flags&reportByIgnore != 0 -} - -// ByMethod reports whether the Equal method determined equality. -func (r Result) ByMethod() bool { - return r.flags&reportByMethod != 0 -} - -// ByFunc reports whether a Comparer function determined equality. -func (r Result) ByFunc() bool { - return r.flags&reportByFunc != 0 -} - -type resultFlags uint - -const ( - _ resultFlags = (1 << iota) / 2 - - reportEqual - reportUnequal - reportByIgnore - reportByMethod - reportByFunc -) - -// Reporter is an Option that can be passed to Equal. When Equal traverses -// the value trees, it calls PushStep as it descends into each node in the -// tree and PopStep as it ascend out of the node. The leaves of the tree are -// either compared (determined to be equal or not equal) or ignored and reported -// as such by calling the Report method. -func Reporter(r interface { - // PushStep is called when a tree-traversal operation is performed. - // The PathStep itself is only valid until the step is popped. - // The PathStep.Values are valid for the duration of the entire traversal - // and must not be mutated. - // - // Equal always calls PushStep at the start to provide an operation-less - // PathStep used to report the root values. - // - // Within a slice, the exact set of inserted, removed, or modified elements - // is unspecified and may change in future implementations. - // The entries of a map are iterated through in an unspecified order. - PushStep(PathStep) - - // Report is called exactly once on leaf nodes to report whether the - // comparison identified the node as equal, unequal, or ignored. - // A leaf node is one that is immediately preceded by and followed by - // a pair of PushStep and PopStep calls. - Report(Result) - - // PopStep ascends back up the value tree. - // There is always a matching pop call for every push call. - PopStep() -}) Option { - return reporter{r} -} - -type reporter struct{ reporterIface } -type reporterIface interface { - PushStep(PathStep) - Report(Result) - PopStep() -} - -func (reporter) filter(_ *state, _ reflect.Type, _, _ reflect.Value) applicableOption { - panic("not implemented") -} - -// normalizeOption normalizes the input options such that all Options groups -// are flattened and groups with a single element are reduced to that element. -// Only coreOptions and Options containing coreOptions are allowed. -func normalizeOption(src Option) Option { - switch opts := flattenOptions(nil, Options{src}); len(opts) { - case 0: - return nil - case 1: - return opts[0] - default: - return opts - } -} - -// flattenOptions copies all options in src to dst as a flat list. -// Only coreOptions and Options containing coreOptions are allowed. -func flattenOptions(dst, src Options) Options { - for _, opt := range src { - switch opt := opt.(type) { - case nil: - continue - case Options: - dst = flattenOptions(dst, opt) - case coreOption: - dst = append(dst, opt) - default: - panic(fmt.Sprintf("invalid option type: %T", opt)) - } - } - return dst -} diff --git a/vendor/github.com/google/go-cmp/cmp/path.go b/vendor/github.com/google/go-cmp/cmp/path.go deleted file mode 100644 index 96fffd291..000000000 --- a/vendor/github.com/google/go-cmp/cmp/path.go +++ /dev/null @@ -1,308 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmp - -import ( - "fmt" - "reflect" - "strings" - "unicode" - "unicode/utf8" -) - -// Path is a list of PathSteps describing the sequence of operations to get -// from some root type to the current position in the value tree. -// The first Path element is always an operation-less PathStep that exists -// simply to identify the initial type. -// -// When traversing structs with embedded structs, the embedded struct will -// always be accessed as a field before traversing the fields of the -// embedded struct themselves. That is, an exported field from the -// embedded struct will never be accessed directly from the parent struct. -type Path []PathStep - -// PathStep is a union-type for specific operations to traverse -// a value's tree structure. Users of this package never need to implement -// these types as values of this type will be returned by this package. -// -// Implementations of this interface are -// StructField, SliceIndex, MapIndex, Indirect, TypeAssertion, and Transform. -type PathStep interface { - String() string - - // Type is the resulting type after performing the path step. - Type() reflect.Type - - // Values is the resulting values after performing the path step. - // The type of each valid value is guaranteed to be identical to Type. - // - // In some cases, one or both may be invalid or have restrictions: - // • For StructField, both are not interface-able if the current field - // is unexported and the struct type is not explicitly permitted by - // AllowUnexported to traverse unexported fields. - // • For SliceIndex, one may be invalid if an element is missing from - // either the x or y slice. - // • For MapIndex, one may be invalid if an entry is missing from - // either the x or y map. - // - // The provided values must not be mutated. - Values() (vx, vy reflect.Value) -} - -var ( - _ PathStep = StructField{} - _ PathStep = SliceIndex{} - _ PathStep = MapIndex{} - _ PathStep = Indirect{} - _ PathStep = TypeAssertion{} - _ PathStep = Transform{} -) - -func (pa *Path) push(s PathStep) { - *pa = append(*pa, s) -} - -func (pa *Path) pop() { - *pa = (*pa)[:len(*pa)-1] -} - -// Last returns the last PathStep in the Path. -// If the path is empty, this returns a non-nil PathStep that reports a nil Type. -func (pa Path) Last() PathStep { - return pa.Index(-1) -} - -// Index returns the ith step in the Path and supports negative indexing. -// A negative index starts counting from the tail of the Path such that -1 -// refers to the last step, -2 refers to the second-to-last step, and so on. -// If index is invalid, this returns a non-nil PathStep that reports a nil Type. -func (pa Path) Index(i int) PathStep { - if i < 0 { - i = len(pa) + i - } - if i < 0 || i >= len(pa) { - return pathStep{} - } - return pa[i] -} - -// String returns the simplified path to a node. -// The simplified path only contains struct field accesses. -// -// For example: -// MyMap.MySlices.MyField -func (pa Path) String() string { - var ss []string - for _, s := range pa { - if _, ok := s.(StructField); ok { - ss = append(ss, s.String()) - } - } - return strings.TrimPrefix(strings.Join(ss, ""), ".") -} - -// GoString returns the path to a specific node using Go syntax. -// -// For example: -// (*root.MyMap["key"].(*mypkg.MyStruct).MySlices)[2][3].MyField -func (pa Path) GoString() string { - var ssPre, ssPost []string - var numIndirect int - for i, s := range pa { - var nextStep PathStep - if i+1 < len(pa) { - nextStep = pa[i+1] - } - switch s := s.(type) { - case Indirect: - numIndirect++ - pPre, pPost := "(", ")" - switch nextStep.(type) { - case Indirect: - continue // Next step is indirection, so let them batch up - case StructField: - numIndirect-- // Automatic indirection on struct fields - case nil: - pPre, pPost = "", "" // Last step; no need for parenthesis - } - if numIndirect > 0 { - ssPre = append(ssPre, pPre+strings.Repeat("*", numIndirect)) - ssPost = append(ssPost, pPost) - } - numIndirect = 0 - continue - case Transform: - ssPre = append(ssPre, s.trans.name+"(") - ssPost = append(ssPost, ")") - continue - } - ssPost = append(ssPost, s.String()) - } - for i, j := 0, len(ssPre)-1; i < j; i, j = i+1, j-1 { - ssPre[i], ssPre[j] = ssPre[j], ssPre[i] - } - return strings.Join(ssPre, "") + strings.Join(ssPost, "") -} - -type pathStep struct { - typ reflect.Type - vx, vy reflect.Value -} - -func (ps pathStep) Type() reflect.Type { return ps.typ } -func (ps pathStep) Values() (vx, vy reflect.Value) { return ps.vx, ps.vy } -func (ps pathStep) String() string { - if ps.typ == nil { - return "" - } - s := ps.typ.String() - if s == "" || strings.ContainsAny(s, "{}\n") { - return "root" // Type too simple or complex to print - } - return fmt.Sprintf("{%s}", s) -} - -// StructField represents a struct field access on a field called Name. -type StructField struct{ *structField } -type structField struct { - pathStep - name string - idx int - - // These fields are used for forcibly accessing an unexported field. - // pvx, pvy, and field are only valid if unexported is true. - unexported bool - mayForce bool // Forcibly allow visibility - pvx, pvy reflect.Value // Parent values - field reflect.StructField // Field information -} - -func (sf StructField) Type() reflect.Type { return sf.typ } -func (sf StructField) Values() (vx, vy reflect.Value) { - if !sf.unexported { - return sf.vx, sf.vy // CanInterface reports true - } - - // Forcibly obtain read-write access to an unexported struct field. - if sf.mayForce { - vx = retrieveUnexportedField(sf.pvx, sf.field) - vy = retrieveUnexportedField(sf.pvy, sf.field) - return vx, vy // CanInterface reports true - } - return sf.vx, sf.vy // CanInterface reports false -} -func (sf StructField) String() string { return fmt.Sprintf(".%s", sf.name) } - -// Name is the field name. -func (sf StructField) Name() string { return sf.name } - -// Index is the index of the field in the parent struct type. -// See reflect.Type.Field. -func (sf StructField) Index() int { return sf.idx } - -// SliceIndex is an index operation on a slice or array at some index Key. -type SliceIndex struct{ *sliceIndex } -type sliceIndex struct { - pathStep - xkey, ykey int -} - -func (si SliceIndex) Type() reflect.Type { return si.typ } -func (si SliceIndex) Values() (vx, vy reflect.Value) { return si.vx, si.vy } -func (si SliceIndex) String() string { - switch { - case si.xkey == si.ykey: - return fmt.Sprintf("[%d]", si.xkey) - case si.ykey == -1: - // [5->?] means "I don't know where X[5] went" - return fmt.Sprintf("[%d->?]", si.xkey) - case si.xkey == -1: - // [?->3] means "I don't know where Y[3] came from" - return fmt.Sprintf("[?->%d]", si.ykey) - default: - // [5->3] means "X[5] moved to Y[3]" - return fmt.Sprintf("[%d->%d]", si.xkey, si.ykey) - } -} - -// Key is the index key; it may return -1 if in a split state -func (si SliceIndex) Key() int { - if si.xkey != si.ykey { - return -1 - } - return si.xkey -} - -// SplitKeys are the indexes for indexing into slices in the -// x and y values, respectively. These indexes may differ due to the -// insertion or removal of an element in one of the slices, causing -// all of the indexes to be shifted. If an index is -1, then that -// indicates that the element does not exist in the associated slice. -// -// Key is guaranteed to return -1 if and only if the indexes returned -// by SplitKeys are not the same. SplitKeys will never return -1 for -// both indexes. -func (si SliceIndex) SplitKeys() (ix, iy int) { return si.xkey, si.ykey } - -// MapIndex is an index operation on a map at some index Key. -type MapIndex struct{ *mapIndex } -type mapIndex struct { - pathStep - key reflect.Value -} - -func (mi MapIndex) Type() reflect.Type { return mi.typ } -func (mi MapIndex) Values() (vx, vy reflect.Value) { return mi.vx, mi.vy } -func (mi MapIndex) String() string { return fmt.Sprintf("[%#v]", mi.key) } - -// Key is the value of the map key. -func (mi MapIndex) Key() reflect.Value { return mi.key } - -// Indirect represents pointer indirection on the parent type. -type Indirect struct{ *indirect } -type indirect struct { - pathStep -} - -func (in Indirect) Type() reflect.Type { return in.typ } -func (in Indirect) Values() (vx, vy reflect.Value) { return in.vx, in.vy } -func (in Indirect) String() string { return "*" } - -// TypeAssertion represents a type assertion on an interface. -type TypeAssertion struct{ *typeAssertion } -type typeAssertion struct { - pathStep -} - -func (ta TypeAssertion) Type() reflect.Type { return ta.typ } -func (ta TypeAssertion) Values() (vx, vy reflect.Value) { return ta.vx, ta.vy } -func (ta TypeAssertion) String() string { return fmt.Sprintf(".(%v)", ta.typ) } - -// Transform is a transformation from the parent type to the current type. -type Transform struct{ *transform } -type transform struct { - pathStep - trans *transformer -} - -func (tf Transform) Type() reflect.Type { return tf.typ } -func (tf Transform) Values() (vx, vy reflect.Value) { return tf.vx, tf.vy } -func (tf Transform) String() string { return fmt.Sprintf("%s()", tf.trans.name) } - -// Name is the name of the Transformer. -func (tf Transform) Name() string { return tf.trans.name } - -// Func is the function pointer to the transformer function. -func (tf Transform) Func() reflect.Value { return tf.trans.fnc } - -// Option returns the originally constructed Transformer option. -// The == operator can be used to detect the exact option used. -func (tf Transform) Option() Option { return tf.trans } - -// isExported reports whether the identifier is exported. -func isExported(id string) bool { - r, _ := utf8.DecodeRuneInString(id) - return unicode.IsUpper(r) -} diff --git a/vendor/github.com/google/go-cmp/cmp/report.go b/vendor/github.com/google/go-cmp/cmp/report.go deleted file mode 100644 index 6ddf29993..000000000 --- a/vendor/github.com/google/go-cmp/cmp/report.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2017, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmp - -// defaultReporter implements the reporter interface. -// -// As Equal serially calls the PushStep, Report, and PopStep methods, the -// defaultReporter constructs a tree-based representation of the compared value -// and the result of each comparison (see valueNode). -// -// When the String method is called, the FormatDiff method transforms the -// valueNode tree into a textNode tree, which is a tree-based representation -// of the textual output (see textNode). -// -// Lastly, the textNode.String method produces the final report as a string. -type defaultReporter struct { - root *valueNode - curr *valueNode -} - -func (r *defaultReporter) PushStep(ps PathStep) { - r.curr = r.curr.PushStep(ps) - if r.root == nil { - r.root = r.curr - } -} -func (r *defaultReporter) Report(rs Result) { - r.curr.Report(rs) -} -func (r *defaultReporter) PopStep() { - r.curr = r.curr.PopStep() -} - -// String provides a full report of the differences detected as a structured -// literal in pseudo-Go syntax. String may only be called after the entire tree -// has been traversed. -func (r *defaultReporter) String() string { - assert(r.root != nil && r.curr == nil) - if r.root.NumDiff == 0 { - return "" - } - return formatOptions{}.FormatDiff(r.root).String() -} - -func assert(ok bool) { - if !ok { - panic("assertion failure") - } -} diff --git a/vendor/github.com/google/go-cmp/cmp/report_compare.go b/vendor/github.com/google/go-cmp/cmp/report_compare.go deleted file mode 100644 index 17a05eede..000000000 --- a/vendor/github.com/google/go-cmp/cmp/report_compare.go +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright 2019, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmp - -import ( - "fmt" - "reflect" - - "github.com/google/go-cmp/cmp/internal/value" -) - -// TODO: Enforce limits? -// * Enforce maximum number of records to print per node? -// * Enforce maximum size in bytes allowed? -// * As a heuristic, use less verbosity for equal nodes than unequal nodes. -// TODO: Enforce unique outputs? -// * Avoid Stringer methods if it results in same output? -// * Print pointer address if outputs still equal? - -// numContextRecords is the number of surrounding equal records to print. -const numContextRecords = 2 - -type diffMode byte - -const ( - diffUnknown diffMode = 0 - diffIdentical diffMode = ' ' - diffRemoved diffMode = '-' - diffInserted diffMode = '+' -) - -type typeMode int - -const ( - // emitType always prints the type. - emitType typeMode = iota - // elideType never prints the type. - elideType - // autoType prints the type only for composite kinds - // (i.e., structs, slices, arrays, and maps). - autoType -) - -type formatOptions struct { - // DiffMode controls the output mode of FormatDiff. - // - // If diffUnknown, then produce a diff of the x and y values. - // If diffIdentical, then emit values as if they were equal. - // If diffRemoved, then only emit x values (ignoring y values). - // If diffInserted, then only emit y values (ignoring x values). - DiffMode diffMode - - // TypeMode controls whether to print the type for the current node. - // - // As a general rule of thumb, we always print the type of the next node - // after an interface, and always elide the type of the next node after - // a slice or map node. - TypeMode typeMode - - // formatValueOptions are options specific to printing reflect.Values. - formatValueOptions -} - -func (opts formatOptions) WithDiffMode(d diffMode) formatOptions { - opts.DiffMode = d - return opts -} -func (opts formatOptions) WithTypeMode(t typeMode) formatOptions { - opts.TypeMode = t - return opts -} - -// FormatDiff converts a valueNode tree into a textNode tree, where the later -// is a textual representation of the differences detected in the former. -func (opts formatOptions) FormatDiff(v *valueNode) textNode { - // Check whether we have specialized formatting for this node. - // This is not necessary, but helpful for producing more readable outputs. - if opts.CanFormatDiffSlice(v) { - return opts.FormatDiffSlice(v) - } - - // For leaf nodes, format the value based on the reflect.Values alone. - if v.MaxDepth == 0 { - switch opts.DiffMode { - case diffUnknown, diffIdentical: - // Format Equal. - if v.NumDiff == 0 { - outx := opts.FormatValue(v.ValueX, visitedPointers{}) - outy := opts.FormatValue(v.ValueY, visitedPointers{}) - if v.NumIgnored > 0 && v.NumSame == 0 { - return textEllipsis - } else if outx.Len() < outy.Len() { - return outx - } else { - return outy - } - } - - // Format unequal. - assert(opts.DiffMode == diffUnknown) - var list textList - outx := opts.WithTypeMode(elideType).FormatValue(v.ValueX, visitedPointers{}) - outy := opts.WithTypeMode(elideType).FormatValue(v.ValueY, visitedPointers{}) - if outx != nil { - list = append(list, textRecord{Diff: '-', Value: outx}) - } - if outy != nil { - list = append(list, textRecord{Diff: '+', Value: outy}) - } - return opts.WithTypeMode(emitType).FormatType(v.Type, list) - case diffRemoved: - return opts.FormatValue(v.ValueX, visitedPointers{}) - case diffInserted: - return opts.FormatValue(v.ValueY, visitedPointers{}) - default: - panic("invalid diff mode") - } - } - - // Descend into the child value node. - if v.TransformerName != "" { - out := opts.WithTypeMode(emitType).FormatDiff(v.Value) - out = textWrap{"Inverse(" + v.TransformerName + ", ", out, ")"} - return opts.FormatType(v.Type, out) - } else { - switch k := v.Type.Kind(); k { - case reflect.Struct, reflect.Array, reflect.Slice, reflect.Map: - return opts.FormatType(v.Type, opts.formatDiffList(v.Records, k)) - case reflect.Ptr: - return textWrap{"&", opts.FormatDiff(v.Value), ""} - case reflect.Interface: - return opts.WithTypeMode(emitType).FormatDiff(v.Value) - default: - panic(fmt.Sprintf("%v cannot have children", k)) - } - } -} - -func (opts formatOptions) formatDiffList(recs []reportRecord, k reflect.Kind) textNode { - // Derive record name based on the data structure kind. - var name string - var formatKey func(reflect.Value) string - switch k { - case reflect.Struct: - name = "field" - opts = opts.WithTypeMode(autoType) - formatKey = func(v reflect.Value) string { return v.String() } - case reflect.Slice, reflect.Array: - name = "element" - opts = opts.WithTypeMode(elideType) - formatKey = func(reflect.Value) string { return "" } - case reflect.Map: - name = "entry" - opts = opts.WithTypeMode(elideType) - formatKey = formatMapKey - } - - // Handle unification. - switch opts.DiffMode { - case diffIdentical, diffRemoved, diffInserted: - var list textList - var deferredEllipsis bool // Add final "..." to indicate records were dropped - for _, r := range recs { - // Elide struct fields that are zero value. - if k == reflect.Struct { - var isZero bool - switch opts.DiffMode { - case diffIdentical: - isZero = value.IsZero(r.Value.ValueX) || value.IsZero(r.Value.ValueY) - case diffRemoved: - isZero = value.IsZero(r.Value.ValueX) - case diffInserted: - isZero = value.IsZero(r.Value.ValueY) - } - if isZero { - continue - } - } - // Elide ignored nodes. - if r.Value.NumIgnored > 0 && r.Value.NumSame+r.Value.NumDiff == 0 { - deferredEllipsis = !(k == reflect.Slice || k == reflect.Array) - if !deferredEllipsis { - list.AppendEllipsis(diffStats{}) - } - continue - } - if out := opts.FormatDiff(r.Value); out != nil { - list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) - } - } - if deferredEllipsis { - list.AppendEllipsis(diffStats{}) - } - return textWrap{"{", list, "}"} - case diffUnknown: - default: - panic("invalid diff mode") - } - - // Handle differencing. - var list textList - groups := coalesceAdjacentRecords(name, recs) - for i, ds := range groups { - // Handle equal records. - if ds.NumDiff() == 0 { - // Compute the number of leading and trailing records to print. - var numLo, numHi int - numEqual := ds.NumIgnored + ds.NumIdentical - for numLo < numContextRecords && numLo+numHi < numEqual && i != 0 { - if r := recs[numLo].Value; r.NumIgnored > 0 && r.NumSame+r.NumDiff == 0 { - break - } - numLo++ - } - for numHi < numContextRecords && numLo+numHi < numEqual && i != len(groups)-1 { - if r := recs[numEqual-numHi-1].Value; r.NumIgnored > 0 && r.NumSame+r.NumDiff == 0 { - break - } - numHi++ - } - if numEqual-(numLo+numHi) == 1 && ds.NumIgnored == 0 { - numHi++ // Avoid pointless coalescing of a single equal record - } - - // Format the equal values. - for _, r := range recs[:numLo] { - out := opts.WithDiffMode(diffIdentical).FormatDiff(r.Value) - list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) - } - if numEqual > numLo+numHi { - ds.NumIdentical -= numLo + numHi - list.AppendEllipsis(ds) - } - for _, r := range recs[numEqual-numHi : numEqual] { - out := opts.WithDiffMode(diffIdentical).FormatDiff(r.Value) - list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) - } - recs = recs[numEqual:] - continue - } - - // Handle unequal records. - for _, r := range recs[:ds.NumDiff()] { - switch { - case opts.CanFormatDiffSlice(r.Value): - out := opts.FormatDiffSlice(r.Value) - list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) - case r.Value.NumChildren == r.Value.MaxDepth: - outx := opts.WithDiffMode(diffRemoved).FormatDiff(r.Value) - outy := opts.WithDiffMode(diffInserted).FormatDiff(r.Value) - if outx != nil { - list = append(list, textRecord{Diff: diffRemoved, Key: formatKey(r.Key), Value: outx}) - } - if outy != nil { - list = append(list, textRecord{Diff: diffInserted, Key: formatKey(r.Key), Value: outy}) - } - default: - out := opts.FormatDiff(r.Value) - list = append(list, textRecord{Key: formatKey(r.Key), Value: out}) - } - } - recs = recs[ds.NumDiff():] - } - assert(len(recs) == 0) - return textWrap{"{", list, "}"} -} - -// coalesceAdjacentRecords coalesces the list of records into groups of -// adjacent equal, or unequal counts. -func coalesceAdjacentRecords(name string, recs []reportRecord) (groups []diffStats) { - var prevCase int // Arbitrary index into which case last occurred - lastStats := func(i int) *diffStats { - if prevCase != i { - groups = append(groups, diffStats{Name: name}) - prevCase = i - } - return &groups[len(groups)-1] - } - for _, r := range recs { - switch rv := r.Value; { - case rv.NumIgnored > 0 && rv.NumSame+rv.NumDiff == 0: - lastStats(1).NumIgnored++ - case rv.NumDiff == 0: - lastStats(1).NumIdentical++ - case rv.NumDiff > 0 && !rv.ValueY.IsValid(): - lastStats(2).NumRemoved++ - case rv.NumDiff > 0 && !rv.ValueX.IsValid(): - lastStats(2).NumInserted++ - default: - lastStats(2).NumModified++ - } - } - return groups -} diff --git a/vendor/github.com/google/go-cmp/cmp/report_reflect.go b/vendor/github.com/google/go-cmp/cmp/report_reflect.go deleted file mode 100644 index 2761b6289..000000000 --- a/vendor/github.com/google/go-cmp/cmp/report_reflect.go +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright 2019, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmp - -import ( - "fmt" - "reflect" - "strconv" - "strings" - "unicode" - - "github.com/google/go-cmp/cmp/internal/flags" - "github.com/google/go-cmp/cmp/internal/value" -) - -type formatValueOptions struct { - // AvoidStringer controls whether to avoid calling custom stringer - // methods like error.Error or fmt.Stringer.String. - AvoidStringer bool - - // ShallowPointers controls whether to avoid descending into pointers. - // Useful when printing map keys, where pointer comparison is performed - // on the pointer address rather than the pointed-at value. - ShallowPointers bool - - // PrintAddresses controls whether to print the address of all pointers, - // slice elements, and maps. - PrintAddresses bool -} - -// FormatType prints the type as if it were wrapping s. -// This may return s as-is depending on the current type and TypeMode mode. -func (opts formatOptions) FormatType(t reflect.Type, s textNode) textNode { - // Check whether to emit the type or not. - switch opts.TypeMode { - case autoType: - switch t.Kind() { - case reflect.Struct, reflect.Slice, reflect.Array, reflect.Map: - if s.Equal(textNil) { - return s - } - default: - return s - } - case elideType: - return s - } - - // Determine the type label, applying special handling for unnamed types. - typeName := t.String() - if t.Name() == "" { - // According to Go grammar, certain type literals contain symbols that - // do not strongly bind to the next lexicographical token (e.g., *T). - switch t.Kind() { - case reflect.Chan, reflect.Func, reflect.Ptr: - typeName = "(" + typeName + ")" - } - typeName = strings.Replace(typeName, "struct {", "struct{", -1) - typeName = strings.Replace(typeName, "interface {", "interface{", -1) - } - - // Avoid wrap the value in parenthesis if unnecessary. - if s, ok := s.(textWrap); ok { - hasParens := strings.HasPrefix(s.Prefix, "(") && strings.HasSuffix(s.Suffix, ")") - hasBraces := strings.HasPrefix(s.Prefix, "{") && strings.HasSuffix(s.Suffix, "}") - if hasParens || hasBraces { - return textWrap{typeName, s, ""} - } - } - return textWrap{typeName + "(", s, ")"} -} - -// FormatValue prints the reflect.Value, taking extra care to avoid descending -// into pointers already in m. As pointers are visited, m is also updated. -func (opts formatOptions) FormatValue(v reflect.Value, m visitedPointers) (out textNode) { - if !v.IsValid() { - return nil - } - t := v.Type() - - // Check whether there is an Error or String method to call. - if !opts.AvoidStringer && v.CanInterface() { - // Avoid calling Error or String methods on nil receivers since many - // implementations crash when doing so. - if (t.Kind() != reflect.Ptr && t.Kind() != reflect.Interface) || !v.IsNil() { - switch v := v.Interface().(type) { - case error: - return textLine("e" + formatString(v.Error())) - case fmt.Stringer: - return textLine("s" + formatString(v.String())) - } - } - } - - // Check whether to explicitly wrap the result with the type. - var skipType bool - defer func() { - if !skipType { - out = opts.FormatType(t, out) - } - }() - - var ptr string - switch t.Kind() { - case reflect.Bool: - return textLine(fmt.Sprint(v.Bool())) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return textLine(fmt.Sprint(v.Int())) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - // Unnamed uints are usually bytes or words, so use hexadecimal. - if t.PkgPath() == "" || t.Kind() == reflect.Uintptr { - return textLine(formatHex(v.Uint())) - } - return textLine(fmt.Sprint(v.Uint())) - case reflect.Float32, reflect.Float64: - return textLine(fmt.Sprint(v.Float())) - case reflect.Complex64, reflect.Complex128: - return textLine(fmt.Sprint(v.Complex())) - case reflect.String: - return textLine(formatString(v.String())) - case reflect.UnsafePointer, reflect.Chan, reflect.Func: - return textLine(formatPointer(v)) - case reflect.Struct: - var list textList - for i := 0; i < v.NumField(); i++ { - vv := v.Field(i) - if value.IsZero(vv) { - continue // Elide fields with zero values - } - s := opts.WithTypeMode(autoType).FormatValue(vv, m) - list = append(list, textRecord{Key: t.Field(i).Name, Value: s}) - } - return textWrap{"{", list, "}"} - case reflect.Slice: - if v.IsNil() { - return textNil - } - if opts.PrintAddresses { - ptr = formatPointer(v) - } - fallthrough - case reflect.Array: - var list textList - for i := 0; i < v.Len(); i++ { - vi := v.Index(i) - if vi.CanAddr() { // Check for cyclic elements - p := vi.Addr() - if m.Visit(p) { - var out textNode - out = textLine(formatPointer(p)) - out = opts.WithTypeMode(emitType).FormatType(p.Type(), out) - out = textWrap{"*", out, ""} - list = append(list, textRecord{Value: out}) - continue - } - } - s := opts.WithTypeMode(elideType).FormatValue(vi, m) - list = append(list, textRecord{Value: s}) - } - return textWrap{ptr + "{", list, "}"} - case reflect.Map: - if v.IsNil() { - return textNil - } - if m.Visit(v) { - return textLine(formatPointer(v)) - } - - var list textList - for _, k := range value.SortKeys(v.MapKeys()) { - sk := formatMapKey(k) - sv := opts.WithTypeMode(elideType).FormatValue(v.MapIndex(k), m) - list = append(list, textRecord{Key: sk, Value: sv}) - } - if opts.PrintAddresses { - ptr = formatPointer(v) - } - return textWrap{ptr + "{", list, "}"} - case reflect.Ptr: - if v.IsNil() { - return textNil - } - if m.Visit(v) || opts.ShallowPointers { - return textLine(formatPointer(v)) - } - if opts.PrintAddresses { - ptr = formatPointer(v) - } - skipType = true // Let the underlying value print the type instead - return textWrap{"&" + ptr, opts.FormatValue(v.Elem(), m), ""} - case reflect.Interface: - if v.IsNil() { - return textNil - } - // Interfaces accept different concrete types, - // so configure the underlying value to explicitly print the type. - skipType = true // Print the concrete type instead - return opts.WithTypeMode(emitType).FormatValue(v.Elem(), m) - default: - panic(fmt.Sprintf("%v kind not handled", v.Kind())) - } -} - -// formatMapKey formats v as if it were a map key. -// The result is guaranteed to be a single line. -func formatMapKey(v reflect.Value) string { - var opts formatOptions - opts.TypeMode = elideType - opts.ShallowPointers = true - s := opts.FormatValue(v, visitedPointers{}).String() - return strings.TrimSpace(s) -} - -// formatString prints s as a double-quoted or backtick-quoted string. -func formatString(s string) string { - // Use quoted string if it the same length as a raw string literal. - // Otherwise, attempt to use the raw string form. - qs := strconv.Quote(s) - if len(qs) == 1+len(s)+1 { - return qs - } - - // Disallow newlines to ensure output is a single line. - // Only allow printable runes for readability purposes. - rawInvalid := func(r rune) bool { - return r == '`' || r == '\n' || !(unicode.IsPrint(r) || r == '\t') - } - if strings.IndexFunc(s, rawInvalid) < 0 { - return "`" + s + "`" - } - return qs -} - -// formatHex prints u as a hexadecimal integer in Go notation. -func formatHex(u uint64) string { - var f string - switch { - case u <= 0xff: - f = "0x%02x" - case u <= 0xffff: - f = "0x%04x" - case u <= 0xffffff: - f = "0x%06x" - case u <= 0xffffffff: - f = "0x%08x" - case u <= 0xffffffffff: - f = "0x%010x" - case u <= 0xffffffffffff: - f = "0x%012x" - case u <= 0xffffffffffffff: - f = "0x%014x" - case u <= 0xffffffffffffffff: - f = "0x%016x" - } - return fmt.Sprintf(f, u) -} - -// formatPointer prints the address of the pointer. -func formatPointer(v reflect.Value) string { - p := v.Pointer() - if flags.Deterministic { - p = 0xdeadf00f // Only used for stable testing purposes - } - return fmt.Sprintf("⟪0x%x⟫", p) -} - -type visitedPointers map[value.Pointer]struct{} - -// Visit inserts pointer v into the visited map and reports whether it had -// already been visited before. -func (m visitedPointers) Visit(v reflect.Value) bool { - p := value.PointerOf(v) - _, visited := m[p] - m[p] = struct{}{} - return visited -} diff --git a/vendor/github.com/google/go-cmp/cmp/report_slices.go b/vendor/github.com/google/go-cmp/cmp/report_slices.go deleted file mode 100644 index eafcf2e4c..000000000 --- a/vendor/github.com/google/go-cmp/cmp/report_slices.go +++ /dev/null @@ -1,333 +0,0 @@ -// Copyright 2019, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmp - -import ( - "bytes" - "fmt" - "reflect" - "strings" - "unicode" - "unicode/utf8" - - "github.com/google/go-cmp/cmp/internal/diff" -) - -// CanFormatDiffSlice reports whether we support custom formatting for nodes -// that are slices of primitive kinds or strings. -func (opts formatOptions) CanFormatDiffSlice(v *valueNode) bool { - switch { - case opts.DiffMode != diffUnknown: - return false // Must be formatting in diff mode - case v.NumDiff == 0: - return false // No differences detected - case v.NumIgnored+v.NumCompared+v.NumTransformed > 0: - // TODO: Handle the case where someone uses bytes.Equal on a large slice. - return false // Some custom option was used to determined equality - case !v.ValueX.IsValid() || !v.ValueY.IsValid(): - return false // Both values must be valid - } - - switch t := v.Type; t.Kind() { - case reflect.String: - case reflect.Array, reflect.Slice: - // Only slices of primitive types have specialized handling. - switch t.Elem().Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, - reflect.Bool, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128: - default: - return false - } - - // If a sufficient number of elements already differ, - // use specialized formatting even if length requirement is not met. - if v.NumDiff > v.NumSame { - return true - } - default: - return false - } - - // Use specialized string diffing for longer slices or strings. - const minLength = 64 - return v.ValueX.Len() >= minLength && v.ValueY.Len() >= minLength -} - -// FormatDiffSlice prints a diff for the slices (or strings) represented by v. -// This provides custom-tailored logic to make printing of differences in -// textual strings and slices of primitive kinds more readable. -func (opts formatOptions) FormatDiffSlice(v *valueNode) textNode { - assert(opts.DiffMode == diffUnknown) - t, vx, vy := v.Type, v.ValueX, v.ValueY - - // Auto-detect the type of the data. - var isLinedText, isText, isBinary bool - var sx, sy string - switch { - case t.Kind() == reflect.String: - sx, sy = vx.String(), vy.String() - isText = true // Initial estimate, verify later - case t.Kind() == reflect.Slice && t.Elem() == reflect.TypeOf(byte(0)): - sx, sy = string(vx.Bytes()), string(vy.Bytes()) - isBinary = true // Initial estimate, verify later - case t.Kind() == reflect.Array: - // Arrays need to be addressable for slice operations to work. - vx2, vy2 := reflect.New(t).Elem(), reflect.New(t).Elem() - vx2.Set(vx) - vy2.Set(vy) - vx, vy = vx2, vy2 - } - if isText || isBinary { - var numLines, lastLineIdx, maxLineLen int - isBinary = false - for i, r := range sx + sy { - if !(unicode.IsPrint(r) || unicode.IsSpace(r)) || r == utf8.RuneError { - isBinary = true - break - } - if r == '\n' { - if maxLineLen < i-lastLineIdx { - maxLineLen = i - lastLineIdx - } - lastLineIdx = i + 1 - numLines++ - } - } - isText = !isBinary - isLinedText = isText && numLines >= 4 && maxLineLen <= 256 - } - - // Format the string into printable records. - var list textList - var delim string - switch { - // If the text appears to be multi-lined text, - // then perform differencing across individual lines. - case isLinedText: - ssx := strings.Split(sx, "\n") - ssy := strings.Split(sy, "\n") - list = opts.formatDiffSlice( - reflect.ValueOf(ssx), reflect.ValueOf(ssy), 1, "line", - func(v reflect.Value, d diffMode) textRecord { - s := formatString(v.Index(0).String()) - return textRecord{Diff: d, Value: textLine(s)} - }, - ) - delim = "\n" - // If the text appears to be single-lined text, - // then perform differencing in approximately fixed-sized chunks. - // The output is printed as quoted strings. - case isText: - list = opts.formatDiffSlice( - reflect.ValueOf(sx), reflect.ValueOf(sy), 64, "byte", - func(v reflect.Value, d diffMode) textRecord { - s := formatString(v.String()) - return textRecord{Diff: d, Value: textLine(s)} - }, - ) - delim = "" - // If the text appears to be binary data, - // then perform differencing in approximately fixed-sized chunks. - // The output is inspired by hexdump. - case isBinary: - list = opts.formatDiffSlice( - reflect.ValueOf(sx), reflect.ValueOf(sy), 16, "byte", - func(v reflect.Value, d diffMode) textRecord { - var ss []string - for i := 0; i < v.Len(); i++ { - ss = append(ss, formatHex(v.Index(i).Uint())) - } - s := strings.Join(ss, ", ") - comment := commentString(fmt.Sprintf("%c|%v|", d, formatASCII(v.String()))) - return textRecord{Diff: d, Value: textLine(s), Comment: comment} - }, - ) - // For all other slices of primitive types, - // then perform differencing in approximately fixed-sized chunks. - // The size of each chunk depends on the width of the element kind. - default: - var chunkSize int - if t.Elem().Kind() == reflect.Bool { - chunkSize = 16 - } else { - switch t.Elem().Bits() { - case 8: - chunkSize = 16 - case 16: - chunkSize = 12 - case 32: - chunkSize = 8 - default: - chunkSize = 8 - } - } - list = opts.formatDiffSlice( - vx, vy, chunkSize, t.Elem().Kind().String(), - func(v reflect.Value, d diffMode) textRecord { - var ss []string - for i := 0; i < v.Len(); i++ { - switch t.Elem().Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - ss = append(ss, fmt.Sprint(v.Index(i).Int())) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - ss = append(ss, formatHex(v.Index(i).Uint())) - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128: - ss = append(ss, fmt.Sprint(v.Index(i).Interface())) - } - } - s := strings.Join(ss, ", ") - return textRecord{Diff: d, Value: textLine(s)} - }, - ) - } - - // Wrap the output with appropriate type information. - var out textNode = textWrap{"{", list, "}"} - if !isText { - // The "{...}" byte-sequence literal is not valid Go syntax for strings. - // Emit the type for extra clarity (e.g. "string{...}"). - if t.Kind() == reflect.String { - opts = opts.WithTypeMode(emitType) - } - return opts.FormatType(t, out) - } - switch t.Kind() { - case reflect.String: - out = textWrap{"strings.Join(", out, fmt.Sprintf(", %q)", delim)} - if t != reflect.TypeOf(string("")) { - out = opts.FormatType(t, out) - } - case reflect.Slice: - out = textWrap{"bytes.Join(", out, fmt.Sprintf(", %q)", delim)} - if t != reflect.TypeOf([]byte(nil)) { - out = opts.FormatType(t, out) - } - } - return out -} - -// formatASCII formats s as an ASCII string. -// This is useful for printing binary strings in a semi-legible way. -func formatASCII(s string) string { - b := bytes.Repeat([]byte{'.'}, len(s)) - for i := 0; i < len(s); i++ { - if ' ' <= s[i] && s[i] <= '~' { - b[i] = s[i] - } - } - return string(b) -} - -func (opts formatOptions) formatDiffSlice( - vx, vy reflect.Value, chunkSize int, name string, - makeRec func(reflect.Value, diffMode) textRecord, -) (list textList) { - es := diff.Difference(vx.Len(), vy.Len(), func(ix int, iy int) diff.Result { - return diff.BoolResult(vx.Index(ix).Interface() == vy.Index(iy).Interface()) - }) - - appendChunks := func(v reflect.Value, d diffMode) int { - n0 := v.Len() - for v.Len() > 0 { - n := chunkSize - if n > v.Len() { - n = v.Len() - } - list = append(list, makeRec(v.Slice(0, n), d)) - v = v.Slice(n, v.Len()) - } - return n0 - v.Len() - } - - groups := coalesceAdjacentEdits(name, es) - groups = coalesceInterveningIdentical(groups, chunkSize/4) - for i, ds := range groups { - // Print equal. - if ds.NumDiff() == 0 { - // Compute the number of leading and trailing equal bytes to print. - var numLo, numHi int - numEqual := ds.NumIgnored + ds.NumIdentical - for numLo < chunkSize*numContextRecords && numLo+numHi < numEqual && i != 0 { - numLo++ - } - for numHi < chunkSize*numContextRecords && numLo+numHi < numEqual && i != len(groups)-1 { - numHi++ - } - if numEqual-(numLo+numHi) <= chunkSize && ds.NumIgnored == 0 { - numHi = numEqual - numLo // Avoid pointless coalescing of single equal row - } - - // Print the equal bytes. - appendChunks(vx.Slice(0, numLo), diffIdentical) - if numEqual > numLo+numHi { - ds.NumIdentical -= numLo + numHi - list.AppendEllipsis(ds) - } - appendChunks(vx.Slice(numEqual-numHi, numEqual), diffIdentical) - vx = vx.Slice(numEqual, vx.Len()) - vy = vy.Slice(numEqual, vy.Len()) - continue - } - - // Print unequal. - nx := appendChunks(vx.Slice(0, ds.NumIdentical+ds.NumRemoved+ds.NumModified), diffRemoved) - vx = vx.Slice(nx, vx.Len()) - ny := appendChunks(vy.Slice(0, ds.NumIdentical+ds.NumInserted+ds.NumModified), diffInserted) - vy = vy.Slice(ny, vy.Len()) - } - assert(vx.Len() == 0 && vy.Len() == 0) - return list -} - -// coalesceAdjacentEdits coalesces the list of edits into groups of adjacent -// equal or unequal counts. -func coalesceAdjacentEdits(name string, es diff.EditScript) (groups []diffStats) { - var prevCase int // Arbitrary index into which case last occurred - lastStats := func(i int) *diffStats { - if prevCase != i { - groups = append(groups, diffStats{Name: name}) - prevCase = i - } - return &groups[len(groups)-1] - } - for _, e := range es { - switch e { - case diff.Identity: - lastStats(1).NumIdentical++ - case diff.UniqueX: - lastStats(2).NumRemoved++ - case diff.UniqueY: - lastStats(2).NumInserted++ - case diff.Modified: - lastStats(2).NumModified++ - } - } - return groups -} - -// coalesceInterveningIdentical coalesces sufficiently short (<= windowSize) -// equal groups into adjacent unequal groups that currently result in a -// dual inserted/removed printout. This acts as a high-pass filter to smooth -// out high-frequency changes within the windowSize. -func coalesceInterveningIdentical(groups []diffStats, windowSize int) []diffStats { - groups, groupsOrig := groups[:0], groups - for i, ds := range groupsOrig { - if len(groups) >= 2 && ds.NumDiff() > 0 { - prev := &groups[len(groups)-2] // Unequal group - curr := &groups[len(groups)-1] // Equal group - next := &groupsOrig[i] // Unequal group - hadX, hadY := prev.NumRemoved > 0, prev.NumInserted > 0 - hasX, hasY := next.NumRemoved > 0, next.NumInserted > 0 - if ((hadX || hasX) && (hadY || hasY)) && curr.NumIdentical <= windowSize { - *prev = prev.Append(*curr).Append(*next) - groups = groups[:len(groups)-1] // Truncate off equal group - continue - } - } - groups = append(groups, ds) - } - return groups -} diff --git a/vendor/github.com/google/go-cmp/cmp/report_text.go b/vendor/github.com/google/go-cmp/cmp/report_text.go deleted file mode 100644 index 8b8fcab7b..000000000 --- a/vendor/github.com/google/go-cmp/cmp/report_text.go +++ /dev/null @@ -1,387 +0,0 @@ -// Copyright 2019, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmp - -import ( - "bytes" - "fmt" - "math/rand" - "strings" - "time" - - "github.com/google/go-cmp/cmp/internal/flags" -) - -var randBool = rand.New(rand.NewSource(time.Now().Unix())).Intn(2) == 0 - -type indentMode int - -func (n indentMode) appendIndent(b []byte, d diffMode) []byte { - // The output of Diff is documented as being unstable to provide future - // flexibility in changing the output for more humanly readable reports. - // This logic intentionally introduces instability to the exact output - // so that users can detect accidental reliance on stability early on, - // rather than much later when an actual change to the format occurs. - if flags.Deterministic || randBool { - // Use regular spaces (U+0020). - switch d { - case diffUnknown, diffIdentical: - b = append(b, " "...) - case diffRemoved: - b = append(b, "- "...) - case diffInserted: - b = append(b, "+ "...) - } - } else { - // Use non-breaking spaces (U+00a0). - switch d { - case diffUnknown, diffIdentical: - b = append(b, "  "...) - case diffRemoved: - b = append(b, "- "...) - case diffInserted: - b = append(b, "+ "...) - } - } - return repeatCount(n).appendChar(b, '\t') -} - -type repeatCount int - -func (n repeatCount) appendChar(b []byte, c byte) []byte { - for ; n > 0; n-- { - b = append(b, c) - } - return b -} - -// textNode is a simplified tree-based representation of structured text. -// Possible node types are textWrap, textList, or textLine. -type textNode interface { - // Len reports the length in bytes of a single-line version of the tree. - // Nested textRecord.Diff and textRecord.Comment fields are ignored. - Len() int - // Equal reports whether the two trees are structurally identical. - // Nested textRecord.Diff and textRecord.Comment fields are compared. - Equal(textNode) bool - // String returns the string representation of the text tree. - // It is not guaranteed that len(x.String()) == x.Len(), - // nor that x.String() == y.String() implies that x.Equal(y). - String() string - - // formatCompactTo formats the contents of the tree as a single-line string - // to the provided buffer. Any nested textRecord.Diff and textRecord.Comment - // fields are ignored. - // - // However, not all nodes in the tree should be collapsed as a single-line. - // If a node can be collapsed as a single-line, it is replaced by a textLine - // node. Since the top-level node cannot replace itself, this also returns - // the current node itself. - // - // This does not mutate the receiver. - formatCompactTo([]byte, diffMode) ([]byte, textNode) - // formatExpandedTo formats the contents of the tree as a multi-line string - // to the provided buffer. In order for column alignment to operate well, - // formatCompactTo must be called before calling formatExpandedTo. - formatExpandedTo([]byte, diffMode, indentMode) []byte -} - -// textWrap is a wrapper that concatenates a prefix and/or a suffix -// to the underlying node. -type textWrap struct { - Prefix string // e.g., "bytes.Buffer{" - Value textNode // textWrap | textList | textLine - Suffix string // e.g., "}" -} - -func (s textWrap) Len() int { - return len(s.Prefix) + s.Value.Len() + len(s.Suffix) -} -func (s1 textWrap) Equal(s2 textNode) bool { - if s2, ok := s2.(textWrap); ok { - return s1.Prefix == s2.Prefix && s1.Value.Equal(s2.Value) && s1.Suffix == s2.Suffix - } - return false -} -func (s textWrap) String() string { - var d diffMode - var n indentMode - _, s2 := s.formatCompactTo(nil, d) - b := n.appendIndent(nil, d) // Leading indent - b = s2.formatExpandedTo(b, d, n) // Main body - b = append(b, '\n') // Trailing newline - return string(b) -} -func (s textWrap) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) { - n0 := len(b) // Original buffer length - b = append(b, s.Prefix...) - b, s.Value = s.Value.formatCompactTo(b, d) - b = append(b, s.Suffix...) - if _, ok := s.Value.(textLine); ok { - return b, textLine(b[n0:]) - } - return b, s -} -func (s textWrap) formatExpandedTo(b []byte, d diffMode, n indentMode) []byte { - b = append(b, s.Prefix...) - b = s.Value.formatExpandedTo(b, d, n) - b = append(b, s.Suffix...) - return b -} - -// textList is a comma-separated list of textWrap or textLine nodes. -// The list may be formatted as multi-lines or single-line at the discretion -// of the textList.formatCompactTo method. -type textList []textRecord -type textRecord struct { - Diff diffMode // e.g., 0 or '-' or '+' - Key string // e.g., "MyField" - Value textNode // textWrap | textLine - Comment fmt.Stringer // e.g., "6 identical fields" -} - -// AppendEllipsis appends a new ellipsis node to the list if none already -// exists at the end. If cs is non-zero it coalesces the statistics with the -// previous diffStats. -func (s *textList) AppendEllipsis(ds diffStats) { - hasStats := ds != diffStats{} - if len(*s) == 0 || !(*s)[len(*s)-1].Value.Equal(textEllipsis) { - if hasStats { - *s = append(*s, textRecord{Value: textEllipsis, Comment: ds}) - } else { - *s = append(*s, textRecord{Value: textEllipsis}) - } - return - } - if hasStats { - (*s)[len(*s)-1].Comment = (*s)[len(*s)-1].Comment.(diffStats).Append(ds) - } -} - -func (s textList) Len() (n int) { - for i, r := range s { - n += len(r.Key) - if r.Key != "" { - n += len(": ") - } - n += r.Value.Len() - if i < len(s)-1 { - n += len(", ") - } - } - return n -} - -func (s1 textList) Equal(s2 textNode) bool { - if s2, ok := s2.(textList); ok { - if len(s1) != len(s2) { - return false - } - for i := range s1 { - r1, r2 := s1[i], s2[i] - if !(r1.Diff == r2.Diff && r1.Key == r2.Key && r1.Value.Equal(r2.Value) && r1.Comment == r2.Comment) { - return false - } - } - return true - } - return false -} - -func (s textList) String() string { - return textWrap{"{", s, "}"}.String() -} - -func (s textList) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) { - s = append(textList(nil), s...) // Avoid mutating original - - // Determine whether we can collapse this list as a single line. - n0 := len(b) // Original buffer length - var multiLine bool - for i, r := range s { - if r.Diff == diffInserted || r.Diff == diffRemoved { - multiLine = true - } - b = append(b, r.Key...) - if r.Key != "" { - b = append(b, ": "...) - } - b, s[i].Value = r.Value.formatCompactTo(b, d|r.Diff) - if _, ok := s[i].Value.(textLine); !ok { - multiLine = true - } - if r.Comment != nil { - multiLine = true - } - if i < len(s)-1 { - b = append(b, ", "...) - } - } - // Force multi-lined output when printing a removed/inserted node that - // is sufficiently long. - if (d == diffInserted || d == diffRemoved) && len(b[n0:]) > 80 { - multiLine = true - } - if !multiLine { - return b, textLine(b[n0:]) - } - return b, s -} - -func (s textList) formatExpandedTo(b []byte, d diffMode, n indentMode) []byte { - alignKeyLens := s.alignLens( - func(r textRecord) bool { - _, isLine := r.Value.(textLine) - return r.Key == "" || !isLine - }, - func(r textRecord) int { return len(r.Key) }, - ) - alignValueLens := s.alignLens( - func(r textRecord) bool { - _, isLine := r.Value.(textLine) - return !isLine || r.Value.Equal(textEllipsis) || r.Comment == nil - }, - func(r textRecord) int { return len(r.Value.(textLine)) }, - ) - - // Format the list as a multi-lined output. - n++ - for i, r := range s { - b = n.appendIndent(append(b, '\n'), d|r.Diff) - if r.Key != "" { - b = append(b, r.Key+": "...) - } - b = alignKeyLens[i].appendChar(b, ' ') - - b = r.Value.formatExpandedTo(b, d|r.Diff, n) - if !r.Value.Equal(textEllipsis) { - b = append(b, ',') - } - b = alignValueLens[i].appendChar(b, ' ') - - if r.Comment != nil { - b = append(b, " // "+r.Comment.String()...) - } - } - n-- - - return n.appendIndent(append(b, '\n'), d) -} - -func (s textList) alignLens( - skipFunc func(textRecord) bool, - lenFunc func(textRecord) int, -) []repeatCount { - var startIdx, endIdx, maxLen int - lens := make([]repeatCount, len(s)) - for i, r := range s { - if skipFunc(r) { - for j := startIdx; j < endIdx && j < len(s); j++ { - lens[j] = repeatCount(maxLen - lenFunc(s[j])) - } - startIdx, endIdx, maxLen = i+1, i+1, 0 - } else { - if maxLen < lenFunc(r) { - maxLen = lenFunc(r) - } - endIdx = i + 1 - } - } - for j := startIdx; j < endIdx && j < len(s); j++ { - lens[j] = repeatCount(maxLen - lenFunc(s[j])) - } - return lens -} - -// textLine is a single-line segment of text and is always a leaf node -// in the textNode tree. -type textLine []byte - -var ( - textNil = textLine("nil") - textEllipsis = textLine("...") -) - -func (s textLine) Len() int { - return len(s) -} -func (s1 textLine) Equal(s2 textNode) bool { - if s2, ok := s2.(textLine); ok { - return bytes.Equal([]byte(s1), []byte(s2)) - } - return false -} -func (s textLine) String() string { - return string(s) -} -func (s textLine) formatCompactTo(b []byte, d diffMode) ([]byte, textNode) { - return append(b, s...), s -} -func (s textLine) formatExpandedTo(b []byte, _ diffMode, _ indentMode) []byte { - return append(b, s...) -} - -type diffStats struct { - Name string - NumIgnored int - NumIdentical int - NumRemoved int - NumInserted int - NumModified int -} - -func (s diffStats) NumDiff() int { - return s.NumRemoved + s.NumInserted + s.NumModified -} - -func (s diffStats) Append(ds diffStats) diffStats { - assert(s.Name == ds.Name) - s.NumIgnored += ds.NumIgnored - s.NumIdentical += ds.NumIdentical - s.NumRemoved += ds.NumRemoved - s.NumInserted += ds.NumInserted - s.NumModified += ds.NumModified - return s -} - -// String prints a humanly-readable summary of coalesced records. -// -// Example: -// diffStats{Name: "Field", NumIgnored: 5}.String() => "5 ignored fields" -func (s diffStats) String() string { - var ss []string - var sum int - labels := [...]string{"ignored", "identical", "removed", "inserted", "modified"} - counts := [...]int{s.NumIgnored, s.NumIdentical, s.NumRemoved, s.NumInserted, s.NumModified} - for i, n := range counts { - if n > 0 { - ss = append(ss, fmt.Sprintf("%d %v", n, labels[i])) - } - sum += n - } - - // Pluralize the name (adjusting for some obscure English grammar rules). - name := s.Name - if sum > 1 { - name += "s" - if strings.HasSuffix(name, "ys") { - name = name[:len(name)-2] + "ies" // e.g., "entrys" => "entries" - } - } - - // Format the list according to English grammar (with Oxford comma). - switch n := len(ss); n { - case 0: - return "" - case 1, 2: - return strings.Join(ss, " and ") + " " + name - default: - return strings.Join(ss[:n-1], ", ") + ", and " + ss[n-1] + " " + name - } -} - -type commentString string - -func (s commentString) String() string { return string(s) } diff --git a/vendor/github.com/google/go-cmp/cmp/report_value.go b/vendor/github.com/google/go-cmp/cmp/report_value.go deleted file mode 100644 index 83031a7f5..000000000 --- a/vendor/github.com/google/go-cmp/cmp/report_value.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2019, The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE.md file. - -package cmp - -import "reflect" - -// valueNode represents a single node within a report, which is a -// structured representation of the value tree, containing information -// regarding which nodes are equal or not. -type valueNode struct { - parent *valueNode - - Type reflect.Type - ValueX reflect.Value - ValueY reflect.Value - - // NumSame is the number of leaf nodes that are equal. - // All descendants are equal only if NumDiff is 0. - NumSame int - // NumDiff is the number of leaf nodes that are not equal. - NumDiff int - // NumIgnored is the number of leaf nodes that are ignored. - NumIgnored int - // NumCompared is the number of leaf nodes that were compared - // using an Equal method or Comparer function. - NumCompared int - // NumTransformed is the number of non-leaf nodes that were transformed. - NumTransformed int - // NumChildren is the number of transitive descendants of this node. - // This counts from zero; thus, leaf nodes have no descendants. - NumChildren int - // MaxDepth is the maximum depth of the tree. This counts from zero; - // thus, leaf nodes have a depth of zero. - MaxDepth int - - // Records is a list of struct fields, slice elements, or map entries. - Records []reportRecord // If populated, implies Value is not populated - - // Value is the result of a transformation, pointer indirect, of - // type assertion. - Value *valueNode // If populated, implies Records is not populated - - // TransformerName is the name of the transformer. - TransformerName string // If non-empty, implies Value is populated -} -type reportRecord struct { - Key reflect.Value // Invalid for slice element - Value *valueNode -} - -func (parent *valueNode) PushStep(ps PathStep) (child *valueNode) { - vx, vy := ps.Values() - child = &valueNode{parent: parent, Type: ps.Type(), ValueX: vx, ValueY: vy} - switch s := ps.(type) { - case StructField: - assert(parent.Value == nil) - parent.Records = append(parent.Records, reportRecord{Key: reflect.ValueOf(s.Name()), Value: child}) - case SliceIndex: - assert(parent.Value == nil) - parent.Records = append(parent.Records, reportRecord{Value: child}) - case MapIndex: - assert(parent.Value == nil) - parent.Records = append(parent.Records, reportRecord{Key: s.Key(), Value: child}) - case Indirect: - assert(parent.Value == nil && parent.Records == nil) - parent.Value = child - case TypeAssertion: - assert(parent.Value == nil && parent.Records == nil) - parent.Value = child - case Transform: - assert(parent.Value == nil && parent.Records == nil) - parent.Value = child - parent.TransformerName = s.Name() - parent.NumTransformed++ - default: - assert(parent == nil) // Must be the root step - } - return child -} - -func (r *valueNode) Report(rs Result) { - assert(r.MaxDepth == 0) // May only be called on leaf nodes - - if rs.ByIgnore() { - r.NumIgnored++ - } else { - if rs.Equal() { - r.NumSame++ - } else { - r.NumDiff++ - } - } - assert(r.NumSame+r.NumDiff+r.NumIgnored == 1) - - if rs.ByMethod() { - r.NumCompared++ - } - if rs.ByFunc() { - r.NumCompared++ - } - assert(r.NumCompared <= 1) -} - -func (child *valueNode) PopStep() (parent *valueNode) { - if child.parent == nil { - return nil - } - parent = child.parent - parent.NumSame += child.NumSame - parent.NumDiff += child.NumDiff - parent.NumIgnored += child.NumIgnored - parent.NumCompared += child.NumCompared - parent.NumTransformed += child.NumTransformed - parent.NumChildren += child.NumChildren + 1 - if parent.MaxDepth < child.MaxDepth+1 { - parent.MaxDepth = child.MaxDepth + 1 - } - return parent -} diff --git a/vendor/github.com/googleapis/gax-go/v2/LICENSE b/vendor/github.com/googleapis/gax-go/v2/LICENSE deleted file mode 100644 index 6d16b6578..000000000 --- a/vendor/github.com/googleapis/gax-go/v2/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright 2016, Google Inc. -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/googleapis/gax-go/v2/call_option.go b/vendor/github.com/googleapis/gax-go/v2/call_option.go deleted file mode 100644 index b1d53dd19..000000000 --- a/vendor/github.com/googleapis/gax-go/v2/call_option.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2016, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package gax - -import ( - "math/rand" - "time" - - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -// CallOption is an option used by Invoke to control behaviors of RPC calls. -// CallOption works by modifying relevant fields of CallSettings. -type CallOption interface { - // Resolve applies the option by modifying cs. - Resolve(cs *CallSettings) -} - -// Retryer is used by Invoke to determine retry behavior. -type Retryer interface { - // Retry reports whether a request should be retriedand how long to pause before retrying - // if the previous attempt returned with err. Invoke never calls Retry with nil error. - Retry(err error) (pause time.Duration, shouldRetry bool) -} - -type retryerOption func() Retryer - -func (o retryerOption) Resolve(s *CallSettings) { - s.Retry = o -} - -// WithRetry sets CallSettings.Retry to fn. -func WithRetry(fn func() Retryer) CallOption { - return retryerOption(fn) -} - -// OnCodes returns a Retryer that retries if and only if -// the previous attempt returns a GRPC error whose error code is stored in cc. -// Pause times between retries are specified by bo. -// -// bo is only used for its parameters; each Retryer has its own copy. -func OnCodes(cc []codes.Code, bo Backoff) Retryer { - return &boRetryer{ - backoff: bo, - codes: append([]codes.Code(nil), cc...), - } -} - -type boRetryer struct { - backoff Backoff - codes []codes.Code -} - -func (r *boRetryer) Retry(err error) (time.Duration, bool) { - st, ok := status.FromError(err) - if !ok { - return 0, false - } - c := st.Code() - for _, rc := range r.codes { - if c == rc { - return r.backoff.Pause(), true - } - } - return 0, false -} - -// Backoff implements exponential backoff. -// The wait time between retries is a random value between 0 and the "retry envelope". -// The envelope starts at Initial and increases by the factor of Multiplier every retry, -// but is capped at Max. -type Backoff struct { - // Initial is the initial value of the retry envelope, defaults to 1 second. - Initial time.Duration - - // Max is the maximum value of the retry envelope, defaults to 30 seconds. - Max time.Duration - - // Multiplier is the factor by which the retry envelope increases. - // It should be greater than 1 and defaults to 2. - Multiplier float64 - - // cur is the current retry envelope - cur time.Duration -} - -// Pause returns the next time.Duration that the caller should use to backoff. -func (bo *Backoff) Pause() time.Duration { - if bo.Initial == 0 { - bo.Initial = time.Second - } - if bo.cur == 0 { - bo.cur = bo.Initial - } - if bo.Max == 0 { - bo.Max = 30 * time.Second - } - if bo.Multiplier < 1 { - bo.Multiplier = 2 - } - // Select a duration between 1ns and the current max. It might seem - // counterintuitive to have so much jitter, but - // https://www.awsarchitectureblog.com/2015/03/backoff.html argues that - // that is the best strategy. - d := time.Duration(1 + rand.Int63n(int64(bo.cur))) - bo.cur = time.Duration(float64(bo.cur) * bo.Multiplier) - if bo.cur > bo.Max { - bo.cur = bo.Max - } - return d -} - -type grpcOpt []grpc.CallOption - -func (o grpcOpt) Resolve(s *CallSettings) { - s.GRPC = o -} - -// WithGRPCOptions allows passing gRPC call options during client creation. -func WithGRPCOptions(opt ...grpc.CallOption) CallOption { - return grpcOpt(append([]grpc.CallOption(nil), opt...)) -} - -// CallSettings allow fine-grained control over how calls are made. -type CallSettings struct { - // Retry returns a Retryer to be used to control retry logic of a method call. - // If Retry is nil or the returned Retryer is nil, the call will not be retried. - Retry func() Retryer - - // CallOptions to be forwarded to GRPC. - GRPC []grpc.CallOption -} diff --git a/vendor/github.com/googleapis/gax-go/v2/gax.go b/vendor/github.com/googleapis/gax-go/v2/gax.go deleted file mode 100644 index 3fd1b0b84..000000000 --- a/vendor/github.com/googleapis/gax-go/v2/gax.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2016, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Package gax contains a set of modules which aid the development of APIs -// for clients and servers based on gRPC and Google API conventions. -// -// Application code will rarely need to use this library directly. -// However, code generated automatically from API definition files can use it -// to simplify code generation and to provide more convenient and idiomatic API surfaces. -package gax - -// Version specifies the gax-go version being used. -const Version = "2.0.4" diff --git a/vendor/github.com/googleapis/gax-go/v2/go.mod b/vendor/github.com/googleapis/gax-go/v2/go.mod deleted file mode 100644 index 9cdfaf447..000000000 --- a/vendor/github.com/googleapis/gax-go/v2/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/googleapis/gax-go/v2 - -require google.golang.org/grpc v1.19.0 diff --git a/vendor/github.com/googleapis/gax-go/v2/go.sum b/vendor/github.com/googleapis/gax-go/v2/go.sum deleted file mode 100644 index 7fa23ecf9..000000000 --- a/vendor/github.com/googleapis/gax-go/v2/go.sum +++ /dev/null @@ -1,25 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d h1:g9qWBGx4puODJTMVyoPrpoxPFgVGd+z1DZwjfRu4d0I= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522 h1:Ve1ORMCxvRmSXBwJK+t3Oy+V2vRW2OetUQBq4rJIkZE= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/github.com/googleapis/gax-go/v2/header.go b/vendor/github.com/googleapis/gax-go/v2/header.go deleted file mode 100644 index 139371a0b..000000000 --- a/vendor/github.com/googleapis/gax-go/v2/header.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2018, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package gax - -import "bytes" - -// XGoogHeader is for use by the Google Cloud Libraries only. -// -// XGoogHeader formats key-value pairs. -// The resulting string is suitable for x-goog-api-client header. -func XGoogHeader(keyval ...string) string { - if len(keyval) == 0 { - return "" - } - if len(keyval)%2 != 0 { - panic("gax.Header: odd argument count") - } - var buf bytes.Buffer - for i := 0; i < len(keyval); i += 2 { - buf.WriteByte(' ') - buf.WriteString(keyval[i]) - buf.WriteByte('/') - buf.WriteString(keyval[i+1]) - } - return buf.String()[1:] -} diff --git a/vendor/github.com/googleapis/gax-go/v2/invoke.go b/vendor/github.com/googleapis/gax-go/v2/invoke.go deleted file mode 100644 index fe31dd004..000000000 --- a/vendor/github.com/googleapis/gax-go/v2/invoke.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2016, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package gax - -import ( - "context" - "strings" - "time" -) - -// APICall is a user defined call stub. -type APICall func(context.Context, CallSettings) error - -// Invoke calls the given APICall, -// performing retries as specified by opts, if any. -func Invoke(ctx context.Context, call APICall, opts ...CallOption) error { - var settings CallSettings - for _, opt := range opts { - opt.Resolve(&settings) - } - return invoke(ctx, call, settings, Sleep) -} - -// Sleep is similar to time.Sleep, but it can be interrupted by ctx.Done() closing. -// If interrupted, Sleep returns ctx.Err(). -func Sleep(ctx context.Context, d time.Duration) error { - t := time.NewTimer(d) - select { - case <-ctx.Done(): - t.Stop() - return ctx.Err() - case <-t.C: - return nil - } -} - -type sleeper func(ctx context.Context, d time.Duration) error - -// invoke implements Invoke, taking an additional sleeper argument for testing. -func invoke(ctx context.Context, call APICall, settings CallSettings, sp sleeper) error { - var retryer Retryer - for { - err := call(ctx, settings) - if err == nil { - return nil - } - if settings.Retry == nil { - return err - } - // Never retry permanent certificate errors. (e.x. if ca-certificates - // are not installed). We should only make very few, targeted - // exceptions: many (other) status=Unavailable should be retried, such - // as if there's a network hiccup, or the internet goes out for a - // minute. This is also why here we are doing string parsing instead of - // simply making Unavailable a non-retried code elsewhere. - if strings.Contains(err.Error(), "x509: certificate signed by unknown authority") { - return err - } - if retryer == nil { - if r := settings.Retry(); r != nil { - retryer = r - } else { - return err - } - } - if d, ok := retryer.Retry(err); !ok { - return err - } else if err = sp(ctx, d); err != nil { - return err - } - } -} diff --git a/vendor/github.com/jmespath/go-jmespath/.gitignore b/vendor/github.com/jmespath/go-jmespath/.gitignore deleted file mode 100644 index 5091fb073..000000000 --- a/vendor/github.com/jmespath/go-jmespath/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/jpgo -jmespath-fuzz.zip -cpu.out -go-jmespath.test diff --git a/vendor/github.com/jmespath/go-jmespath/.travis.yml b/vendor/github.com/jmespath/go-jmespath/.travis.yml deleted file mode 100644 index 1f9807757..000000000 --- a/vendor/github.com/jmespath/go-jmespath/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: go - -sudo: false - -go: - - 1.4 - -install: go get -v -t ./... -script: make test diff --git a/vendor/github.com/jmespath/go-jmespath/LICENSE b/vendor/github.com/jmespath/go-jmespath/LICENSE deleted file mode 100644 index b03310a91..000000000 --- a/vendor/github.com/jmespath/go-jmespath/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2015 James Saryerwinnie - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/vendor/github.com/jmespath/go-jmespath/Makefile b/vendor/github.com/jmespath/go-jmespath/Makefile deleted file mode 100644 index a828d2848..000000000 --- a/vendor/github.com/jmespath/go-jmespath/Makefile +++ /dev/null @@ -1,44 +0,0 @@ - -CMD = jpgo - -help: - @echo "Please use \`make ' where is one of" - @echo " test to run all the tests" - @echo " build to build the library and jp executable" - @echo " generate to run codegen" - - -generate: - go generate ./... - -build: - rm -f $(CMD) - go build ./... - rm -f cmd/$(CMD)/$(CMD) && cd cmd/$(CMD)/ && go build ./... - mv cmd/$(CMD)/$(CMD) . - -test: - go test -v ./... - -check: - go vet ./... - @echo "golint ./..." - @lint=`golint ./...`; \ - lint=`echo "$$lint" | grep -v "astnodetype_string.go" | grep -v "toktype_string.go"`; \ - echo "$$lint"; \ - if [ "$$lint" != "" ]; then exit 1; fi - -htmlc: - go test -coverprofile="/tmp/jpcov" && go tool cover -html="/tmp/jpcov" && unlink /tmp/jpcov - -buildfuzz: - go-fuzz-build github.com/jmespath/go-jmespath/fuzz - -fuzz: buildfuzz - go-fuzz -bin=./jmespath-fuzz.zip -workdir=fuzz/testdata - -bench: - go test -bench . -cpuprofile cpu.out - -pprof-cpu: - go tool pprof ./go-jmespath.test ./cpu.out diff --git a/vendor/github.com/jmespath/go-jmespath/README.md b/vendor/github.com/jmespath/go-jmespath/README.md deleted file mode 100644 index 187ef676d..000000000 --- a/vendor/github.com/jmespath/go-jmespath/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# go-jmespath - A JMESPath implementation in Go - -[![Build Status](https://img.shields.io/travis/jmespath/go-jmespath.svg)](https://travis-ci.org/jmespath/go-jmespath) - - - -See http://jmespath.org for more info. diff --git a/vendor/github.com/jmespath/go-jmespath/api.go b/vendor/github.com/jmespath/go-jmespath/api.go deleted file mode 100644 index 8e26ffeec..000000000 --- a/vendor/github.com/jmespath/go-jmespath/api.go +++ /dev/null @@ -1,49 +0,0 @@ -package jmespath - -import "strconv" - -// JMESPath is the epresentation of a compiled JMES path query. A JMESPath is -// safe for concurrent use by multiple goroutines. -type JMESPath struct { - ast ASTNode - intr *treeInterpreter -} - -// Compile parses a JMESPath expression and returns, if successful, a JMESPath -// object that can be used to match against data. -func Compile(expression string) (*JMESPath, error) { - parser := NewParser() - ast, err := parser.Parse(expression) - if err != nil { - return nil, err - } - jmespath := &JMESPath{ast: ast, intr: newInterpreter()} - return jmespath, nil -} - -// MustCompile is like Compile but panics if the expression cannot be parsed. -// It simplifies safe initialization of global variables holding compiled -// JMESPaths. -func MustCompile(expression string) *JMESPath { - jmespath, err := Compile(expression) - if err != nil { - panic(`jmespath: Compile(` + strconv.Quote(expression) + `): ` + err.Error()) - } - return jmespath -} - -// Search evaluates a JMESPath expression against input data and returns the result. -func (jp *JMESPath) Search(data interface{}) (interface{}, error) { - return jp.intr.Execute(jp.ast, data) -} - -// Search evaluates a JMESPath expression against input data and returns the result. -func Search(expression string, data interface{}) (interface{}, error) { - intr := newInterpreter() - parser := NewParser() - ast, err := parser.Parse(expression) - if err != nil { - return nil, err - } - return intr.Execute(ast, data) -} diff --git a/vendor/github.com/jmespath/go-jmespath/astnodetype_string.go b/vendor/github.com/jmespath/go-jmespath/astnodetype_string.go deleted file mode 100644 index 1cd2d239c..000000000 --- a/vendor/github.com/jmespath/go-jmespath/astnodetype_string.go +++ /dev/null @@ -1,16 +0,0 @@ -// generated by stringer -type astNodeType; DO NOT EDIT - -package jmespath - -import "fmt" - -const _astNodeType_name = "ASTEmptyASTComparatorASTCurrentNodeASTExpRefASTFunctionExpressionASTFieldASTFilterProjectionASTFlattenASTIdentityASTIndexASTIndexExpressionASTKeyValPairASTLiteralASTMultiSelectHashASTMultiSelectListASTOrExpressionASTAndExpressionASTNotExpressionASTPipeASTProjectionASTSubexpressionASTSliceASTValueProjection" - -var _astNodeType_index = [...]uint16{0, 8, 21, 35, 44, 65, 73, 92, 102, 113, 121, 139, 152, 162, 180, 198, 213, 229, 245, 252, 265, 281, 289, 307} - -func (i astNodeType) String() string { - if i < 0 || i >= astNodeType(len(_astNodeType_index)-1) { - return fmt.Sprintf("astNodeType(%d)", i) - } - return _astNodeType_name[_astNodeType_index[i]:_astNodeType_index[i+1]] -} diff --git a/vendor/github.com/jmespath/go-jmespath/functions.go b/vendor/github.com/jmespath/go-jmespath/functions.go deleted file mode 100644 index 9b7cd89b4..000000000 --- a/vendor/github.com/jmespath/go-jmespath/functions.go +++ /dev/null @@ -1,842 +0,0 @@ -package jmespath - -import ( - "encoding/json" - "errors" - "fmt" - "math" - "reflect" - "sort" - "strconv" - "strings" - "unicode/utf8" -) - -type jpFunction func(arguments []interface{}) (interface{}, error) - -type jpType string - -const ( - jpUnknown jpType = "unknown" - jpNumber jpType = "number" - jpString jpType = "string" - jpArray jpType = "array" - jpObject jpType = "object" - jpArrayNumber jpType = "array[number]" - jpArrayString jpType = "array[string]" - jpExpref jpType = "expref" - jpAny jpType = "any" -) - -type functionEntry struct { - name string - arguments []argSpec - handler jpFunction - hasExpRef bool -} - -type argSpec struct { - types []jpType - variadic bool -} - -type byExprString struct { - intr *treeInterpreter - node ASTNode - items []interface{} - hasError bool -} - -func (a *byExprString) Len() int { - return len(a.items) -} -func (a *byExprString) Swap(i, j int) { - a.items[i], a.items[j] = a.items[j], a.items[i] -} -func (a *byExprString) Less(i, j int) bool { - first, err := a.intr.Execute(a.node, a.items[i]) - if err != nil { - a.hasError = true - // Return a dummy value. - return true - } - ith, ok := first.(string) - if !ok { - a.hasError = true - return true - } - second, err := a.intr.Execute(a.node, a.items[j]) - if err != nil { - a.hasError = true - // Return a dummy value. - return true - } - jth, ok := second.(string) - if !ok { - a.hasError = true - return true - } - return ith < jth -} - -type byExprFloat struct { - intr *treeInterpreter - node ASTNode - items []interface{} - hasError bool -} - -func (a *byExprFloat) Len() int { - return len(a.items) -} -func (a *byExprFloat) Swap(i, j int) { - a.items[i], a.items[j] = a.items[j], a.items[i] -} -func (a *byExprFloat) Less(i, j int) bool { - first, err := a.intr.Execute(a.node, a.items[i]) - if err != nil { - a.hasError = true - // Return a dummy value. - return true - } - ith, ok := first.(float64) - if !ok { - a.hasError = true - return true - } - second, err := a.intr.Execute(a.node, a.items[j]) - if err != nil { - a.hasError = true - // Return a dummy value. - return true - } - jth, ok := second.(float64) - if !ok { - a.hasError = true - return true - } - return ith < jth -} - -type functionCaller struct { - functionTable map[string]functionEntry -} - -func newFunctionCaller() *functionCaller { - caller := &functionCaller{} - caller.functionTable = map[string]functionEntry{ - "length": { - name: "length", - arguments: []argSpec{ - {types: []jpType{jpString, jpArray, jpObject}}, - }, - handler: jpfLength, - }, - "starts_with": { - name: "starts_with", - arguments: []argSpec{ - {types: []jpType{jpString}}, - {types: []jpType{jpString}}, - }, - handler: jpfStartsWith, - }, - "abs": { - name: "abs", - arguments: []argSpec{ - {types: []jpType{jpNumber}}, - }, - handler: jpfAbs, - }, - "avg": { - name: "avg", - arguments: []argSpec{ - {types: []jpType{jpArrayNumber}}, - }, - handler: jpfAvg, - }, - "ceil": { - name: "ceil", - arguments: []argSpec{ - {types: []jpType{jpNumber}}, - }, - handler: jpfCeil, - }, - "contains": { - name: "contains", - arguments: []argSpec{ - {types: []jpType{jpArray, jpString}}, - {types: []jpType{jpAny}}, - }, - handler: jpfContains, - }, - "ends_with": { - name: "ends_with", - arguments: []argSpec{ - {types: []jpType{jpString}}, - {types: []jpType{jpString}}, - }, - handler: jpfEndsWith, - }, - "floor": { - name: "floor", - arguments: []argSpec{ - {types: []jpType{jpNumber}}, - }, - handler: jpfFloor, - }, - "map": { - name: "amp", - arguments: []argSpec{ - {types: []jpType{jpExpref}}, - {types: []jpType{jpArray}}, - }, - handler: jpfMap, - hasExpRef: true, - }, - "max": { - name: "max", - arguments: []argSpec{ - {types: []jpType{jpArrayNumber, jpArrayString}}, - }, - handler: jpfMax, - }, - "merge": { - name: "merge", - arguments: []argSpec{ - {types: []jpType{jpObject}, variadic: true}, - }, - handler: jpfMerge, - }, - "max_by": { - name: "max_by", - arguments: []argSpec{ - {types: []jpType{jpArray}}, - {types: []jpType{jpExpref}}, - }, - handler: jpfMaxBy, - hasExpRef: true, - }, - "sum": { - name: "sum", - arguments: []argSpec{ - {types: []jpType{jpArrayNumber}}, - }, - handler: jpfSum, - }, - "min": { - name: "min", - arguments: []argSpec{ - {types: []jpType{jpArrayNumber, jpArrayString}}, - }, - handler: jpfMin, - }, - "min_by": { - name: "min_by", - arguments: []argSpec{ - {types: []jpType{jpArray}}, - {types: []jpType{jpExpref}}, - }, - handler: jpfMinBy, - hasExpRef: true, - }, - "type": { - name: "type", - arguments: []argSpec{ - {types: []jpType{jpAny}}, - }, - handler: jpfType, - }, - "keys": { - name: "keys", - arguments: []argSpec{ - {types: []jpType{jpObject}}, - }, - handler: jpfKeys, - }, - "values": { - name: "values", - arguments: []argSpec{ - {types: []jpType{jpObject}}, - }, - handler: jpfValues, - }, - "sort": { - name: "sort", - arguments: []argSpec{ - {types: []jpType{jpArrayString, jpArrayNumber}}, - }, - handler: jpfSort, - }, - "sort_by": { - name: "sort_by", - arguments: []argSpec{ - {types: []jpType{jpArray}}, - {types: []jpType{jpExpref}}, - }, - handler: jpfSortBy, - hasExpRef: true, - }, - "join": { - name: "join", - arguments: []argSpec{ - {types: []jpType{jpString}}, - {types: []jpType{jpArrayString}}, - }, - handler: jpfJoin, - }, - "reverse": { - name: "reverse", - arguments: []argSpec{ - {types: []jpType{jpArray, jpString}}, - }, - handler: jpfReverse, - }, - "to_array": { - name: "to_array", - arguments: []argSpec{ - {types: []jpType{jpAny}}, - }, - handler: jpfToArray, - }, - "to_string": { - name: "to_string", - arguments: []argSpec{ - {types: []jpType{jpAny}}, - }, - handler: jpfToString, - }, - "to_number": { - name: "to_number", - arguments: []argSpec{ - {types: []jpType{jpAny}}, - }, - handler: jpfToNumber, - }, - "not_null": { - name: "not_null", - arguments: []argSpec{ - {types: []jpType{jpAny}, variadic: true}, - }, - handler: jpfNotNull, - }, - } - return caller -} - -func (e *functionEntry) resolveArgs(arguments []interface{}) ([]interface{}, error) { - if len(e.arguments) == 0 { - return arguments, nil - } - if !e.arguments[len(e.arguments)-1].variadic { - if len(e.arguments) != len(arguments) { - return nil, errors.New("incorrect number of args") - } - for i, spec := range e.arguments { - userArg := arguments[i] - err := spec.typeCheck(userArg) - if err != nil { - return nil, err - } - } - return arguments, nil - } - if len(arguments) < len(e.arguments) { - return nil, errors.New("Invalid arity.") - } - return arguments, nil -} - -func (a *argSpec) typeCheck(arg interface{}) error { - for _, t := range a.types { - switch t { - case jpNumber: - if _, ok := arg.(float64); ok { - return nil - } - case jpString: - if _, ok := arg.(string); ok { - return nil - } - case jpArray: - if isSliceType(arg) { - return nil - } - case jpObject: - if _, ok := arg.(map[string]interface{}); ok { - return nil - } - case jpArrayNumber: - if _, ok := toArrayNum(arg); ok { - return nil - } - case jpArrayString: - if _, ok := toArrayStr(arg); ok { - return nil - } - case jpAny: - return nil - case jpExpref: - if _, ok := arg.(expRef); ok { - return nil - } - } - } - return fmt.Errorf("Invalid type for: %v, expected: %#v", arg, a.types) -} - -func (f *functionCaller) CallFunction(name string, arguments []interface{}, intr *treeInterpreter) (interface{}, error) { - entry, ok := f.functionTable[name] - if !ok { - return nil, errors.New("unknown function: " + name) - } - resolvedArgs, err := entry.resolveArgs(arguments) - if err != nil { - return nil, err - } - if entry.hasExpRef { - var extra []interface{} - extra = append(extra, intr) - resolvedArgs = append(extra, resolvedArgs...) - } - return entry.handler(resolvedArgs) -} - -func jpfAbs(arguments []interface{}) (interface{}, error) { - num := arguments[0].(float64) - return math.Abs(num), nil -} - -func jpfLength(arguments []interface{}) (interface{}, error) { - arg := arguments[0] - if c, ok := arg.(string); ok { - return float64(utf8.RuneCountInString(c)), nil - } else if isSliceType(arg) { - v := reflect.ValueOf(arg) - return float64(v.Len()), nil - } else if c, ok := arg.(map[string]interface{}); ok { - return float64(len(c)), nil - } - return nil, errors.New("could not compute length()") -} - -func jpfStartsWith(arguments []interface{}) (interface{}, error) { - search := arguments[0].(string) - prefix := arguments[1].(string) - return strings.HasPrefix(search, prefix), nil -} - -func jpfAvg(arguments []interface{}) (interface{}, error) { - // We've already type checked the value so we can safely use - // type assertions. - args := arguments[0].([]interface{}) - length := float64(len(args)) - numerator := 0.0 - for _, n := range args { - numerator += n.(float64) - } - return numerator / length, nil -} -func jpfCeil(arguments []interface{}) (interface{}, error) { - val := arguments[0].(float64) - return math.Ceil(val), nil -} -func jpfContains(arguments []interface{}) (interface{}, error) { - search := arguments[0] - el := arguments[1] - if searchStr, ok := search.(string); ok { - if elStr, ok := el.(string); ok { - return strings.Index(searchStr, elStr) != -1, nil - } - return false, nil - } - // Otherwise this is a generic contains for []interface{} - general := search.([]interface{}) - for _, item := range general { - if item == el { - return true, nil - } - } - return false, nil -} -func jpfEndsWith(arguments []interface{}) (interface{}, error) { - search := arguments[0].(string) - suffix := arguments[1].(string) - return strings.HasSuffix(search, suffix), nil -} -func jpfFloor(arguments []interface{}) (interface{}, error) { - val := arguments[0].(float64) - return math.Floor(val), nil -} -func jpfMap(arguments []interface{}) (interface{}, error) { - intr := arguments[0].(*treeInterpreter) - exp := arguments[1].(expRef) - node := exp.ref - arr := arguments[2].([]interface{}) - mapped := make([]interface{}, 0, len(arr)) - for _, value := range arr { - current, err := intr.Execute(node, value) - if err != nil { - return nil, err - } - mapped = append(mapped, current) - } - return mapped, nil -} -func jpfMax(arguments []interface{}) (interface{}, error) { - if items, ok := toArrayNum(arguments[0]); ok { - if len(items) == 0 { - return nil, nil - } - if len(items) == 1 { - return items[0], nil - } - best := items[0] - for _, item := range items[1:] { - if item > best { - best = item - } - } - return best, nil - } - // Otherwise we're dealing with a max() of strings. - items, _ := toArrayStr(arguments[0]) - if len(items) == 0 { - return nil, nil - } - if len(items) == 1 { - return items[0], nil - } - best := items[0] - for _, item := range items[1:] { - if item > best { - best = item - } - } - return best, nil -} -func jpfMerge(arguments []interface{}) (interface{}, error) { - final := make(map[string]interface{}) - for _, m := range arguments { - mapped := m.(map[string]interface{}) - for key, value := range mapped { - final[key] = value - } - } - return final, nil -} -func jpfMaxBy(arguments []interface{}) (interface{}, error) { - intr := arguments[0].(*treeInterpreter) - arr := arguments[1].([]interface{}) - exp := arguments[2].(expRef) - node := exp.ref - if len(arr) == 0 { - return nil, nil - } else if len(arr) == 1 { - return arr[0], nil - } - start, err := intr.Execute(node, arr[0]) - if err != nil { - return nil, err - } - switch t := start.(type) { - case float64: - bestVal := t - bestItem := arr[0] - for _, item := range arr[1:] { - result, err := intr.Execute(node, item) - if err != nil { - return nil, err - } - current, ok := result.(float64) - if !ok { - return nil, errors.New("invalid type, must be number") - } - if current > bestVal { - bestVal = current - bestItem = item - } - } - return bestItem, nil - case string: - bestVal := t - bestItem := arr[0] - for _, item := range arr[1:] { - result, err := intr.Execute(node, item) - if err != nil { - return nil, err - } - current, ok := result.(string) - if !ok { - return nil, errors.New("invalid type, must be string") - } - if current > bestVal { - bestVal = current - bestItem = item - } - } - return bestItem, nil - default: - return nil, errors.New("invalid type, must be number of string") - } -} -func jpfSum(arguments []interface{}) (interface{}, error) { - items, _ := toArrayNum(arguments[0]) - sum := 0.0 - for _, item := range items { - sum += item - } - return sum, nil -} - -func jpfMin(arguments []interface{}) (interface{}, error) { - if items, ok := toArrayNum(arguments[0]); ok { - if len(items) == 0 { - return nil, nil - } - if len(items) == 1 { - return items[0], nil - } - best := items[0] - for _, item := range items[1:] { - if item < best { - best = item - } - } - return best, nil - } - items, _ := toArrayStr(arguments[0]) - if len(items) == 0 { - return nil, nil - } - if len(items) == 1 { - return items[0], nil - } - best := items[0] - for _, item := range items[1:] { - if item < best { - best = item - } - } - return best, nil -} - -func jpfMinBy(arguments []interface{}) (interface{}, error) { - intr := arguments[0].(*treeInterpreter) - arr := arguments[1].([]interface{}) - exp := arguments[2].(expRef) - node := exp.ref - if len(arr) == 0 { - return nil, nil - } else if len(arr) == 1 { - return arr[0], nil - } - start, err := intr.Execute(node, arr[0]) - if err != nil { - return nil, err - } - if t, ok := start.(float64); ok { - bestVal := t - bestItem := arr[0] - for _, item := range arr[1:] { - result, err := intr.Execute(node, item) - if err != nil { - return nil, err - } - current, ok := result.(float64) - if !ok { - return nil, errors.New("invalid type, must be number") - } - if current < bestVal { - bestVal = current - bestItem = item - } - } - return bestItem, nil - } else if t, ok := start.(string); ok { - bestVal := t - bestItem := arr[0] - for _, item := range arr[1:] { - result, err := intr.Execute(node, item) - if err != nil { - return nil, err - } - current, ok := result.(string) - if !ok { - return nil, errors.New("invalid type, must be string") - } - if current < bestVal { - bestVal = current - bestItem = item - } - } - return bestItem, nil - } else { - return nil, errors.New("invalid type, must be number of string") - } -} -func jpfType(arguments []interface{}) (interface{}, error) { - arg := arguments[0] - if _, ok := arg.(float64); ok { - return "number", nil - } - if _, ok := arg.(string); ok { - return "string", nil - } - if _, ok := arg.([]interface{}); ok { - return "array", nil - } - if _, ok := arg.(map[string]interface{}); ok { - return "object", nil - } - if arg == nil { - return "null", nil - } - if arg == true || arg == false { - return "boolean", nil - } - return nil, errors.New("unknown type") -} -func jpfKeys(arguments []interface{}) (interface{}, error) { - arg := arguments[0].(map[string]interface{}) - collected := make([]interface{}, 0, len(arg)) - for key := range arg { - collected = append(collected, key) - } - return collected, nil -} -func jpfValues(arguments []interface{}) (interface{}, error) { - arg := arguments[0].(map[string]interface{}) - collected := make([]interface{}, 0, len(arg)) - for _, value := range arg { - collected = append(collected, value) - } - return collected, nil -} -func jpfSort(arguments []interface{}) (interface{}, error) { - if items, ok := toArrayNum(arguments[0]); ok { - d := sort.Float64Slice(items) - sort.Stable(d) - final := make([]interface{}, len(d)) - for i, val := range d { - final[i] = val - } - return final, nil - } - // Otherwise we're dealing with sort()'ing strings. - items, _ := toArrayStr(arguments[0]) - d := sort.StringSlice(items) - sort.Stable(d) - final := make([]interface{}, len(d)) - for i, val := range d { - final[i] = val - } - return final, nil -} -func jpfSortBy(arguments []interface{}) (interface{}, error) { - intr := arguments[0].(*treeInterpreter) - arr := arguments[1].([]interface{}) - exp := arguments[2].(expRef) - node := exp.ref - if len(arr) == 0 { - return arr, nil - } else if len(arr) == 1 { - return arr, nil - } - start, err := intr.Execute(node, arr[0]) - if err != nil { - return nil, err - } - if _, ok := start.(float64); ok { - sortable := &byExprFloat{intr, node, arr, false} - sort.Stable(sortable) - if sortable.hasError { - return nil, errors.New("error in sort_by comparison") - } - return arr, nil - } else if _, ok := start.(string); ok { - sortable := &byExprString{intr, node, arr, false} - sort.Stable(sortable) - if sortable.hasError { - return nil, errors.New("error in sort_by comparison") - } - return arr, nil - } else { - return nil, errors.New("invalid type, must be number of string") - } -} -func jpfJoin(arguments []interface{}) (interface{}, error) { - sep := arguments[0].(string) - // We can't just do arguments[1].([]string), we have to - // manually convert each item to a string. - arrayStr := []string{} - for _, item := range arguments[1].([]interface{}) { - arrayStr = append(arrayStr, item.(string)) - } - return strings.Join(arrayStr, sep), nil -} -func jpfReverse(arguments []interface{}) (interface{}, error) { - if s, ok := arguments[0].(string); ok { - r := []rune(s) - for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 { - r[i], r[j] = r[j], r[i] - } - return string(r), nil - } - items := arguments[0].([]interface{}) - length := len(items) - reversed := make([]interface{}, length) - for i, item := range items { - reversed[length-(i+1)] = item - } - return reversed, nil -} -func jpfToArray(arguments []interface{}) (interface{}, error) { - if _, ok := arguments[0].([]interface{}); ok { - return arguments[0], nil - } - return arguments[:1:1], nil -} -func jpfToString(arguments []interface{}) (interface{}, error) { - if v, ok := arguments[0].(string); ok { - return v, nil - } - result, err := json.Marshal(arguments[0]) - if err != nil { - return nil, err - } - return string(result), nil -} -func jpfToNumber(arguments []interface{}) (interface{}, error) { - arg := arguments[0] - if v, ok := arg.(float64); ok { - return v, nil - } - if v, ok := arg.(string); ok { - conv, err := strconv.ParseFloat(v, 64) - if err != nil { - return nil, nil - } - return conv, nil - } - if _, ok := arg.([]interface{}); ok { - return nil, nil - } - if _, ok := arg.(map[string]interface{}); ok { - return nil, nil - } - if arg == nil { - return nil, nil - } - if arg == true || arg == false { - return nil, nil - } - return nil, errors.New("unknown type") -} -func jpfNotNull(arguments []interface{}) (interface{}, error) { - for _, arg := range arguments { - if arg != nil { - return arg, nil - } - } - return nil, nil -} diff --git a/vendor/github.com/jmespath/go-jmespath/interpreter.go b/vendor/github.com/jmespath/go-jmespath/interpreter.go deleted file mode 100644 index 13c74604c..000000000 --- a/vendor/github.com/jmespath/go-jmespath/interpreter.go +++ /dev/null @@ -1,418 +0,0 @@ -package jmespath - -import ( - "errors" - "reflect" - "unicode" - "unicode/utf8" -) - -/* This is a tree based interpreter. It walks the AST and directly - interprets the AST to search through a JSON document. -*/ - -type treeInterpreter struct { - fCall *functionCaller -} - -func newInterpreter() *treeInterpreter { - interpreter := treeInterpreter{} - interpreter.fCall = newFunctionCaller() - return &interpreter -} - -type expRef struct { - ref ASTNode -} - -// Execute takes an ASTNode and input data and interprets the AST directly. -// It will produce the result of applying the JMESPath expression associated -// with the ASTNode to the input data "value". -func (intr *treeInterpreter) Execute(node ASTNode, value interface{}) (interface{}, error) { - switch node.nodeType { - case ASTComparator: - left, err := intr.Execute(node.children[0], value) - if err != nil { - return nil, err - } - right, err := intr.Execute(node.children[1], value) - if err != nil { - return nil, err - } - switch node.value { - case tEQ: - return objsEqual(left, right), nil - case tNE: - return !objsEqual(left, right), nil - } - leftNum, ok := left.(float64) - if !ok { - return nil, nil - } - rightNum, ok := right.(float64) - if !ok { - return nil, nil - } - switch node.value { - case tGT: - return leftNum > rightNum, nil - case tGTE: - return leftNum >= rightNum, nil - case tLT: - return leftNum < rightNum, nil - case tLTE: - return leftNum <= rightNum, nil - } - case ASTExpRef: - return expRef{ref: node.children[0]}, nil - case ASTFunctionExpression: - resolvedArgs := []interface{}{} - for _, arg := range node.children { - current, err := intr.Execute(arg, value) - if err != nil { - return nil, err - } - resolvedArgs = append(resolvedArgs, current) - } - return intr.fCall.CallFunction(node.value.(string), resolvedArgs, intr) - case ASTField: - if m, ok := value.(map[string]interface{}); ok { - key := node.value.(string) - return m[key], nil - } - return intr.fieldFromStruct(node.value.(string), value) - case ASTFilterProjection: - left, err := intr.Execute(node.children[0], value) - if err != nil { - return nil, nil - } - sliceType, ok := left.([]interface{}) - if !ok { - if isSliceType(left) { - return intr.filterProjectionWithReflection(node, left) - } - return nil, nil - } - compareNode := node.children[2] - collected := []interface{}{} - for _, element := range sliceType { - result, err := intr.Execute(compareNode, element) - if err != nil { - return nil, err - } - if !isFalse(result) { - current, err := intr.Execute(node.children[1], element) - if err != nil { - return nil, err - } - if current != nil { - collected = append(collected, current) - } - } - } - return collected, nil - case ASTFlatten: - left, err := intr.Execute(node.children[0], value) - if err != nil { - return nil, nil - } - sliceType, ok := left.([]interface{}) - if !ok { - // If we can't type convert to []interface{}, there's - // a chance this could still work via reflection if we're - // dealing with user provided types. - if isSliceType(left) { - return intr.flattenWithReflection(left) - } - return nil, nil - } - flattened := []interface{}{} - for _, element := range sliceType { - if elementSlice, ok := element.([]interface{}); ok { - flattened = append(flattened, elementSlice...) - } else if isSliceType(element) { - reflectFlat := []interface{}{} - v := reflect.ValueOf(element) - for i := 0; i < v.Len(); i++ { - reflectFlat = append(reflectFlat, v.Index(i).Interface()) - } - flattened = append(flattened, reflectFlat...) - } else { - flattened = append(flattened, element) - } - } - return flattened, nil - case ASTIdentity, ASTCurrentNode: - return value, nil - case ASTIndex: - if sliceType, ok := value.([]interface{}); ok { - index := node.value.(int) - if index < 0 { - index += len(sliceType) - } - if index < len(sliceType) && index >= 0 { - return sliceType[index], nil - } - return nil, nil - } - // Otherwise try via reflection. - rv := reflect.ValueOf(value) - if rv.Kind() == reflect.Slice { - index := node.value.(int) - if index < 0 { - index += rv.Len() - } - if index < rv.Len() && index >= 0 { - v := rv.Index(index) - return v.Interface(), nil - } - } - return nil, nil - case ASTKeyValPair: - return intr.Execute(node.children[0], value) - case ASTLiteral: - return node.value, nil - case ASTMultiSelectHash: - if value == nil { - return nil, nil - } - collected := make(map[string]interface{}) - for _, child := range node.children { - current, err := intr.Execute(child, value) - if err != nil { - return nil, err - } - key := child.value.(string) - collected[key] = current - } - return collected, nil - case ASTMultiSelectList: - if value == nil { - return nil, nil - } - collected := []interface{}{} - for _, child := range node.children { - current, err := intr.Execute(child, value) - if err != nil { - return nil, err - } - collected = append(collected, current) - } - return collected, nil - case ASTOrExpression: - matched, err := intr.Execute(node.children[0], value) - if err != nil { - return nil, err - } - if isFalse(matched) { - matched, err = intr.Execute(node.children[1], value) - if err != nil { - return nil, err - } - } - return matched, nil - case ASTAndExpression: - matched, err := intr.Execute(node.children[0], value) - if err != nil { - return nil, err - } - if isFalse(matched) { - return matched, nil - } - return intr.Execute(node.children[1], value) - case ASTNotExpression: - matched, err := intr.Execute(node.children[0], value) - if err != nil { - return nil, err - } - if isFalse(matched) { - return true, nil - } - return false, nil - case ASTPipe: - result := value - var err error - for _, child := range node.children { - result, err = intr.Execute(child, result) - if err != nil { - return nil, err - } - } - return result, nil - case ASTProjection: - left, err := intr.Execute(node.children[0], value) - if err != nil { - return nil, err - } - sliceType, ok := left.([]interface{}) - if !ok { - if isSliceType(left) { - return intr.projectWithReflection(node, left) - } - return nil, nil - } - collected := []interface{}{} - var current interface{} - for _, element := range sliceType { - current, err = intr.Execute(node.children[1], element) - if err != nil { - return nil, err - } - if current != nil { - collected = append(collected, current) - } - } - return collected, nil - case ASTSubexpression, ASTIndexExpression: - left, err := intr.Execute(node.children[0], value) - if err != nil { - return nil, err - } - return intr.Execute(node.children[1], left) - case ASTSlice: - sliceType, ok := value.([]interface{}) - if !ok { - if isSliceType(value) { - return intr.sliceWithReflection(node, value) - } - return nil, nil - } - parts := node.value.([]*int) - sliceParams := make([]sliceParam, 3) - for i, part := range parts { - if part != nil { - sliceParams[i].Specified = true - sliceParams[i].N = *part - } - } - return slice(sliceType, sliceParams) - case ASTValueProjection: - left, err := intr.Execute(node.children[0], value) - if err != nil { - return nil, nil - } - mapType, ok := left.(map[string]interface{}) - if !ok { - return nil, nil - } - values := make([]interface{}, len(mapType)) - for _, value := range mapType { - values = append(values, value) - } - collected := []interface{}{} - for _, element := range values { - current, err := intr.Execute(node.children[1], element) - if err != nil { - return nil, err - } - if current != nil { - collected = append(collected, current) - } - } - return collected, nil - } - return nil, errors.New("Unknown AST node: " + node.nodeType.String()) -} - -func (intr *treeInterpreter) fieldFromStruct(key string, value interface{}) (interface{}, error) { - rv := reflect.ValueOf(value) - first, n := utf8.DecodeRuneInString(key) - fieldName := string(unicode.ToUpper(first)) + key[n:] - if rv.Kind() == reflect.Struct { - v := rv.FieldByName(fieldName) - if !v.IsValid() { - return nil, nil - } - return v.Interface(), nil - } else if rv.Kind() == reflect.Ptr { - // Handle multiple levels of indirection? - if rv.IsNil() { - return nil, nil - } - rv = rv.Elem() - v := rv.FieldByName(fieldName) - if !v.IsValid() { - return nil, nil - } - return v.Interface(), nil - } - return nil, nil -} - -func (intr *treeInterpreter) flattenWithReflection(value interface{}) (interface{}, error) { - v := reflect.ValueOf(value) - flattened := []interface{}{} - for i := 0; i < v.Len(); i++ { - element := v.Index(i).Interface() - if reflect.TypeOf(element).Kind() == reflect.Slice { - // Then insert the contents of the element - // slice into the flattened slice, - // i.e flattened = append(flattened, mySlice...) - elementV := reflect.ValueOf(element) - for j := 0; j < elementV.Len(); j++ { - flattened = append( - flattened, elementV.Index(j).Interface()) - } - } else { - flattened = append(flattened, element) - } - } - return flattened, nil -} - -func (intr *treeInterpreter) sliceWithReflection(node ASTNode, value interface{}) (interface{}, error) { - v := reflect.ValueOf(value) - parts := node.value.([]*int) - sliceParams := make([]sliceParam, 3) - for i, part := range parts { - if part != nil { - sliceParams[i].Specified = true - sliceParams[i].N = *part - } - } - final := []interface{}{} - for i := 0; i < v.Len(); i++ { - element := v.Index(i).Interface() - final = append(final, element) - } - return slice(final, sliceParams) -} - -func (intr *treeInterpreter) filterProjectionWithReflection(node ASTNode, value interface{}) (interface{}, error) { - compareNode := node.children[2] - collected := []interface{}{} - v := reflect.ValueOf(value) - for i := 0; i < v.Len(); i++ { - element := v.Index(i).Interface() - result, err := intr.Execute(compareNode, element) - if err != nil { - return nil, err - } - if !isFalse(result) { - current, err := intr.Execute(node.children[1], element) - if err != nil { - return nil, err - } - if current != nil { - collected = append(collected, current) - } - } - } - return collected, nil -} - -func (intr *treeInterpreter) projectWithReflection(node ASTNode, value interface{}) (interface{}, error) { - collected := []interface{}{} - v := reflect.ValueOf(value) - for i := 0; i < v.Len(); i++ { - element := v.Index(i).Interface() - result, err := intr.Execute(node.children[1], element) - if err != nil { - return nil, err - } - if result != nil { - collected = append(collected, result) - } - } - return collected, nil -} diff --git a/vendor/github.com/jmespath/go-jmespath/lexer.go b/vendor/github.com/jmespath/go-jmespath/lexer.go deleted file mode 100644 index 817900c8f..000000000 --- a/vendor/github.com/jmespath/go-jmespath/lexer.go +++ /dev/null @@ -1,420 +0,0 @@ -package jmespath - -import ( - "bytes" - "encoding/json" - "fmt" - "strconv" - "strings" - "unicode/utf8" -) - -type token struct { - tokenType tokType - value string - position int - length int -} - -type tokType int - -const eof = -1 - -// Lexer contains information about the expression being tokenized. -type Lexer struct { - expression string // The expression provided by the user. - currentPos int // The current position in the string. - lastWidth int // The width of the current rune. This - buf bytes.Buffer // Internal buffer used for building up values. -} - -// SyntaxError is the main error used whenever a lexing or parsing error occurs. -type SyntaxError struct { - msg string // Error message displayed to user - Expression string // Expression that generated a SyntaxError - Offset int // The location in the string where the error occurred -} - -func (e SyntaxError) Error() string { - // In the future, it would be good to underline the specific - // location where the error occurred. - return "SyntaxError: " + e.msg -} - -// HighlightLocation will show where the syntax error occurred. -// It will place a "^" character on a line below the expression -// at the point where the syntax error occurred. -func (e SyntaxError) HighlightLocation() string { - return e.Expression + "\n" + strings.Repeat(" ", e.Offset) + "^" -} - -//go:generate stringer -type=tokType -const ( - tUnknown tokType = iota - tStar - tDot - tFilter - tFlatten - tLparen - tRparen - tLbracket - tRbracket - tLbrace - tRbrace - tOr - tPipe - tNumber - tUnquotedIdentifier - tQuotedIdentifier - tComma - tColon - tLT - tLTE - tGT - tGTE - tEQ - tNE - tJSONLiteral - tStringLiteral - tCurrent - tExpref - tAnd - tNot - tEOF -) - -var basicTokens = map[rune]tokType{ - '.': tDot, - '*': tStar, - ',': tComma, - ':': tColon, - '{': tLbrace, - '}': tRbrace, - ']': tRbracket, // tLbracket not included because it could be "[]" - '(': tLparen, - ')': tRparen, - '@': tCurrent, -} - -// Bit mask for [a-zA-Z_] shifted down 64 bits to fit in a single uint64. -// When using this bitmask just be sure to shift the rune down 64 bits -// before checking against identifierStartBits. -const identifierStartBits uint64 = 576460745995190270 - -// Bit mask for [a-zA-Z0-9], 128 bits -> 2 uint64s. -var identifierTrailingBits = [2]uint64{287948901175001088, 576460745995190270} - -var whiteSpace = map[rune]bool{ - ' ': true, '\t': true, '\n': true, '\r': true, -} - -func (t token) String() string { - return fmt.Sprintf("Token{%+v, %s, %d, %d}", - t.tokenType, t.value, t.position, t.length) -} - -// NewLexer creates a new JMESPath lexer. -func NewLexer() *Lexer { - lexer := Lexer{} - return &lexer -} - -func (lexer *Lexer) next() rune { - if lexer.currentPos >= len(lexer.expression) { - lexer.lastWidth = 0 - return eof - } - r, w := utf8.DecodeRuneInString(lexer.expression[lexer.currentPos:]) - lexer.lastWidth = w - lexer.currentPos += w - return r -} - -func (lexer *Lexer) back() { - lexer.currentPos -= lexer.lastWidth -} - -func (lexer *Lexer) peek() rune { - t := lexer.next() - lexer.back() - return t -} - -// tokenize takes an expression and returns corresponding tokens. -func (lexer *Lexer) tokenize(expression string) ([]token, error) { - var tokens []token - lexer.expression = expression - lexer.currentPos = 0 - lexer.lastWidth = 0 -loop: - for { - r := lexer.next() - if identifierStartBits&(1<<(uint64(r)-64)) > 0 { - t := lexer.consumeUnquotedIdentifier() - tokens = append(tokens, t) - } else if val, ok := basicTokens[r]; ok { - // Basic single char token. - t := token{ - tokenType: val, - value: string(r), - position: lexer.currentPos - lexer.lastWidth, - length: 1, - } - tokens = append(tokens, t) - } else if r == '-' || (r >= '0' && r <= '9') { - t := lexer.consumeNumber() - tokens = append(tokens, t) - } else if r == '[' { - t := lexer.consumeLBracket() - tokens = append(tokens, t) - } else if r == '"' { - t, err := lexer.consumeQuotedIdentifier() - if err != nil { - return tokens, err - } - tokens = append(tokens, t) - } else if r == '\'' { - t, err := lexer.consumeRawStringLiteral() - if err != nil { - return tokens, err - } - tokens = append(tokens, t) - } else if r == '`' { - t, err := lexer.consumeLiteral() - if err != nil { - return tokens, err - } - tokens = append(tokens, t) - } else if r == '|' { - t := lexer.matchOrElse(r, '|', tOr, tPipe) - tokens = append(tokens, t) - } else if r == '<' { - t := lexer.matchOrElse(r, '=', tLTE, tLT) - tokens = append(tokens, t) - } else if r == '>' { - t := lexer.matchOrElse(r, '=', tGTE, tGT) - tokens = append(tokens, t) - } else if r == '!' { - t := lexer.matchOrElse(r, '=', tNE, tNot) - tokens = append(tokens, t) - } else if r == '=' { - t := lexer.matchOrElse(r, '=', tEQ, tUnknown) - tokens = append(tokens, t) - } else if r == '&' { - t := lexer.matchOrElse(r, '&', tAnd, tExpref) - tokens = append(tokens, t) - } else if r == eof { - break loop - } else if _, ok := whiteSpace[r]; ok { - // Ignore whitespace - } else { - return tokens, lexer.syntaxError(fmt.Sprintf("Unknown char: %s", strconv.QuoteRuneToASCII(r))) - } - } - tokens = append(tokens, token{tEOF, "", len(lexer.expression), 0}) - return tokens, nil -} - -// Consume characters until the ending rune "r" is reached. -// If the end of the expression is reached before seeing the -// terminating rune "r", then an error is returned. -// If no error occurs then the matching substring is returned. -// The returned string will not include the ending rune. -func (lexer *Lexer) consumeUntil(end rune) (string, error) { - start := lexer.currentPos - current := lexer.next() - for current != end && current != eof { - if current == '\\' && lexer.peek() != eof { - lexer.next() - } - current = lexer.next() - } - if lexer.lastWidth == 0 { - // Then we hit an EOF so we never reached the closing - // delimiter. - return "", SyntaxError{ - msg: "Unclosed delimiter: " + string(end), - Expression: lexer.expression, - Offset: len(lexer.expression), - } - } - return lexer.expression[start : lexer.currentPos-lexer.lastWidth], nil -} - -func (lexer *Lexer) consumeLiteral() (token, error) { - start := lexer.currentPos - value, err := lexer.consumeUntil('`') - if err != nil { - return token{}, err - } - value = strings.Replace(value, "\\`", "`", -1) - return token{ - tokenType: tJSONLiteral, - value: value, - position: start, - length: len(value), - }, nil -} - -func (lexer *Lexer) consumeRawStringLiteral() (token, error) { - start := lexer.currentPos - currentIndex := start - current := lexer.next() - for current != '\'' && lexer.peek() != eof { - if current == '\\' && lexer.peek() == '\'' { - chunk := lexer.expression[currentIndex : lexer.currentPos-1] - lexer.buf.WriteString(chunk) - lexer.buf.WriteString("'") - lexer.next() - currentIndex = lexer.currentPos - } - current = lexer.next() - } - if lexer.lastWidth == 0 { - // Then we hit an EOF so we never reached the closing - // delimiter. - return token{}, SyntaxError{ - msg: "Unclosed delimiter: '", - Expression: lexer.expression, - Offset: len(lexer.expression), - } - } - if currentIndex < lexer.currentPos { - lexer.buf.WriteString(lexer.expression[currentIndex : lexer.currentPos-1]) - } - value := lexer.buf.String() - // Reset the buffer so it can reused again. - lexer.buf.Reset() - return token{ - tokenType: tStringLiteral, - value: value, - position: start, - length: len(value), - }, nil -} - -func (lexer *Lexer) syntaxError(msg string) SyntaxError { - return SyntaxError{ - msg: msg, - Expression: lexer.expression, - Offset: lexer.currentPos - 1, - } -} - -// Checks for a two char token, otherwise matches a single character -// token. This is used whenever a two char token overlaps a single -// char token, e.g. "||" -> tPipe, "|" -> tOr. -func (lexer *Lexer) matchOrElse(first rune, second rune, matchedType tokType, singleCharType tokType) token { - start := lexer.currentPos - lexer.lastWidth - nextRune := lexer.next() - var t token - if nextRune == second { - t = token{ - tokenType: matchedType, - value: string(first) + string(second), - position: start, - length: 2, - } - } else { - lexer.back() - t = token{ - tokenType: singleCharType, - value: string(first), - position: start, - length: 1, - } - } - return t -} - -func (lexer *Lexer) consumeLBracket() token { - // There's three options here: - // 1. A filter expression "[?" - // 2. A flatten operator "[]" - // 3. A bare rbracket "[" - start := lexer.currentPos - lexer.lastWidth - nextRune := lexer.next() - var t token - if nextRune == '?' { - t = token{ - tokenType: tFilter, - value: "[?", - position: start, - length: 2, - } - } else if nextRune == ']' { - t = token{ - tokenType: tFlatten, - value: "[]", - position: start, - length: 2, - } - } else { - t = token{ - tokenType: tLbracket, - value: "[", - position: start, - length: 1, - } - lexer.back() - } - return t -} - -func (lexer *Lexer) consumeQuotedIdentifier() (token, error) { - start := lexer.currentPos - value, err := lexer.consumeUntil('"') - if err != nil { - return token{}, err - } - var decoded string - asJSON := []byte("\"" + value + "\"") - if err := json.Unmarshal([]byte(asJSON), &decoded); err != nil { - return token{}, err - } - return token{ - tokenType: tQuotedIdentifier, - value: decoded, - position: start - 1, - length: len(decoded), - }, nil -} - -func (lexer *Lexer) consumeUnquotedIdentifier() token { - // Consume runes until we reach the end of an unquoted - // identifier. - start := lexer.currentPos - lexer.lastWidth - for { - r := lexer.next() - if r < 0 || r > 128 || identifierTrailingBits[uint64(r)/64]&(1<<(uint64(r)%64)) == 0 { - lexer.back() - break - } - } - value := lexer.expression[start:lexer.currentPos] - return token{ - tokenType: tUnquotedIdentifier, - value: value, - position: start, - length: lexer.currentPos - start, - } -} - -func (lexer *Lexer) consumeNumber() token { - // Consume runes until we reach something that's not a number. - start := lexer.currentPos - lexer.lastWidth - for { - r := lexer.next() - if r < '0' || r > '9' { - lexer.back() - break - } - } - value := lexer.expression[start:lexer.currentPos] - return token{ - tokenType: tNumber, - value: value, - position: start, - length: lexer.currentPos - start, - } -} diff --git a/vendor/github.com/jmespath/go-jmespath/parser.go b/vendor/github.com/jmespath/go-jmespath/parser.go deleted file mode 100644 index 1240a1755..000000000 --- a/vendor/github.com/jmespath/go-jmespath/parser.go +++ /dev/null @@ -1,603 +0,0 @@ -package jmespath - -import ( - "encoding/json" - "fmt" - "strconv" - "strings" -) - -type astNodeType int - -//go:generate stringer -type astNodeType -const ( - ASTEmpty astNodeType = iota - ASTComparator - ASTCurrentNode - ASTExpRef - ASTFunctionExpression - ASTField - ASTFilterProjection - ASTFlatten - ASTIdentity - ASTIndex - ASTIndexExpression - ASTKeyValPair - ASTLiteral - ASTMultiSelectHash - ASTMultiSelectList - ASTOrExpression - ASTAndExpression - ASTNotExpression - ASTPipe - ASTProjection - ASTSubexpression - ASTSlice - ASTValueProjection -) - -// ASTNode represents the abstract syntax tree of a JMESPath expression. -type ASTNode struct { - nodeType astNodeType - value interface{} - children []ASTNode -} - -func (node ASTNode) String() string { - return node.PrettyPrint(0) -} - -// PrettyPrint will pretty print the parsed AST. -// The AST is an implementation detail and this pretty print -// function is provided as a convenience method to help with -// debugging. You should not rely on its output as the internal -// structure of the AST may change at any time. -func (node ASTNode) PrettyPrint(indent int) string { - spaces := strings.Repeat(" ", indent) - output := fmt.Sprintf("%s%s {\n", spaces, node.nodeType) - nextIndent := indent + 2 - if node.value != nil { - if converted, ok := node.value.(fmt.Stringer); ok { - // Account for things like comparator nodes - // that are enums with a String() method. - output += fmt.Sprintf("%svalue: %s\n", strings.Repeat(" ", nextIndent), converted.String()) - } else { - output += fmt.Sprintf("%svalue: %#v\n", strings.Repeat(" ", nextIndent), node.value) - } - } - lastIndex := len(node.children) - if lastIndex > 0 { - output += fmt.Sprintf("%schildren: {\n", strings.Repeat(" ", nextIndent)) - childIndent := nextIndent + 2 - for _, elem := range node.children { - output += elem.PrettyPrint(childIndent) - } - } - output += fmt.Sprintf("%s}\n", spaces) - return output -} - -var bindingPowers = map[tokType]int{ - tEOF: 0, - tUnquotedIdentifier: 0, - tQuotedIdentifier: 0, - tRbracket: 0, - tRparen: 0, - tComma: 0, - tRbrace: 0, - tNumber: 0, - tCurrent: 0, - tExpref: 0, - tColon: 0, - tPipe: 1, - tOr: 2, - tAnd: 3, - tEQ: 5, - tLT: 5, - tLTE: 5, - tGT: 5, - tGTE: 5, - tNE: 5, - tFlatten: 9, - tStar: 20, - tFilter: 21, - tDot: 40, - tNot: 45, - tLbrace: 50, - tLbracket: 55, - tLparen: 60, -} - -// Parser holds state about the current expression being parsed. -type Parser struct { - expression string - tokens []token - index int -} - -// NewParser creates a new JMESPath parser. -func NewParser() *Parser { - p := Parser{} - return &p -} - -// Parse will compile a JMESPath expression. -func (p *Parser) Parse(expression string) (ASTNode, error) { - lexer := NewLexer() - p.expression = expression - p.index = 0 - tokens, err := lexer.tokenize(expression) - if err != nil { - return ASTNode{}, err - } - p.tokens = tokens - parsed, err := p.parseExpression(0) - if err != nil { - return ASTNode{}, err - } - if p.current() != tEOF { - return ASTNode{}, p.syntaxError(fmt.Sprintf( - "Unexpected token at the end of the expresssion: %s", p.current())) - } - return parsed, nil -} - -func (p *Parser) parseExpression(bindingPower int) (ASTNode, error) { - var err error - leftToken := p.lookaheadToken(0) - p.advance() - leftNode, err := p.nud(leftToken) - if err != nil { - return ASTNode{}, err - } - currentToken := p.current() - for bindingPower < bindingPowers[currentToken] { - p.advance() - leftNode, err = p.led(currentToken, leftNode) - if err != nil { - return ASTNode{}, err - } - currentToken = p.current() - } - return leftNode, nil -} - -func (p *Parser) parseIndexExpression() (ASTNode, error) { - if p.lookahead(0) == tColon || p.lookahead(1) == tColon { - return p.parseSliceExpression() - } - indexStr := p.lookaheadToken(0).value - parsedInt, err := strconv.Atoi(indexStr) - if err != nil { - return ASTNode{}, err - } - indexNode := ASTNode{nodeType: ASTIndex, value: parsedInt} - p.advance() - if err := p.match(tRbracket); err != nil { - return ASTNode{}, err - } - return indexNode, nil -} - -func (p *Parser) parseSliceExpression() (ASTNode, error) { - parts := []*int{nil, nil, nil} - index := 0 - current := p.current() - for current != tRbracket && index < 3 { - if current == tColon { - index++ - p.advance() - } else if current == tNumber { - parsedInt, err := strconv.Atoi(p.lookaheadToken(0).value) - if err != nil { - return ASTNode{}, err - } - parts[index] = &parsedInt - p.advance() - } else { - return ASTNode{}, p.syntaxError( - "Expected tColon or tNumber" + ", received: " + p.current().String()) - } - current = p.current() - } - if err := p.match(tRbracket); err != nil { - return ASTNode{}, err - } - return ASTNode{ - nodeType: ASTSlice, - value: parts, - }, nil -} - -func (p *Parser) match(tokenType tokType) error { - if p.current() == tokenType { - p.advance() - return nil - } - return p.syntaxError("Expected " + tokenType.String() + ", received: " + p.current().String()) -} - -func (p *Parser) led(tokenType tokType, node ASTNode) (ASTNode, error) { - switch tokenType { - case tDot: - if p.current() != tStar { - right, err := p.parseDotRHS(bindingPowers[tDot]) - return ASTNode{ - nodeType: ASTSubexpression, - children: []ASTNode{node, right}, - }, err - } - p.advance() - right, err := p.parseProjectionRHS(bindingPowers[tDot]) - return ASTNode{ - nodeType: ASTValueProjection, - children: []ASTNode{node, right}, - }, err - case tPipe: - right, err := p.parseExpression(bindingPowers[tPipe]) - return ASTNode{nodeType: ASTPipe, children: []ASTNode{node, right}}, err - case tOr: - right, err := p.parseExpression(bindingPowers[tOr]) - return ASTNode{nodeType: ASTOrExpression, children: []ASTNode{node, right}}, err - case tAnd: - right, err := p.parseExpression(bindingPowers[tAnd]) - return ASTNode{nodeType: ASTAndExpression, children: []ASTNode{node, right}}, err - case tLparen: - name := node.value - var args []ASTNode - for p.current() != tRparen { - expression, err := p.parseExpression(0) - if err != nil { - return ASTNode{}, err - } - if p.current() == tComma { - if err := p.match(tComma); err != nil { - return ASTNode{}, err - } - } - args = append(args, expression) - } - if err := p.match(tRparen); err != nil { - return ASTNode{}, err - } - return ASTNode{ - nodeType: ASTFunctionExpression, - value: name, - children: args, - }, nil - case tFilter: - return p.parseFilter(node) - case tFlatten: - left := ASTNode{nodeType: ASTFlatten, children: []ASTNode{node}} - right, err := p.parseProjectionRHS(bindingPowers[tFlatten]) - return ASTNode{ - nodeType: ASTProjection, - children: []ASTNode{left, right}, - }, err - case tEQ, tNE, tGT, tGTE, tLT, tLTE: - right, err := p.parseExpression(bindingPowers[tokenType]) - if err != nil { - return ASTNode{}, err - } - return ASTNode{ - nodeType: ASTComparator, - value: tokenType, - children: []ASTNode{node, right}, - }, nil - case tLbracket: - tokenType := p.current() - var right ASTNode - var err error - if tokenType == tNumber || tokenType == tColon { - right, err = p.parseIndexExpression() - if err != nil { - return ASTNode{}, err - } - return p.projectIfSlice(node, right) - } - // Otherwise this is a projection. - if err := p.match(tStar); err != nil { - return ASTNode{}, err - } - if err := p.match(tRbracket); err != nil { - return ASTNode{}, err - } - right, err = p.parseProjectionRHS(bindingPowers[tStar]) - if err != nil { - return ASTNode{}, err - } - return ASTNode{ - nodeType: ASTProjection, - children: []ASTNode{node, right}, - }, nil - } - return ASTNode{}, p.syntaxError("Unexpected token: " + tokenType.String()) -} - -func (p *Parser) nud(token token) (ASTNode, error) { - switch token.tokenType { - case tJSONLiteral: - var parsed interface{} - err := json.Unmarshal([]byte(token.value), &parsed) - if err != nil { - return ASTNode{}, err - } - return ASTNode{nodeType: ASTLiteral, value: parsed}, nil - case tStringLiteral: - return ASTNode{nodeType: ASTLiteral, value: token.value}, nil - case tUnquotedIdentifier: - return ASTNode{ - nodeType: ASTField, - value: token.value, - }, nil - case tQuotedIdentifier: - node := ASTNode{nodeType: ASTField, value: token.value} - if p.current() == tLparen { - return ASTNode{}, p.syntaxErrorToken("Can't have quoted identifier as function name.", token) - } - return node, nil - case tStar: - left := ASTNode{nodeType: ASTIdentity} - var right ASTNode - var err error - if p.current() == tRbracket { - right = ASTNode{nodeType: ASTIdentity} - } else { - right, err = p.parseProjectionRHS(bindingPowers[tStar]) - } - return ASTNode{nodeType: ASTValueProjection, children: []ASTNode{left, right}}, err - case tFilter: - return p.parseFilter(ASTNode{nodeType: ASTIdentity}) - case tLbrace: - return p.parseMultiSelectHash() - case tFlatten: - left := ASTNode{ - nodeType: ASTFlatten, - children: []ASTNode{{nodeType: ASTIdentity}}, - } - right, err := p.parseProjectionRHS(bindingPowers[tFlatten]) - if err != nil { - return ASTNode{}, err - } - return ASTNode{nodeType: ASTProjection, children: []ASTNode{left, right}}, nil - case tLbracket: - tokenType := p.current() - //var right ASTNode - if tokenType == tNumber || tokenType == tColon { - right, err := p.parseIndexExpression() - if err != nil { - return ASTNode{}, nil - } - return p.projectIfSlice(ASTNode{nodeType: ASTIdentity}, right) - } else if tokenType == tStar && p.lookahead(1) == tRbracket { - p.advance() - p.advance() - right, err := p.parseProjectionRHS(bindingPowers[tStar]) - if err != nil { - return ASTNode{}, err - } - return ASTNode{ - nodeType: ASTProjection, - children: []ASTNode{{nodeType: ASTIdentity}, right}, - }, nil - } else { - return p.parseMultiSelectList() - } - case tCurrent: - return ASTNode{nodeType: ASTCurrentNode}, nil - case tExpref: - expression, err := p.parseExpression(bindingPowers[tExpref]) - if err != nil { - return ASTNode{}, err - } - return ASTNode{nodeType: ASTExpRef, children: []ASTNode{expression}}, nil - case tNot: - expression, err := p.parseExpression(bindingPowers[tNot]) - if err != nil { - return ASTNode{}, err - } - return ASTNode{nodeType: ASTNotExpression, children: []ASTNode{expression}}, nil - case tLparen: - expression, err := p.parseExpression(0) - if err != nil { - return ASTNode{}, err - } - if err := p.match(tRparen); err != nil { - return ASTNode{}, err - } - return expression, nil - case tEOF: - return ASTNode{}, p.syntaxErrorToken("Incomplete expression", token) - } - - return ASTNode{}, p.syntaxErrorToken("Invalid token: "+token.tokenType.String(), token) -} - -func (p *Parser) parseMultiSelectList() (ASTNode, error) { - var expressions []ASTNode - for { - expression, err := p.parseExpression(0) - if err != nil { - return ASTNode{}, err - } - expressions = append(expressions, expression) - if p.current() == tRbracket { - break - } - err = p.match(tComma) - if err != nil { - return ASTNode{}, err - } - } - err := p.match(tRbracket) - if err != nil { - return ASTNode{}, err - } - return ASTNode{ - nodeType: ASTMultiSelectList, - children: expressions, - }, nil -} - -func (p *Parser) parseMultiSelectHash() (ASTNode, error) { - var children []ASTNode - for { - keyToken := p.lookaheadToken(0) - if err := p.match(tUnquotedIdentifier); err != nil { - if err := p.match(tQuotedIdentifier); err != nil { - return ASTNode{}, p.syntaxError("Expected tQuotedIdentifier or tUnquotedIdentifier") - } - } - keyName := keyToken.value - err := p.match(tColon) - if err != nil { - return ASTNode{}, err - } - value, err := p.parseExpression(0) - if err != nil { - return ASTNode{}, err - } - node := ASTNode{ - nodeType: ASTKeyValPair, - value: keyName, - children: []ASTNode{value}, - } - children = append(children, node) - if p.current() == tComma { - err := p.match(tComma) - if err != nil { - return ASTNode{}, nil - } - } else if p.current() == tRbrace { - err := p.match(tRbrace) - if err != nil { - return ASTNode{}, nil - } - break - } - } - return ASTNode{ - nodeType: ASTMultiSelectHash, - children: children, - }, nil -} - -func (p *Parser) projectIfSlice(left ASTNode, right ASTNode) (ASTNode, error) { - indexExpr := ASTNode{ - nodeType: ASTIndexExpression, - children: []ASTNode{left, right}, - } - if right.nodeType == ASTSlice { - right, err := p.parseProjectionRHS(bindingPowers[tStar]) - return ASTNode{ - nodeType: ASTProjection, - children: []ASTNode{indexExpr, right}, - }, err - } - return indexExpr, nil -} -func (p *Parser) parseFilter(node ASTNode) (ASTNode, error) { - var right, condition ASTNode - var err error - condition, err = p.parseExpression(0) - if err != nil { - return ASTNode{}, err - } - if err := p.match(tRbracket); err != nil { - return ASTNode{}, err - } - if p.current() == tFlatten { - right = ASTNode{nodeType: ASTIdentity} - } else { - right, err = p.parseProjectionRHS(bindingPowers[tFilter]) - if err != nil { - return ASTNode{}, err - } - } - - return ASTNode{ - nodeType: ASTFilterProjection, - children: []ASTNode{node, right, condition}, - }, nil -} - -func (p *Parser) parseDotRHS(bindingPower int) (ASTNode, error) { - lookahead := p.current() - if tokensOneOf([]tokType{tQuotedIdentifier, tUnquotedIdentifier, tStar}, lookahead) { - return p.parseExpression(bindingPower) - } else if lookahead == tLbracket { - if err := p.match(tLbracket); err != nil { - return ASTNode{}, err - } - return p.parseMultiSelectList() - } else if lookahead == tLbrace { - if err := p.match(tLbrace); err != nil { - return ASTNode{}, err - } - return p.parseMultiSelectHash() - } - return ASTNode{}, p.syntaxError("Expected identifier, lbracket, or lbrace") -} - -func (p *Parser) parseProjectionRHS(bindingPower int) (ASTNode, error) { - current := p.current() - if bindingPowers[current] < 10 { - return ASTNode{nodeType: ASTIdentity}, nil - } else if current == tLbracket { - return p.parseExpression(bindingPower) - } else if current == tFilter { - return p.parseExpression(bindingPower) - } else if current == tDot { - err := p.match(tDot) - if err != nil { - return ASTNode{}, err - } - return p.parseDotRHS(bindingPower) - } else { - return ASTNode{}, p.syntaxError("Error") - } -} - -func (p *Parser) lookahead(number int) tokType { - return p.lookaheadToken(number).tokenType -} - -func (p *Parser) current() tokType { - return p.lookahead(0) -} - -func (p *Parser) lookaheadToken(number int) token { - return p.tokens[p.index+number] -} - -func (p *Parser) advance() { - p.index++ -} - -func tokensOneOf(elements []tokType, token tokType) bool { - for _, elem := range elements { - if elem == token { - return true - } - } - return false -} - -func (p *Parser) syntaxError(msg string) SyntaxError { - return SyntaxError{ - msg: msg, - Expression: p.expression, - Offset: p.lookaheadToken(0).position, - } -} - -// Create a SyntaxError based on the provided token. -// This differs from syntaxError() which creates a SyntaxError -// based on the current lookahead token. -func (p *Parser) syntaxErrorToken(msg string, t token) SyntaxError { - return SyntaxError{ - msg: msg, - Expression: p.expression, - Offset: t.position, - } -} diff --git a/vendor/github.com/jmespath/go-jmespath/toktype_string.go b/vendor/github.com/jmespath/go-jmespath/toktype_string.go deleted file mode 100644 index dae79cbdf..000000000 --- a/vendor/github.com/jmespath/go-jmespath/toktype_string.go +++ /dev/null @@ -1,16 +0,0 @@ -// generated by stringer -type=tokType; DO NOT EDIT - -package jmespath - -import "fmt" - -const _tokType_name = "tUnknowntStartDottFiltertFlattentLparentRparentLbrackettRbrackettLbracetRbracetOrtPipetNumbertUnquotedIdentifiertQuotedIdentifiertCommatColontLTtLTEtGTtGTEtEQtNEtJSONLiteraltStringLiteraltCurrenttExpreftAndtNottEOF" - -var _tokType_index = [...]uint8{0, 8, 13, 17, 24, 32, 39, 46, 55, 64, 71, 78, 81, 86, 93, 112, 129, 135, 141, 144, 148, 151, 155, 158, 161, 173, 187, 195, 202, 206, 210, 214} - -func (i tokType) String() string { - if i < 0 || i >= tokType(len(_tokType_index)-1) { - return fmt.Sprintf("tokType(%d)", i) - } - return _tokType_name[_tokType_index[i]:_tokType_index[i+1]] -} diff --git a/vendor/github.com/jmespath/go-jmespath/util.go b/vendor/github.com/jmespath/go-jmespath/util.go deleted file mode 100644 index ddc1b7d7d..000000000 --- a/vendor/github.com/jmespath/go-jmespath/util.go +++ /dev/null @@ -1,185 +0,0 @@ -package jmespath - -import ( - "errors" - "reflect" -) - -// IsFalse determines if an object is false based on the JMESPath spec. -// JMESPath defines false values to be any of: -// - An empty string array, or hash. -// - The boolean value false. -// - nil -func isFalse(value interface{}) bool { - switch v := value.(type) { - case bool: - return !v - case []interface{}: - return len(v) == 0 - case map[string]interface{}: - return len(v) == 0 - case string: - return len(v) == 0 - case nil: - return true - } - // Try the reflection cases before returning false. - rv := reflect.ValueOf(value) - switch rv.Kind() { - case reflect.Struct: - // A struct type will never be false, even if - // all of its values are the zero type. - return false - case reflect.Slice, reflect.Map: - return rv.Len() == 0 - case reflect.Ptr: - if rv.IsNil() { - return true - } - // If it's a pointer type, we'll try to deref the pointer - // and evaluate the pointer value for isFalse. - element := rv.Elem() - return isFalse(element.Interface()) - } - return false -} - -// ObjsEqual is a generic object equality check. -// It will take two arbitrary objects and recursively determine -// if they are equal. -func objsEqual(left interface{}, right interface{}) bool { - return reflect.DeepEqual(left, right) -} - -// SliceParam refers to a single part of a slice. -// A slice consists of a start, a stop, and a step, similar to -// python slices. -type sliceParam struct { - N int - Specified bool -} - -// Slice supports [start:stop:step] style slicing that's supported in JMESPath. -func slice(slice []interface{}, parts []sliceParam) ([]interface{}, error) { - computed, err := computeSliceParams(len(slice), parts) - if err != nil { - return nil, err - } - start, stop, step := computed[0], computed[1], computed[2] - result := []interface{}{} - if step > 0 { - for i := start; i < stop; i += step { - result = append(result, slice[i]) - } - } else { - for i := start; i > stop; i += step { - result = append(result, slice[i]) - } - } - return result, nil -} - -func computeSliceParams(length int, parts []sliceParam) ([]int, error) { - var start, stop, step int - if !parts[2].Specified { - step = 1 - } else if parts[2].N == 0 { - return nil, errors.New("Invalid slice, step cannot be 0") - } else { - step = parts[2].N - } - var stepValueNegative bool - if step < 0 { - stepValueNegative = true - } else { - stepValueNegative = false - } - - if !parts[0].Specified { - if stepValueNegative { - start = length - 1 - } else { - start = 0 - } - } else { - start = capSlice(length, parts[0].N, step) - } - - if !parts[1].Specified { - if stepValueNegative { - stop = -1 - } else { - stop = length - } - } else { - stop = capSlice(length, parts[1].N, step) - } - return []int{start, stop, step}, nil -} - -func capSlice(length int, actual int, step int) int { - if actual < 0 { - actual += length - if actual < 0 { - if step < 0 { - actual = -1 - } else { - actual = 0 - } - } - } else if actual >= length { - if step < 0 { - actual = length - 1 - } else { - actual = length - } - } - return actual -} - -// ToArrayNum converts an empty interface type to a slice of float64. -// If any element in the array cannot be converted, then nil is returned -// along with a second value of false. -func toArrayNum(data interface{}) ([]float64, bool) { - // Is there a better way to do this with reflect? - if d, ok := data.([]interface{}); ok { - result := make([]float64, len(d)) - for i, el := range d { - item, ok := el.(float64) - if !ok { - return nil, false - } - result[i] = item - } - return result, true - } - return nil, false -} - -// ToArrayStr converts an empty interface type to a slice of strings. -// If any element in the array cannot be converted, then nil is returned -// along with a second value of false. If the input data could be entirely -// converted, then the converted data, along with a second value of true, -// will be returned. -func toArrayStr(data interface{}) ([]string, bool) { - // Is there a better way to do this with reflect? - if d, ok := data.([]interface{}); ok { - result := make([]string, len(d)) - for i, el := range d { - item, ok := el.(string) - if !ok { - return nil, false - } - result[i] = item - } - return result, true - } - return nil, false -} - -func isSliceType(v interface{}) bool { - if v == nil { - return false - } - return reflect.TypeOf(v).Kind() == reflect.Slice -} diff --git a/vendor/github.com/m3db/prometheus_client_golang/AUTHORS.md b/vendor/github.com/m3db/prometheus_client_golang/AUTHORS.md new file mode 100644 index 000000000..c5275d5ab --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/AUTHORS.md @@ -0,0 +1,18 @@ +The Prometheus project was started by Matt T. Proud (emeritus) and +Julius Volz in 2012. + +Maintainers of this repository: + +* Björn Rabenstein + +The following individuals have contributed code to this repository +(listed in alphabetical order): + +* Bernerd Schaefer +* Björn Rabenstein +* Daniel Bornkessel +* Jeff Younker +* Julius Volz +* Matt T. Proud +* Tobias Schmidt + diff --git a/vendor/contrib.go.opencensus.io/exporter/prometheus/LICENSE b/vendor/github.com/m3db/prometheus_client_golang/LICENSE similarity index 100% rename from vendor/contrib.go.opencensus.io/exporter/prometheus/LICENSE rename to vendor/github.com/m3db/prometheus_client_golang/LICENSE diff --git a/vendor/github.com/prometheus/client_golang/NOTICE b/vendor/github.com/m3db/prometheus_client_golang/NOTICE similarity index 100% rename from vendor/github.com/prometheus/client_golang/NOTICE rename to vendor/github.com/m3db/prometheus_client_golang/NOTICE diff --git a/vendor/github.com/prometheus/client_golang/prometheus/.gitignore b/vendor/github.com/m3db/prometheus_client_golang/prometheus/.gitignore similarity index 100% rename from vendor/github.com/prometheus/client_golang/prometheus/.gitignore rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/.gitignore diff --git a/vendor/github.com/prometheus/client_golang/prometheus/README.md b/vendor/github.com/m3db/prometheus_client_golang/prometheus/README.md similarity index 100% rename from vendor/github.com/prometheus/client_golang/prometheus/README.md rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/README.md diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/collector.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/collector.go new file mode 100644 index 000000000..623d3d83f --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/collector.go @@ -0,0 +1,75 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Collector is the interface implemented by anything that can be used by +// Prometheus to collect metrics. A Collector has to be registered for +// collection. See Registerer.Register. +// +// The stock metrics provided by this package (Gauge, Counter, Summary, +// Histogram, Untyped) are also Collectors (which only ever collect one metric, +// namely itself). An implementer of Collector may, however, collect multiple +// metrics in a coordinated fashion and/or create metrics on the fly. Examples +// for collectors already implemented in this library are the metric vectors +// (i.e. collection of multiple instances of the same Metric but with different +// label values) like GaugeVec or SummaryVec, and the ExpvarCollector. +type Collector interface { + // Describe sends the super-set of all possible descriptors of metrics + // collected by this Collector to the provided channel and returns once + // the last descriptor has been sent. The sent descriptors fulfill the + // consistency and uniqueness requirements described in the Desc + // documentation. (It is valid if one and the same Collector sends + // duplicate descriptors. Those duplicates are simply ignored. However, + // two different Collectors must not send duplicate descriptors.) This + // method idempotently sends the same descriptors throughout the + // lifetime of the Collector. If a Collector encounters an error while + // executing this method, it must send an invalid descriptor (created + // with NewInvalidDesc) to signal the error to the registry. + Describe(chan<- *Desc) + // Collect is called by the Prometheus registry when collecting + // metrics. The implementation sends each collected metric via the + // provided channel and returns once the last metric has been sent. The + // descriptor of each sent metric is one of those returned by + // Describe. Returned metrics that share the same descriptor must differ + // in their variable label values. This method may be called + // concurrently and must therefore be implemented in a concurrency safe + // way. Blocking occurs at the expense of total performance of rendering + // all registered metrics. Ideally, Collector implementations support + // concurrent readers. + Collect(chan<- Metric) +} + +// selfCollector implements Collector for a single Metric so that the Metric +// collects itself. Add it as an anonymous field to a struct that implements +// Metric, and call init with the Metric itself as an argument. +type selfCollector struct { + self Metric +} + +// init provides the selfCollector with a reference to the metric it is supposed +// to collect. It is usually called within the factory function to create a +// metric. See example. +func (c *selfCollector) init(self Metric) { + c.self = self +} + +// Describe implements Collector. +func (c *selfCollector) Describe(ch chan<- *Desc) { + ch <- c.self.Desc() +} + +// Collect implements Collector. +func (c *selfCollector) Collect(ch chan<- Metric) { + ch <- c.self +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/counter.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/counter.go new file mode 100644 index 000000000..ee37949ad --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/counter.go @@ -0,0 +1,172 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" +) + +// Counter is a Metric that represents a single numerical value that only ever +// goes up. That implies that it cannot be used to count items whose number can +// also go down, e.g. the number of currently running goroutines. Those +// "counters" are represented by Gauges. +// +// A Counter is typically used to count requests served, tasks completed, errors +// occurred, etc. +// +// To create Counter instances, use NewCounter. +type Counter interface { + Metric + Collector + + // Set is used to set the Counter to an arbitrary value. It is only used + // if you have to transfer a value from an external counter into this + // Prometheus metric. Do not use it for regular handling of a + // Prometheus counter (as it can be used to break the contract of + // monotonically increasing values). + // + // Deprecated: Use NewConstMetric to create a counter for an external + // value. A Counter should never be set. + Set(float64) + // Inc increments the counter by 1. + Inc() + // Add adds the given value to the counter. It panics if the value is < + // 0. + Add(float64) +} + +// CounterOpts is an alias for Opts. See there for doc comments. +type CounterOpts Opts + +// NewCounter creates a new Counter based on the provided CounterOpts. +func NewCounter(opts CounterOpts) Counter { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ) + result := &counter{value: value{desc: desc, valType: CounterValue, labelPairs: desc.constLabelPairs}} + result.init(result) // Init self-collection. + return result +} + +type counter struct { + value +} + +func (c *counter) Add(v float64) { + if v < 0 { + panic(errors.New("counter cannot decrease in value")) + } + c.value.Add(v) +} + +// CounterVec is a Collector that bundles a set of Counters that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. number of HTTP requests, partitioned by response code and +// method). Create instances with NewCounterVec. +// +// CounterVec embeds MetricVec. See there for a full list of methods with +// detailed documentation. +type CounterVec struct { + *MetricVec +} + +// NewCounterVec creates a new CounterVec based on the provided CounterOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &CounterVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + result := &counter{value: value{ + desc: desc, + valType: CounterValue, + labelPairs: makeLabelPairs(desc, lvs), + }} + result.init(result) // Init self-collection. + return result + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Counter and not a +// Metric so that no type conversion is required. +func (m *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Counter and not a Metric so that no +// type conversion is required. +func (m *CounterVec) GetMetricWith(labels Labels) (Counter, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *CounterVec) WithLabelValues(lvs ...string) Counter { + return m.MetricVec.WithLabelValues(lvs...).(Counter) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *CounterVec) With(labels Labels) Counter { + return m.MetricVec.With(labels).(Counter) +} + +// CounterFunc is a Counter whose value is determined at collect time by calling a +// provided function. +// +// To create CounterFunc instances, use NewCounterFunc. +type CounterFunc interface { + Metric + Collector +} + +// NewCounterFunc creates a new CounterFunc based on the provided +// CounterOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a CounterFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. The function should also honor +// the contract for a Counter (values only go up, not down), but compliance will +// not be checked. +func NewCounterFunc(opts CounterOpts, function func() float64) CounterFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), CounterValue, function) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/desc.go similarity index 81% rename from vendor/github.com/prometheus/client_golang/prometheus/desc.go rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/desc.go index 1d034f871..cadbc69b3 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/desc.go +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/desc.go @@ -16,15 +16,33 @@ package prometheus import ( "errors" "fmt" + "regexp" "sort" "strings" "github.com/golang/protobuf/proto" - "github.com/prometheus/common/model" - dto "github.com/prometheus/client_model/go" + dto "github.com/m3db/prometheus_client_model/go" ) +var ( + metricNameRE = regexp.MustCompile(`^[a-zA-Z_][a-zA-Z0-9_:]*$`) + labelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") +) + +// reservedLabelPrefix is a prefix which is not legal in user-supplied +// label names. +const reservedLabelPrefix = "__" + +// Labels represents a collection of label name -> value mappings. This type is +// commonly used with the With(Labels) and GetMetricWith(Labels) methods of +// metric vector Collectors, e.g.: +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +// +// The other use-case is the specification of constant label pairs in Opts or to +// create a Desc. +type Labels map[string]string + // Desc is the descriptor used by every Prometheus Metric. It is essentially // the immutable meta-data of a Metric. The normal Metric implementations // included in this package manage their Desc under the hood. Users only have to @@ -60,27 +78,32 @@ type Desc struct { // Help string. Each Desc with the same fqName must have the same // dimHash. dimHash uint64 - // err is an error that occurred during construction. It is reported on + // err is an error that occured during construction. It is reported on // registration time. err error } // NewDesc allocates and initializes a new Desc. Errors are recorded in the Desc // and will be reported on registration time. variableLabels and constLabels can -// be nil if no such labels should be set. fqName must not be empty. +// be nil if no such labels should be set. fqName and help must not be empty. // // variableLabels only contain the label names. Their label values are variable // and therefore not part of the Desc. (They are managed within the Metric.) // // For constLabels, the label values are constant. Therefore, they are fully -// specified in the Desc. See the Collector example for a usage pattern. +// specified in the Desc. See the Opts documentation for the implications of +// constant labels. func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) *Desc { d := &Desc{ fqName: fqName, help: help, variableLabels: variableLabels, } - if !model.IsValidMetricName(model.LabelValue(fqName)) { + if help == "" { + d.err = errors.New("empty help string") + return d + } + if !metricNameRE.MatchString(fqName) { d.err = fmt.Errorf("%q is not a valid metric name", fqName) return d } @@ -93,7 +116,7 @@ func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) * // First add only the const label names and sort them... for labelName := range constLabels { if !checkLabelName(labelName) { - d.err = fmt.Errorf("%q is not a valid label name for metric %q", labelName, fqName) + d.err = fmt.Errorf("%q is not a valid label name", labelName) return d } labelNames = append(labelNames, labelName) @@ -104,18 +127,12 @@ func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) * for _, labelName := range labelNames { labelValues = append(labelValues, constLabels[labelName]) } - // Validate the const label values. They can't have a wrong cardinality, so - // use in len(labelValues) as expectedNumberOfValues. - if err := validateLabelValues(labelValues, len(labelValues)); err != nil { - d.err = err - return d - } // Now add the variable label names, but prefix them with something that // cannot be in a regular label name. That prevents matching the label // dimension with a different mix between preset and variable labels. for _, labelName := range variableLabels { if !checkLabelName(labelName) { - d.err = fmt.Errorf("%q is not a valid label name for metric %q", labelName, fqName) + d.err = fmt.Errorf("%q is not a valid label name", labelName) return d } labelNames = append(labelNames, "$"+labelName) @@ -125,7 +142,6 @@ func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) * d.err = errors.New("duplicate label names") return d } - vh := hashNew() for _, val := range labelValues { vh = hashAdd(vh, val) @@ -152,7 +168,7 @@ func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) * Value: proto.String(v), }) } - sort.Sort(labelPairSorter(d.constLabelPairs)) + sort.Sort(LabelPairSorter(d.constLabelPairs)) return d } @@ -182,3 +198,8 @@ func (d *Desc) String() string { d.variableLabels, ) } + +func checkLabelName(l string) bool { + return labelNameRE.MatchString(l) && + !strings.HasPrefix(l, reservedLabelPrefix) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/doc.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/doc.go similarity index 66% rename from vendor/github.com/prometheus/client_golang/prometheus/doc.go rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/doc.go index 5d9525def..b062af9eb 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/doc.go +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/doc.go @@ -11,15 +11,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package prometheus is the core instrumentation package. It provides metrics -// primitives to instrument code for monitoring. It also offers a registry for -// metrics. Sub-packages allow to expose the registered metrics via HTTP -// (package promhttp) or push them to a Pushgateway (package push). There is -// also a sub-package promauto, which provides metrics constructors with -// automatic registration. +// Package prometheus provides metrics primitives to instrument code for +// monitoring. It also offers a registry for metrics. Sub-packages allow to +// expose the registered metrics via HTTP (package promhttp) or push them to a +// Pushgateway (package push). // // All exported functions and methods are safe to be used concurrently unless -// specified otherwise. +//specified otherwise. // // A Basic Example // @@ -28,11 +26,10 @@ // package main // // import ( -// "log" // "net/http" // -// "github.com/prometheus/client_golang/prometheus" -// "github.com/prometheus/client_golang/prometheus/promhttp" +// "github.com/m3db/prometheus_client_golang/prometheus" +// "github.com/m3db/prometheus_client_golang/prometheus/promhttp" // ) // // var ( @@ -62,7 +59,7 @@ // // The Handler function provides a default handler to expose metrics // // via an HTTP server. "/metrics" is the usual endpoint for that. // http.Handle("/metrics", promhttp.Handler()) -// log.Fatal(http.ListenAndServe(":8080", nil)) +// http.ListenAndServe(":8080", nil) // } // // @@ -72,12 +69,9 @@ // Metrics // // The number of exported identifiers in this package might appear a bit -// overwhelming. However, in addition to the basic plumbing shown in the example +// overwhelming. Hovever, in addition to the basic plumbing shown in the example // above, you only need to understand the different metric types and their -// vector versions for basic usage. Furthermore, if you are not concerned with -// fine-grained control of when and how to register metrics with the registry, -// have a look at the promauto package, which will effectively allow you to -// ignore registration altogether in simple cases. +// vector versions for basic usage. // // Above, you have already touched the Counter and the Gauge. There are two more // advanced metric types: the Summary and Histogram. A more thorough description @@ -101,8 +95,8 @@ // SummaryVec, HistogramVec, and UntypedVec are not. // // To create instances of Metrics and their vector versions, you need a suitable -// …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, HistogramOpts, or -// UntypedOpts. +// …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, +// HistogramOpts, or UntypedOpts. // // Custom Collectors and constant Metrics // @@ -120,18 +114,8 @@ // Metric instances “on the fly” using NewConstMetric, NewConstHistogram, and // NewConstSummary (and their respective Must… versions). That will happen in // the Collect method. The Describe method has to return separate Desc -// instances, representative of the “throw-away” metrics to be created later. -// NewDesc comes in handy to create those Desc instances. Alternatively, you -// could return no Desc at all, which will marke the Collector “unchecked”. No -// checks are porformed at registration time, but metric consistency will still -// be ensured at scrape time, i.e. any inconsistencies will lead to scrape -// errors. Thus, with unchecked Collectors, the responsibility to not collect -// metrics that lead to inconsistencies in the total scrape result lies with the -// implementer of the Collector. While this is not a desirable state, it is -// sometimes necessary. The typical use case is a situatios where the exact -// metrics to be returned by a Collector cannot be predicted at registration -// time, but the implementer has sufficient knowledge of the whole system to -// guarantee metric consistency. +// instances, representative of the “throw-away” metrics to be created +// later. NewDesc comes in handy to create those Desc instances. // // The Collector example illustrates the use case. You can also look at the // source code of the processCollector (mirroring process metrics), the @@ -145,34 +129,34 @@ // Advanced Uses of the Registry // // While MustRegister is the by far most common way of registering a Collector, -// sometimes you might want to handle the errors the registration might cause. -// As suggested by the name, MustRegister panics if an error occurs. With the -// Register function, the error is returned and can be handled. +// sometimes you might want to handle the errors the registration might +// cause. As suggested by the name, MustRegister panics if an error occurs. With +// the Register function, the error is returned and can be handled. // // An error is returned if the registered Collector is incompatible or // inconsistent with already registered metrics. The registry aims for -// consistency of the collected metrics according to the Prometheus data model. -// Inconsistencies are ideally detected at registration time, not at collect -// time. The former will usually be detected at start-up time of a program, -// while the latter will only happen at scrape time, possibly not even on the -// first scrape if the inconsistency only becomes relevant later. That is the -// main reason why a Collector and a Metric have to describe themselves to the -// registry. +// consistency of the collected metrics according to the Prometheus data +// model. Inconsistencies are ideally detected at registration time, not at +// collect time. The former will usually be detected at start-up time of a +// program, while the latter will only happen at scrape time, possibly not even +// on the first scrape if the inconsistency only becomes relevant later. That is +// the main reason why a Collector and a Metric have to describe themselves to +// the registry. // // So far, everything we did operated on the so-called default registry, as it -// can be found in the global DefaultRegisterer variable. With NewRegistry, you +// can be found in the global DefaultRegistry variable. With NewRegistry, you // can create a custom registry, or you can even implement the Registerer or -// Gatherer interfaces yourself. The methods Register and Unregister work in the -// same way on a custom registry as the global functions Register and Unregister -// on the default registry. -// -// There are a number of uses for custom registries: You can use registries with -// special properties, see NewPedanticRegistry. You can avoid global state, as -// it is imposed by the DefaultRegisterer. You can use multiple registries at -// the same time to expose different metrics in different ways. You can use +// Gatherer interfaces yourself. The methods Register and Unregister work in +// the same way on a custom registry as the global functions Register and +// Unregister on the default registry. +// +// There are a number of uses for custom registries: You can use registries +// with special properties, see NewPedanticRegistry. You can avoid global state, +// as it is imposed by the DefaultRegistry. You can use multiple registries at +// the same time to expose different metrics in different ways. You can use // separate registries for testing purposes. // -// Also note that the DefaultRegisterer comes registered with a Collector for Go +// Also note that the DefaultRegistry comes registered with a Collector for Go // runtime metrics (via NewGoCollector) and a Collector for process metrics (via // NewProcessCollector). With a custom registry, you are in control and decide // yourself about the Collectors to register. @@ -182,20 +166,16 @@ // The Registry implements the Gatherer interface. The caller of the Gather // method can then expose the gathered metrics in some way. Usually, the metrics // are served via HTTP on the /metrics endpoint. That's happening in the example -// above. The tools to expose metrics via HTTP are in the promhttp sub-package. -// (The top-level functions in the prometheus package are deprecated.) +// above. The tools to expose metrics via HTTP are in the promhttp +// sub-package. (The top-level functions in the prometheus package are +// deprecated.) // // Pushing to the Pushgateway // // Function for pushing to the Pushgateway can be found in the push sub-package. // -// Graphite Bridge -// -// Functions and examples to push metrics from a Gatherer to Graphite can be -// found in the graphite sub-package. -// // Other Means of Exposition // -// More ways of exposing metrics can easily be added by following the approaches -// of the existing implementations. +// More ways of exposing metrics can easily be added. Sending metrics to +// Graphite would be an example that will soon be implemented. package prometheus diff --git a/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/expvar_collector.go similarity index 100% rename from vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/expvar_collector.go diff --git a/vendor/github.com/prometheus/client_golang/prometheus/fnv.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/fnv.go similarity index 50% rename from vendor/github.com/prometheus/client_golang/prometheus/fnv.go rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/fnv.go index 3d383a735..e3b67df8a 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/fnv.go +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/fnv.go @@ -1,16 +1,3 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package prometheus // Inline and byte-free variant of hash/fnv's fnv64a. diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/gauge.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/gauge.go new file mode 100644 index 000000000..8b70e5141 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/gauge.go @@ -0,0 +1,140 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Gauge is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// A Gauge is typically used for measured values like temperatures or current +// memory usage, but also "counts" that can go up and down, like the number of +// running goroutines. +// +// To create Gauge instances, use NewGauge. +type Gauge interface { + Metric + Collector + + // Set sets the Gauge to an arbitrary value. + Set(float64) + // Inc increments the Gauge by 1. + Inc() + // Dec decrements the Gauge by 1. + Dec() + // Add adds the given value to the Gauge. (The value can be + // negative, resulting in a decrease of the Gauge.) + Add(float64) + // Sub subtracts the given value from the Gauge. (The value can be + // negative, resulting in an increase of the Gauge.) + Sub(float64) +} + +// GaugeOpts is an alias for Opts. See there for doc comments. +type GaugeOpts Opts + +// NewGauge creates a new Gauge based on the provided GaugeOpts. +func NewGauge(opts GaugeOpts) Gauge { + return newValue(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, 0) +} + +// GaugeVec is a Collector that bundles a set of Gauges that all share the same +// Desc, but have different values for their variable labels. This is used if +// you want to count the same thing partitioned by various dimensions +// (e.g. number of operations queued, partitioned by user and operation +// type). Create instances with NewGaugeVec. +type GaugeVec struct { + *MetricVec +} + +// NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &GaugeVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newValue(desc, GaugeValue, 0, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Gauge and not a +// Metric so that no type conversion is required. +func (m *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Gauge and not a Metric so that no +// type conversion is required. +func (m *GaugeVec) GetMetricWith(labels Labels) (Gauge, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *GaugeVec) WithLabelValues(lvs ...string) Gauge { + return m.MetricVec.WithLabelValues(lvs...).(Gauge) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *GaugeVec) With(labels Labels) Gauge { + return m.MetricVec.With(labels).(Gauge) +} + +// GaugeFunc is a Gauge whose value is determined at collect time by calling a +// provided function. +// +// To create GaugeFunc instances, use NewGaugeFunc. +type GaugeFunc interface { + Metric + Collector +} + +// NewGaugeFunc creates a new GaugeFunc based on the provided GaugeOpts. The +// value reported is determined by calling the given function from within the +// Write method. Take into account that metric collection may happen +// concurrently. If that results in concurrent calls to Write, like in the case +// where a GaugeFunc is directly registered with Prometheus, the provided +// function must be concurrency-safe. +func NewGaugeFunc(opts GaugeOpts, function func() float64) GaugeFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, function) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/go_collector.go similarity index 75% rename from vendor/github.com/prometheus/client_golang/prometheus/go_collector.go rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/go_collector.go index ba3b9333e..abc9d4ec4 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/go_collector.go @@ -1,16 +1,3 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package prometheus import ( @@ -21,39 +8,26 @@ import ( ) type goCollector struct { - goroutinesDesc *Desc - threadsDesc *Desc - gcDesc *Desc - goInfoDesc *Desc + goroutines Gauge + gcDesc *Desc // metrics to describe and collect metrics memStatsMetrics } -// NewGoCollector returns a collector which exports metrics about the current Go -// process. This includes memory stats. To collect those, runtime.ReadMemStats -// is called. This causes a stop-the-world, which is very short with Go1.9+ -// (~25µs). However, with older Go versions, the stop-the-world duration depends -// on the heap size and can be quite significant (~1.7 ms/GiB as per -// https://go-review.googlesource.com/c/go/+/34937). +// NewGoCollector returns a collector which exports metrics about the current +// go process. func NewGoCollector() Collector { return &goCollector{ - goroutinesDesc: NewDesc( - "go_goroutines", - "Number of goroutines that currently exist.", - nil, nil), - threadsDesc: NewDesc( - "go_threads", - "Number of OS threads created.", - nil, nil), + goroutines: NewGauge(GaugeOpts{ + Namespace: "go", + Name: "goroutines", + Help: "Number of goroutines that currently exist.", + }), gcDesc: NewDesc( "go_gc_duration_seconds", "A summary of the GC invocation durations.", nil, nil), - goInfoDesc: NewDesc( - "go_info", - "Information about the Go environment.", - nil, Labels{"version": runtime.Version()}), metrics: memStatsMetrics{ { desc: NewDesc( @@ -74,7 +48,7 @@ func NewGoCollector() Collector { }, { desc: NewDesc( memstatNamespace("sys_bytes"), - "Number of bytes obtained from system.", + "Number of bytes obtained by system. Sum of all system allocations.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.Sys) }, @@ -137,12 +111,12 @@ func NewGoCollector() Collector { valType: GaugeValue, }, { desc: NewDesc( - memstatNamespace("heap_released_bytes"), - "Number of heap bytes released to OS.", + memstatNamespace("heap_released_bytes_total"), + "Total number of heap bytes released to OS.", nil, nil, ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapReleased) }, - valType: GaugeValue, + valType: CounterValue, }, { desc: NewDesc( memstatNamespace("heap_objects"), @@ -239,14 +213,6 @@ func NewGoCollector() Collector { ), eval: func(ms *runtime.MemStats) float64 { return float64(ms.LastGC) / 1e9 }, valType: GaugeValue, - }, { - desc: NewDesc( - memstatNamespace("gc_cpu_fraction"), - "The fraction of this program's available CPU time used by the GC since the program started.", - nil, nil, - ), - eval: func(ms *runtime.MemStats) float64 { return ms.GCCPUFraction }, - valType: GaugeValue, }, }, } @@ -258,10 +224,9 @@ func memstatNamespace(s string) string { // Describe returns all descriptions of the collector. func (c *goCollector) Describe(ch chan<- *Desc) { - ch <- c.goroutinesDesc - ch <- c.threadsDesc + ch <- c.goroutines.Desc() ch <- c.gcDesc - ch <- c.goInfoDesc + for _, i := range c.metrics { ch <- i.desc } @@ -269,9 +234,8 @@ func (c *goCollector) Describe(ch chan<- *Desc) { // Collect returns the current state of all metrics of the collector. func (c *goCollector) Collect(ch chan<- Metric) { - ch <- MustNewConstMetric(c.goroutinesDesc, GaugeValue, float64(runtime.NumGoroutine())) - n, _ := runtime.ThreadCreateProfile(nil) - ch <- MustNewConstMetric(c.threadsDesc, GaugeValue, float64(n)) + c.goroutines.Set(float64(runtime.NumGoroutine())) + ch <- c.goroutines var stats debug.GCStats stats.PauseQuantiles = make([]time.Duration, 5) @@ -282,9 +246,7 @@ func (c *goCollector) Collect(ch chan<- Metric) { quantiles[float64(idx+1)/float64(len(stats.PauseQuantiles)-1)] = pq.Seconds() } quantiles[0.0] = stats.PauseQuantiles[0].Seconds() - ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), stats.PauseTotal.Seconds(), quantiles) - - ch <- MustNewConstMetric(c.goInfoDesc, GaugeValue, 1) + ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), float64(stats.PauseTotal.Seconds()), quantiles) ms := &runtime.MemStats{} runtime.ReadMemStats(ms) diff --git a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/histogram.go similarity index 50% rename from vendor/github.com/prometheus/client_golang/prometheus/histogram.go rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/histogram.go index f88da707b..31c3e707c 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/histogram.go @@ -16,14 +16,12 @@ package prometheus import ( "fmt" "math" - "runtime" "sort" - "sync" "sync/atomic" "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" + dto "github.com/m3db/prometheus_client_model/go" ) // A Histogram counts individual observations from an event or sample stream in @@ -110,9 +108,8 @@ func ExponentialBuckets(start, factor float64, count int) []float64 { } // HistogramOpts bundles the options for creating a Histogram metric. It is -// mandatory to set Name to a non-empty string. All other fields are optional -// and can safely be left at their zero value, although it is strongly -// encouraged to set a Help string. +// mandatory to set Name and Help to a non-empty string. All other fields are +// optional and can safely be left at their zero value. type HistogramOpts struct { // Namespace, Subsystem, and Name are components of the fully-qualified // name of the Histogram (created by joining these components with @@ -123,22 +120,29 @@ type HistogramOpts struct { Subsystem string Name string - // Help provides information about this Histogram. + // Help provides information about this Histogram. Mandatory! // // Metrics with the same fully-qualified name must have the same Help // string. Help string - // ConstLabels are used to attach fixed labels to this metric. Metrics - // with the same fully-qualified name must have the same label names in - // their ConstLabels. + // ConstLabels are used to attach fixed labels to this + // Histogram. Histograms with the same fully-qualified name must have the + // same label names in their ConstLabels. // - // ConstLabels are only used rarely. In particular, do not use them to - // attach the same labels to all your metrics. Those use cases are - // better covered by target labels set by the scraping Prometheus - // server, or by one specific metric (e.g. a build_info or a - // machine_role metric). See also - // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels,-not-static-scraped-labels + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a + // HistogramVec. ConstLabels serve only special purposes. One is for the + // special case where the value of a label does not change during the + // lifetime of a process, e.g. if the revision of the running binary is + // put into a label. Another, more advanced purpose is if more than one + // Collector needs to collect Histograms with the same fully-qualified + // name. In that case, those Summaries must differ in the values of + // their ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). ConstLabels Labels // Buckets defines the buckets into which observations are counted. Each @@ -165,7 +169,7 @@ func NewHistogram(opts HistogramOpts) Histogram { func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { if len(desc.variableLabels) != len(labelValues) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, labelValues)) + panic(errInconsistentCardinality) } for _, n := range desc.variableLabels { @@ -187,7 +191,6 @@ func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogr desc: desc, upperBounds: opts.Buckets, labelPairs: makeLabelPairs(desc, labelValues), - counts: [2]*histogramCounts{&histogramCounts{}, &histogramCounts{}}, } for i, upperBound := range h.upperBounds { if i < len(h.upperBounds)-1 { @@ -204,53 +207,28 @@ func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogr } } } - // Finally we know the final length of h.upperBounds and can make counts - // for both states: - h.counts[0].buckets = make([]uint64, len(h.upperBounds)) - h.counts[1].buckets = make([]uint64, len(h.upperBounds)) + // Finally we know the final length of h.upperBounds and can make counts. + h.counts = make([]uint64, len(h.upperBounds)) h.init(h) // Init self-collection. return h } -type histogramCounts struct { +type histogram struct { // sumBits contains the bits of the float64 representing the sum of all // observations. sumBits and count have to go first in the struct to // guarantee alignment for atomic operations. // http://golang.org/pkg/sync/atomic/#pkg-note-BUG sumBits uint64 count uint64 - buckets []uint64 -} - -type histogram struct { - // countAndHotIdx is a complicated one. For lock-free yet atomic - // observations, we need to save the total count of observations again, - // combined with the index of the currently-hot counts struct, so that - // we can perform the operation on both values atomically. The least - // significant bit defines the hot counts struct. The remaining 63 bits - // represent the total count of observations. This happens under the - // assumption that the 63bit count will never overflow. Rationale: An - // observations takes about 30ns. Let's assume it could happen in - // 10ns. Overflowing the counter will then take at least (2^63)*10ns, - // which is about 3000 years. - // - // This has to be first in the struct for 64bit alignment. See - // http://golang.org/pkg/sync/atomic/#pkg-note-BUG - countAndHotIdx uint64 selfCollector - desc *Desc - writeMtx sync.Mutex // Only used in the Write method. + // Note that there is no mutex required. - upperBounds []float64 + desc *Desc - // Two counts, one is "hot" for lock-free observations, the other is - // "cold" for writing out a dto.Metric. It has to be an array of - // pointers to guarantee 64bit alignment of the histogramCounts, see - // http://golang.org/pkg/sync/atomic/#pkg-note-BUG. - counts [2]*histogramCounts - hotIdx int // Index of currently-hot counts. Only used within Write. + upperBounds []float64 + counts []uint64 labelPairs []*dto.LabelPair } @@ -270,113 +248,36 @@ func (h *histogram) Observe(v float64) { // 100 buckets: 78.1 ns/op linear - binary 54.9 ns/op // 300 buckets: 154 ns/op linear - binary 61.6 ns/op i := sort.SearchFloat64s(h.upperBounds, v) - - // We increment h.countAndHotIdx by 2 so that the counter in the upper - // 63 bits gets incremented by 1. At the same time, we get the new value - // back, which we can use to find the currently-hot counts. - n := atomic.AddUint64(&h.countAndHotIdx, 2) - hotCounts := h.counts[n%2] - - if i < len(h.upperBounds) { - atomic.AddUint64(&hotCounts.buckets[i], 1) + if i < len(h.counts) { + atomic.AddUint64(&h.counts[i], 1) } + atomic.AddUint64(&h.count, 1) for { - oldBits := atomic.LoadUint64(&hotCounts.sumBits) + oldBits := atomic.LoadUint64(&h.sumBits) newBits := math.Float64bits(math.Float64frombits(oldBits) + v) - if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { + if atomic.CompareAndSwapUint64(&h.sumBits, oldBits, newBits) { break } } - // Increment count last as we take it as a signal that the observation - // is complete. - atomic.AddUint64(&hotCounts.count, 1) } func (h *histogram) Write(out *dto.Metric) error { - var ( - his = &dto.Histogram{} - buckets = make([]*dto.Bucket, len(h.upperBounds)) - hotCounts, coldCounts *histogramCounts - count uint64 - ) - - // For simplicity, we mutex the rest of this method. It is not in the - // hot path, i.e. Observe is called much more often than Write. The - // complication of making Write lock-free isn't worth it. - h.writeMtx.Lock() - defer h.writeMtx.Unlock() - - // This is a bit arcane, which is why the following spells out this if - // clause in English: - // - // If the currently-hot counts struct is #0, we atomically increment - // h.countAndHotIdx by 1 so that from now on Observe will use the counts - // struct #1. Furthermore, the atomic increment gives us the new value, - // which, in its most significant 63 bits, tells us the count of - // observations done so far up to and including currently ongoing - // observations still using the counts struct just changed from hot to - // cold. To have a normal uint64 for the count, we bitshift by 1 and - // save the result in count. We also set h.hotIdx to 1 for the next - // Write call, and we will refer to counts #1 as hotCounts and to counts - // #0 as coldCounts. - // - // If the currently-hot counts struct is #1, we do the corresponding - // things the other way round. We have to _decrement_ h.countAndHotIdx - // (which is a bit arcane in itself, as we have to express -1 with an - // unsigned int...). - if h.hotIdx == 0 { - count = atomic.AddUint64(&h.countAndHotIdx, 1) >> 1 - h.hotIdx = 1 - hotCounts = h.counts[1] - coldCounts = h.counts[0] - } else { - count = atomic.AddUint64(&h.countAndHotIdx, ^uint64(0)) >> 1 // Decrement. - h.hotIdx = 0 - hotCounts = h.counts[0] - coldCounts = h.counts[1] - } - - // Now we have to wait for the now-declared-cold counts to actually cool - // down, i.e. wait for all observations still using it to finish. That's - // the case once the count in the cold counts struct is the same as the - // one atomically retrieved from the upper 63bits of h.countAndHotIdx. - for { - if count == atomic.LoadUint64(&coldCounts.count) { - break - } - runtime.Gosched() // Let observations get work done. - } + his := &dto.Histogram{} + buckets := make([]*dto.Bucket, len(h.upperBounds)) - his.SampleCount = proto.Uint64(count) - his.SampleSum = proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))) - var cumCount uint64 + his.SampleSum = proto.Float64(math.Float64frombits(atomic.LoadUint64(&h.sumBits))) + his.SampleCount = proto.Uint64(atomic.LoadUint64(&h.count)) + var count uint64 for i, upperBound := range h.upperBounds { - cumCount += atomic.LoadUint64(&coldCounts.buckets[i]) + count += atomic.LoadUint64(&h.counts[i]) buckets[i] = &dto.Bucket{ - CumulativeCount: proto.Uint64(cumCount), + CumulativeCount: proto.Uint64(count), UpperBound: proto.Float64(upperBound), } } - his.Bucket = buckets out.Histogram = his out.Label = h.labelPairs - - // Finally add all the cold counts to the new hot counts and reset the cold counts. - atomic.AddUint64(&hotCounts.count, count) - atomic.StoreUint64(&coldCounts.count, 0) - for { - oldBits := atomic.LoadUint64(&hotCounts.sumBits) - newBits := math.Float64bits(math.Float64frombits(oldBits) + his.GetSampleSum()) - if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { - atomic.StoreUint64(&coldCounts.sumBits, 0) - break - } - } - for i := range h.upperBounds { - atomic.AddUint64(&hotCounts.buckets[i], atomic.LoadUint64(&coldCounts.buckets[i])) - atomic.StoreUint64(&coldCounts.buckets[i], 0) - } return nil } @@ -386,11 +287,12 @@ func (h *histogram) Write(out *dto.Metric) error { // (e.g. HTTP request latencies, partitioned by status code and method). Create // instances with NewHistogramVec. type HistogramVec struct { - *metricVec + *MetricVec } // NewHistogramVec creates a new HistogramVec based on the provided HistogramOpts and -// partitioned by the given label names. +// partitioned by the given label names. At least one label name must be +// provided. func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { desc := NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), @@ -399,116 +301,47 @@ func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { opts.ConstLabels, ) return &HistogramVec{ - metricVec: newMetricVec(desc, func(lvs ...string) Metric { + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { return newHistogram(desc, opts, lvs...) }), } } -// GetMetricWithLabelValues returns the Histogram for the given slice of label -// values (same order as the VariableLabels in Desc). If that combination of -// label values is accessed for the first time, a new Histogram is created. -// -// It is possible to call this method without using the returned Histogram to only -// create the new Histogram but leave it at its starting value, a Histogram without -// any observations. -// -// Keeping the Histogram for later use is possible (and should be considered if -// performance is critical), but keep in mind that Reset, DeleteLabelValues and -// Delete can be used to delete the Histogram from the HistogramVec. In that case, the -// Histogram will still exist, but it will not be exported anymore, even if a -// Histogram with the same label values is created later. See also the CounterVec -// example. -// -// An error is returned if the number of label values is not the same as the -// number of VariableLabels in Desc (minus any curried labels). -// -// Note that for more than one label value, this method is prone to mistakes -// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as -// an alternative to avoid that type of mistake. For higher label numbers, the -// latter has a much more readable (albeit more verbose) syntax, but it comes -// with a performance overhead (for creating and processing the Labels map). -// See also the GaugeVec example. -func (v *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) { - metric, err := v.metricVec.getMetricWithLabelValues(lvs...) +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Histogram and not a +// Metric so that no type conversion is required. +func (m *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Histogram, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) if metric != nil { - return metric.(Observer), err + return metric.(Histogram), err } return nil, err } -// GetMetricWith returns the Histogram for the given Labels map (the label names -// must match those of the VariableLabels in Desc). If that label map is -// accessed for the first time, a new Histogram is created. Implications of -// creating a Histogram without using it and keeping the Histogram for later use -// are the same as for GetMetricWithLabelValues. -// -// An error is returned if the number and names of the Labels are inconsistent -// with those of the VariableLabels in Desc (minus any curried labels). -// -// This method is used for the same purpose as -// GetMetricWithLabelValues(...string). See there for pros and cons of the two -// methods. -func (v *HistogramVec) GetMetricWith(labels Labels) (Observer, error) { - metric, err := v.metricVec.getMetricWith(labels) +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Histogram and not a Metric so that no +// type conversion is required. +func (m *HistogramVec) GetMetricWith(labels Labels) (Histogram, error) { + metric, err := m.MetricVec.GetMetricWith(labels) if metric != nil { - return metric.(Observer), err + return metric.(Histogram), err } return nil, err } // WithLabelValues works as GetMetricWithLabelValues, but panics where -// GetMetricWithLabelValues would have returned an error. Not returning an -// error allows shortcuts like +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like // myVec.WithLabelValues("404", "GET").Observe(42.21) -func (v *HistogramVec) WithLabelValues(lvs ...string) Observer { - h, err := v.GetMetricWithLabelValues(lvs...) - if err != nil { - panic(err) - } - return h -} - -// With works as GetMetricWith but panics where GetMetricWithLabels would have -// returned an error. Not returning an error allows shortcuts like -// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Observe(42.21) -func (v *HistogramVec) With(labels Labels) Observer { - h, err := v.GetMetricWith(labels) - if err != nil { - panic(err) - } - return h -} - -// CurryWith returns a vector curried with the provided labels, i.e. the -// returned vector has those labels pre-set for all labeled operations performed -// on it. The cardinality of the curried vector is reduced accordingly. The -// order of the remaining labels stays the same (just with the curried labels -// taken out of the sequence – which is relevant for the -// (GetMetric)WithLabelValues methods). It is possible to curry a curried -// vector, but only with labels not yet used for currying before. -// -// The metrics contained in the HistogramVec are shared between the curried and -// uncurried vectors. They are just accessed differently. Curried and uncurried -// vectors behave identically in terms of collection. Only one must be -// registered with a given registry (usually the uncurried version). The Reset -// method deletes all metrics, even if called on a curried vector. -func (v *HistogramVec) CurryWith(labels Labels) (ObserverVec, error) { - vec, err := v.curryWith(labels) - if vec != nil { - return &HistogramVec{vec}, err - } - return nil, err +func (m *HistogramVec) WithLabelValues(lvs ...string) Histogram { + return m.MetricVec.WithLabelValues(lvs...).(Histogram) } -// MustCurryWith works as CurryWith but panics where CurryWith would have -// returned an error. -func (v *HistogramVec) MustCurryWith(labels Labels) ObserverVec { - vec, err := v.CurryWith(labels) - if err != nil { - panic(err) - } - return vec +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (m *HistogramVec) With(labels Labels) Histogram { + return m.MetricVec.With(labels).(Histogram) } type constHistogram struct { @@ -560,7 +393,7 @@ func (h *constHistogram) Write(out *dto.Metric) error { // bucket. // // NewConstHistogram returns an error if the length of labelValues is not -// consistent with the variable labels in Desc or if Desc is invalid. +// consistent with the variable labels in Desc. func NewConstHistogram( desc *Desc, count uint64, @@ -568,11 +401,8 @@ func NewConstHistogram( buckets map[float64]uint64, labelValues ...string, ) (Metric, error) { - if desc.err != nil { - return nil, desc.err - } - if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { - return nil, err + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality } return &constHistogram{ desc: desc, diff --git a/vendor/github.com/prometheus/client_golang/prometheus/http.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/http.go similarity index 69% rename from vendor/github.com/prometheus/client_golang/prometheus/http.go rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/http.go index 9f0875bfc..a8e5c6356 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/http.go +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/http.go @@ -15,7 +15,9 @@ package prometheus import ( "bufio" + "bytes" "compress/gzip" + "fmt" "io" "net" "net/http" @@ -24,7 +26,7 @@ import ( "sync" "time" - "github.com/prometheus/common/expfmt" + "github.com/m3db/prometheus_common/expfmt" ) // TODO(beorn7): Remove this whole file. It is a partial mirror of @@ -39,10 +41,19 @@ const ( acceptEncodingHeader = "Accept-Encoding" ) -var gzipPool = sync.Pool{ - New: func() interface{} { - return gzip.NewWriter(nil) - }, +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) } // Handler returns an HTTP handler for the DefaultGatherer. It is @@ -50,50 +61,68 @@ var gzipPool = sync.Pool{ // name). // // Deprecated: Please note the issues described in the doc comment of -// InstrumentHandler. You might want to consider using promhttp.Handler instead. +// InstrumentHandler. You might want to consider using promhttp.Handler instead +// (which is non instrumented). func Handler() http.Handler { return InstrumentHandler("prometheus", UninstrumentedHandler()) } // UninstrumentedHandler returns an HTTP handler for the DefaultGatherer. // -// Deprecated: Use promhttp.HandlerFor(DefaultGatherer, promhttp.HandlerOpts{}) -// instead. See there for further documentation. +// Deprecated: Use promhttp.Handler instead. See there for further documentation. func UninstrumentedHandler() http.Handler { - return http.HandlerFunc(func(rsp http.ResponseWriter, req *http.Request) { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { mfs, err := DefaultGatherer.Gather() if err != nil { - httpError(rsp, err) + http.Error(w, "An error has occurred during metrics collection:\n\n"+err.Error(), http.StatusInternalServerError) return } contentType := expfmt.Negotiate(req.Header) - header := rsp.Header() - header.Set(contentTypeHeader, string(contentType)) - - w := io.Writer(rsp) - if gzipAccepted(req.Header) { - header.Set(contentEncodingHeader, "gzip") - gz := gzipPool.Get().(*gzip.Writer) - defer gzipPool.Put(gz) - - gz.Reset(w) - defer gz.Close() - - w = gz - } - - enc := expfmt.NewEncoder(w, contentType) - + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error for _, mf := range mfs { if err := enc.Encode(mf); err != nil { - httpError(rsp, err) + lastErr = err + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) return } } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + w.Write(buf.Bytes()) }) } +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer) (io.Writer, string) { + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part := strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} + var instLabels = []string{"method", "code"} type nower interface { @@ -110,6 +139,16 @@ var now nower = nowFunc(func() time.Time { return time.Now() }) +func nowSeries(t ...time.Time) nower { + return nowFunc(func() time.Time { + defer func() { + t = t[1:] + }() + + return t[0] + }) +} + // InstrumentHandler wraps the given HTTP handler for instrumentation. It // registers four metric collectors (if not already done) and reports HTTP // metrics to the (newly or already) registered collectors: http_requests_total @@ -119,16 +158,23 @@ var now nower = nowFunc(func() time.Time { // value. http_requests_total is a metric vector partitioned by HTTP method // (label name "method") and HTTP status code (label name "code"). // -// Deprecated: InstrumentHandler has several issues. Use the tooling provided in -// package promhttp instead. The issues are the following: (1) It uses Summaries -// rather than Histograms. Summaries are not useful if aggregation across -// multiple instances is required. (2) It uses microseconds as unit, which is -// deprecated and should be replaced by seconds. (3) The size of the request is -// calculated in a separate goroutine. Since this calculator requires access to -// the request header, it creates a race with any writes to the header performed -// during request handling. httputil.ReverseProxy is a prominent example for a -// handler performing such writes. (4) It has additional issues with HTTP/2, cf. -// https://github.com/prometheus/client_golang/issues/272. +// Deprecated: InstrumentHandler has several issues: +// +// - It uses Summaries rather than Histograms. Summaries are not useful if +// aggregation across multiple instances is required. +// +// - It uses microseconds as unit, which is deprecated and should be replaced by +// seconds. +// +// - The size of the request is calculated in a separate goroutine. Since this +// calculator requires access to the request header, it creates a race with +// any writes to the header performed during request handling. +// httputil.ReverseProxy is a prominent example for a handler +// performing such writes. +// +// Upcoming versions of this package will provide ways of instrumenting HTTP +// handlers that are more flexible and have fewer issues. Please prefer direct +// instrumentation in the meantime. func InstrumentHandler(handlerName string, handler http.Handler) http.HandlerFunc { return InstrumentHandlerFunc(handlerName, handler.ServeHTTP) } @@ -138,13 +184,12 @@ func InstrumentHandler(handlerName string, handler http.Handler) http.HandlerFun // issues). // // Deprecated: InstrumentHandlerFunc is deprecated for the same reasons as -// InstrumentHandler is. Use the tooling provided in package promhttp instead. +// InstrumentHandler is. func InstrumentHandlerFunc(handlerName string, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { return InstrumentHandlerFuncWithOpts( SummaryOpts{ Subsystem: "http", ConstLabels: Labels{"handler": handlerName}, - Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, }, handlerFunc, ) @@ -177,7 +222,7 @@ func InstrumentHandlerFunc(handlerName string, handlerFunc func(http.ResponseWri // SummaryOpts. // // Deprecated: InstrumentHandlerWithOpts is deprecated for the same reasons as -// InstrumentHandler is. Use the tooling provided in package promhttp instead. +// InstrumentHandler is. func InstrumentHandlerWithOpts(opts SummaryOpts, handler http.Handler) http.HandlerFunc { return InstrumentHandlerFuncWithOpts(opts, handler.ServeHTTP) } @@ -188,7 +233,7 @@ func InstrumentHandlerWithOpts(opts SummaryOpts, handler http.Handler) http.Hand // SummaryOpts are used. // // Deprecated: InstrumentHandlerFuncWithOpts is deprecated for the same reasons -// as InstrumentHandler is. Use the tooling provided in package promhttp instead. +// as InstrumentHandler is. func InstrumentHandlerFuncWithOpts(opts SummaryOpts, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { reqCnt := NewCounterVec( CounterOpts{ @@ -200,52 +245,34 @@ func InstrumentHandlerFuncWithOpts(opts SummaryOpts, handlerFunc func(http.Respo }, instLabels, ) - if err := Register(reqCnt); err != nil { - if are, ok := err.(AlreadyRegisteredError); ok { - reqCnt = are.ExistingCollector.(*CounterVec) - } else { - panic(err) - } - } opts.Name = "request_duration_microseconds" opts.Help = "The HTTP request latencies in microseconds." reqDur := NewSummary(opts) - if err := Register(reqDur); err != nil { - if are, ok := err.(AlreadyRegisteredError); ok { - reqDur = are.ExistingCollector.(Summary) - } else { - panic(err) - } - } opts.Name = "request_size_bytes" opts.Help = "The HTTP request sizes in bytes." reqSz := NewSummary(opts) - if err := Register(reqSz); err != nil { - if are, ok := err.(AlreadyRegisteredError); ok { - reqSz = are.ExistingCollector.(Summary) - } else { - panic(err) - } - } opts.Name = "response_size_bytes" opts.Help = "The HTTP response sizes in bytes." resSz := NewSummary(opts) - if err := Register(resSz); err != nil { - if are, ok := err.(AlreadyRegisteredError); ok { - resSz = are.ExistingCollector.(Summary) - } else { - panic(err) - } - } + + regReqCnt := MustRegisterOrGet(reqCnt).(*CounterVec) + regReqDur := MustRegisterOrGet(reqDur).(Summary) + regReqSz := MustRegisterOrGet(reqSz).(Summary) + regResSz := MustRegisterOrGet(resSz).(Summary) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { now := time.Now() delegate := &responseWriterDelegator{ResponseWriter: w} - out := computeApproximateRequestSize(r) + out := make(chan int) + urlLen := 0 + if r.URL != nil { + urlLen = len(r.URL.String()) + } + go computeApproximateRequestSize(r, out, urlLen) _, cn := w.(http.CloseNotifier) _, fl := w.(http.Flusher) @@ -263,52 +290,39 @@ func InstrumentHandlerFuncWithOpts(opts SummaryOpts, handlerFunc func(http.Respo method := sanitizeMethod(r.Method) code := sanitizeCode(delegate.status) - reqCnt.WithLabelValues(method, code).Inc() - reqDur.Observe(elapsed) - resSz.Observe(float64(delegate.written)) - reqSz.Observe(float64(<-out)) + regReqCnt.WithLabelValues(method, code).Inc() + regReqDur.Observe(elapsed) + regResSz.Observe(float64(delegate.written)) + regReqSz.Observe(float64(<-out)) }) } -func computeApproximateRequestSize(r *http.Request) <-chan int { - // Get URL length in current goroutine for avoiding a race condition. - // HandlerFunc that runs in parallel may modify the URL. - s := 0 - if r.URL != nil { - s += len(r.URL.String()) - } - - out := make(chan int, 1) - - go func() { - s += len(r.Method) - s += len(r.Proto) - for name, values := range r.Header { - s += len(name) - for _, value := range values { - s += len(value) - } +func computeApproximateRequestSize(r *http.Request, out chan int, s int) { + s += len(r.Method) + s += len(r.Proto) + for name, values := range r.Header { + s += len(name) + for _, value := range values { + s += len(value) } - s += len(r.Host) - - // N.B. r.Form and r.MultipartForm are assumed to be included in r.URL. + } + s += len(r.Host) - if r.ContentLength != -1 { - s += int(r.ContentLength) - } - out <- s - close(out) - }() + // N.B. r.Form and r.MultipartForm are assumed to be included in r.URL. - return out + if r.ContentLength != -1 { + s += int(r.ContentLength) + } + out <- s } type responseWriterDelegator struct { http.ResponseWriter - status int - written int64 - wroteHeader bool + handler, method string + status int + written int64 + wroteHeader bool } func (r *responseWriterDelegator) WriteHeader(code int) { @@ -474,31 +488,3 @@ func sanitizeCode(s int) string { return strconv.Itoa(s) } } - -// gzipAccepted returns whether the client will accept gzip-encoded content. -func gzipAccepted(header http.Header) bool { - a := header.Get(acceptEncodingHeader) - parts := strings.Split(a, ",") - for _, part := range parts { - part = strings.TrimSpace(part) - if part == "gzip" || strings.HasPrefix(part, "gzip;") { - return true - } - } - return false -} - -// httpError removes any content-encoding header and then calls http.Error with -// the provided error and http.StatusInternalServerErrer. Error contents is -// supposed to be uncompressed plain text. However, same as with a plain -// http.Error, any header settings will be void if the header has already been -// sent. The error message will still be written to the writer, but it will -// probably be of limited use. -func httpError(rsp http.ResponseWriter, err error) { - rsp.Header().Del(contentEncodingHeader) - http.Error( - rsp, - "An error has occurred while serving metrics:\n\n"+err.Error(), - http.StatusInternalServerError, - ) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/metric.go similarity index 67% rename from vendor/github.com/prometheus/client_golang/prometheus/metric.go rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/metric.go index 55e6d86d5..5ff2e6a28 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/metric.go +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/metric.go @@ -15,11 +15,8 @@ package prometheus import ( "strings" - "time" - "github.com/golang/protobuf/proto" - - dto "github.com/prometheus/client_model/go" + dto "github.com/m3db/prometheus_client_model/go" ) const separatorByte byte = 255 @@ -46,8 +43,9 @@ type Metric interface { // While populating dto.Metric, it is the responsibility of the // implementation to ensure validity of the Metric protobuf (like valid // UTF-8 strings or syntactically valid metric and label names). It is - // recommended to sort labels lexicographically. Callers of Write should - // still make sure of sorting if they depend on it. + // recommended to sort labels lexicographically. (Implementers may find + // LabelPairSorter useful for that.) Callers of Write should still make + // sure of sorting if they depend on it. Write(*dto.Metric) error // TODO(beorn7): The original rationale of passing in a pre-allocated // dto.Metric protobuf to save allocations has disappeared. The @@ -59,9 +57,8 @@ type Metric interface { // implementation XXX has its own XXXOpts type, but in most cases, it is just be // an alias of this type (which might change when the requirement arises.) // -// It is mandatory to set Name to a non-empty string. All other fields are -// optional and can safely be left at their zero value, although it is strongly -// encouraged to set a Help string. +// It is mandatory to set Name and Help to a non-empty string. All other fields +// are optional and can safely be left at their zero value. type Opts struct { // Namespace, Subsystem, and Name are components of the fully-qualified // name of the Metric (created by joining these components with @@ -72,7 +69,7 @@ type Opts struct { Subsystem string Name string - // Help provides information about this metric. + // Help provides information about this metric. Mandatory! // // Metrics with the same fully-qualified name must have the same Help // string. @@ -82,12 +79,20 @@ type Opts struct { // with the same fully-qualified name must have the same label names in // their ConstLabels. // - // ConstLabels are only used rarely. In particular, do not use them to - // attach the same labels to all your metrics. Those use cases are - // better covered by target labels set by the scraping Prometheus - // server, or by one specific metric (e.g. a build_info or a - // machine_role metric). See also - // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels,-not-static-scraped-labels + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a metric + // vector collector (like CounterVec, GaugeVec, UntypedVec). ConstLabels + // serve only special purposes. One is for the special case where the + // value of a label does not change during the lifetime of a process, + // e.g. if the revision of the running binary is put into a + // label. Another, more advanced purpose is if more than one Collector + // needs to collect Metrics with the same fully-qualified name. In that + // case, those Metrics must differ in the values of their + // ConstLabels. See the Collector examples. + // + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). ConstLabels Labels } @@ -113,22 +118,37 @@ func BuildFQName(namespace, subsystem, name string) string { return name } -// labelPairSorter implements sort.Interface. It is used to sort a slice of -// dto.LabelPair pointers. -type labelPairSorter []*dto.LabelPair +// LabelPairSorter implements sort.Interface. It is used to sort a slice of +// dto.LabelPair pointers. This is useful for implementing the Write method of +// custom metrics. +type LabelPairSorter []*dto.LabelPair -func (s labelPairSorter) Len() int { +func (s LabelPairSorter) Len() int { return len(s) } -func (s labelPairSorter) Swap(i, j int) { +func (s LabelPairSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s labelPairSorter) Less(i, j int) bool { +func (s LabelPairSorter) Less(i, j int) bool { return s[i].GetName() < s[j].GetName() } +type hashSorter []uint64 + +func (s hashSorter) Len() int { + return len(s) +} + +func (s hashSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s hashSorter) Less(i, j int) bool { + return s[i] < s[j] +} + type invalidMetric struct { desc *Desc err error @@ -144,31 +164,3 @@ func NewInvalidMetric(desc *Desc, err error) Metric { func (m *invalidMetric) Desc() *Desc { return m.desc } func (m *invalidMetric) Write(*dto.Metric) error { return m.err } - -type timestampedMetric struct { - Metric - t time.Time -} - -func (m timestampedMetric) Write(pb *dto.Metric) error { - e := m.Metric.Write(pb) - pb.TimestampMs = proto.Int64(m.t.Unix()*1000 + int64(m.t.Nanosecond()/1000000)) - return e -} - -// NewMetricWithTimestamp returns a new Metric wrapping the provided Metric in a -// way that it has an explicit timestamp set to the provided Time. This is only -// useful in rare cases as the timestamp of a Prometheus metric should usually -// be set by the Prometheus server during scraping. Exceptions include mirroring -// metrics with given timestamps from other metric -// sources. -// -// NewMetricWithTimestamp works best with MustNewConstMetric, -// MustNewConstHistogram, and MustNewConstSummary, see example. -// -// Currently, the exposition formats used by Prometheus are limited to -// millisecond resolution. Thus, the provided time will be rounded down to the -// next full millisecond value. -func NewMetricWithTimestamp(t time.Time, m Metric) Metric { - return timestampedMetric{Metric: m, t: t} -} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/process_collector.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/process_collector.go new file mode 100644 index 000000000..5c410e21f --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/process_collector.go @@ -0,0 +1,142 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import "github.com/m3db/prometheus_procfs" + +type processCollector struct { + pid int + collectFn func(chan<- Metric) + pidFn func() (int, error) + cpuTotal Counter + openFDs, maxFDs Gauge + vsize, rss Gauge + startTime Gauge +} + +// NewProcessCollector returns a collector which exports the current state of +// process metrics including cpu, memory and file descriptor usage as well as +// the process start time for the given process id under the given namespace. +func NewProcessCollector(pid int, namespace string) Collector { + return NewProcessCollectorPIDFn( + func() (int, error) { return pid, nil }, + namespace, + ) +} + +// NewProcessCollectorPIDFn returns a collector which exports the current state +// of process metrics including cpu, memory and file descriptor usage as well +// as the process start time under the given namespace. The given pidFn is +// called on each collect and is used to determine the process to export +// metrics for. +func NewProcessCollectorPIDFn( + pidFn func() (int, error), + namespace string, +) Collector { + c := processCollector{ + pidFn: pidFn, + collectFn: func(chan<- Metric) {}, + + cpuTotal: NewCounter(CounterOpts{ + Namespace: namespace, + Name: "process_cpu_seconds_total", + Help: "Total user and system CPU time spent in seconds.", + }), + openFDs: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_open_fds", + Help: "Number of open file descriptors.", + }), + maxFDs: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_max_fds", + Help: "Maximum number of open file descriptors.", + }), + vsize: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_virtual_memory_bytes", + Help: "Virtual memory size in bytes.", + }), + rss: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_resident_memory_bytes", + Help: "Resident memory size in bytes.", + }), + startTime: NewGauge(GaugeOpts{ + Namespace: namespace, + Name: "process_start_time_seconds", + Help: "Start time of the process since unix epoch in seconds.", + }), + } + + // Set up process metric collection if supported by the runtime. + if _, err := procfs.NewStat(); err == nil { + c.collectFn = c.processCollect + } + + return &c +} + +// Describe returns all descriptions of the collector. +func (c *processCollector) Describe(ch chan<- *Desc) { + ch <- c.cpuTotal.Desc() + ch <- c.openFDs.Desc() + ch <- c.maxFDs.Desc() + ch <- c.vsize.Desc() + ch <- c.rss.Desc() + ch <- c.startTime.Desc() +} + +// Collect returns the current state of all metrics of the collector. +func (c *processCollector) Collect(ch chan<- Metric) { + c.collectFn(ch) +} + +// TODO(ts): Bring back error reporting by reverting 7faf9e7 as soon as the +// client allows users to configure the error behavior. +func (c *processCollector) processCollect(ch chan<- Metric) { + pid, err := c.pidFn() + if err != nil { + return + } + + p, err := procfs.NewProc(pid) + if err != nil { + return + } + + if stat, err := p.NewStat(); err == nil { + c.cpuTotal.Set(stat.CPUTime()) + ch <- c.cpuTotal + c.vsize.Set(float64(stat.VirtualMemory())) + ch <- c.vsize + c.rss.Set(float64(stat.ResidentMemory())) + ch <- c.rss + + if startTime, err := stat.StartTime(); err == nil { + c.startTime.Set(startTime) + ch <- c.startTime + } + } + + if fds, err := p.FileDescriptorsLen(); err == nil { + c.openFDs.Set(float64(fds)) + ch <- c.openFDs + } + + if limits, err := p.NewLimits(); err == nil { + c.maxFDs.Set(float64(limits.OpenFiles)) + ch <- c.maxFDs + } +} diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/promhttp/http.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/promhttp/http.go new file mode 100644 index 000000000..45ac38a38 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/promhttp/http.go @@ -0,0 +1,201 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Copyright (c) 2013, The Prometheus Authors +// All rights reserved. +// +// Use of this source code is governed by a BSD-style license that can be found +// in the LICENSE file. + +// Package promhttp contains functions to create http.Handler instances to +// expose Prometheus metrics via HTTP. In later versions of this package, it +// will also contain tooling to instrument instances of http.Handler and +// http.RoundTripper. +// +// promhttp.Handler acts on the prometheus.DefaultGatherer. With HandlerFor, +// you can create a handler for a custom registry or anything that implements +// the Gatherer interface. It also allows to create handlers that act +// differently on errors or allow to log errors. +package promhttp + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "net/http" + "strings" + "sync" + + "github.com/m3db/prometheus_common/expfmt" + + "github.com/m3db/prometheus_client_golang/prometheus" +) + +const ( + contentTypeHeader = "Content-Type" + contentLengthHeader = "Content-Length" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" +) + +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) +} + +// Handler returns an HTTP handler for the prometheus.DefaultGatherer. The +// Handler uses the default HandlerOpts, i.e. report the first error as an HTTP +// error, no error logging, and compression if requested by the client. +// +// If you want to create a Handler for the DefaultGatherer with different +// HandlerOpts, create it with HandlerFor with prometheus.DefaultGatherer and +// your desired HandlerOpts. +func Handler() http.Handler { + return HandlerFor(prometheus.DefaultGatherer, HandlerOpts{}) +} + +// HandlerFor returns an http.Handler for the provided Gatherer. The behavior +// of the Handler is defined by the provided HandlerOpts. +func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + mfs, err := reg.Gather() + if err != nil { + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error gathering metrics:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + if len(mfs) == 0 { + http.Error(w, "No metrics gathered, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics gathering:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + + contentType := expfmt.Negotiate(req.Header) + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf, opts.DisableCompression) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + lastErr = err + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error encoding metric family:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + // Handled later. + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + w.Write(buf.Bytes()) + // TODO(beorn7): Consider streaming serving of metrics. + }) +} + +// HandlerErrorHandling defines how a Handler serving metrics will handle +// errors. +type HandlerErrorHandling int + +// These constants cause handlers serving metrics to behave as described if +// errors are encountered. +const ( + // Serve an HTTP status code 500 upon the first error + // encountered. Report the error message in the body. + HTTPErrorOnError HandlerErrorHandling = iota + // Ignore errors and try to serve as many metrics as possible. However, + // if no metrics can be served, serve an HTTP status code 500 and the + // last error message in the body. Only use this in deliberate "best + // effort" metrics collection scenarios. It is recommended to at least + // log errors (by providing an ErrorLog in HandlerOpts) to not mask + // errors completely. + ContinueOnError + // Panic upon the first error encountered (useful for "crash only" apps). + PanicOnError +) + +// Logger is the minimal interface HandlerOpts needs for logging. Note that +// log.Logger from the standard library implements this interface, and it is +// easy to implement by custom loggers, if they don't do so already anyway. +type Logger interface { + Println(v ...interface{}) +} + +// HandlerOpts specifies options how to serve metrics via an http.Handler. The +// zero value of HandlerOpts is a reasonable default. +type HandlerOpts struct { + // ErrorLog specifies an optional logger for errors collecting and + // serving metrics. If nil, errors are not logged at all. + ErrorLog Logger + // ErrorHandling defines how errors are handled. Note that errors are + // logged regardless of the configured ErrorHandling provided ErrorLog + // is not nil. + ErrorHandling HandlerErrorHandling + // If DisableCompression is true, the handler will never compress the + // response, even if requested by the client. + DisableCompression bool +} + +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer, compressionDisabled bool) (io.Writer, string) { + if compressionDisabled { + return writer, "" + } + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part := strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/registry.go similarity index 53% rename from vendor/github.com/prometheus/client_golang/prometheus/registry.go rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/registry.go index b5e70b93f..0a246e5bc 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/registry.go +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/registry.go @@ -15,22 +15,15 @@ package prometheus import ( "bytes" + "errors" "fmt" - "io/ioutil" "os" - "path/filepath" - "runtime" "sort" - "strings" "sync" - "unicode/utf8" "github.com/golang/protobuf/proto" - "github.com/prometheus/common/expfmt" - dto "github.com/prometheus/client_model/go" - - "github.com/prometheus/client_golang/prometheus/internal" + dto "github.com/m3db/prometheus_client_model/go" ) const ( @@ -42,14 +35,13 @@ const ( // DefaultRegisterer and DefaultGatherer are the implementations of the // Registerer and Gatherer interface a number of convenience functions in this // package act on. Initially, both variables point to the same Registry, which -// has a process collector (currently on Linux only, see NewProcessCollector) -// and a Go collector (see NewGoCollector, in particular the note about -// stop-the-world implication with Go versions older than 1.9) already -// registered. This approach to keep default instances as global state mirrors -// the approach of other packages in the Go standard library. Note that there -// are caveats. Change the variables with caution and only if you understand the -// consequences. Users who want to avoid global state altogether should not use -// the convenience functions and act on custom instances instead. +// has a process collector (see NewProcessCollector) and a Go collector (see +// NewGoCollector) already registered. This approach to keep default instances +// as global state mirrors the approach of other packages in the Go standard +// library. Note that there are caveats. Change the variables with caution and +// only if you understand the consequences. Users who want to avoid global state +// altogether should not use the convenience function and act on custom +// instances instead. var ( defaultRegistry = NewRegistry() DefaultRegisterer Registerer = defaultRegistry @@ -57,7 +49,7 @@ var ( ) func init() { - MustRegister(NewProcessCollector(ProcessCollectorOpts{})) + MustRegister(NewProcessCollector(os.Getpid(), "")) MustRegister(NewGoCollector()) } @@ -73,8 +65,7 @@ func NewRegistry() *Registry { // NewPedanticRegistry returns a registry that checks during collection if each // collected Metric is consistent with its reported Desc, and if the Desc has -// actually been registered with the registry. Unchecked Collectors (those whose -// Describe methed does not yield any descriptors) are excluded from the check. +// actually been registered with the registry. // // Usually, a Registry will be happy as long as the union of all collected // Metrics is consistent and valid even if some metrics are not consistent with @@ -89,7 +80,7 @@ func NewPedanticRegistry() *Registry { // Registerer is the interface for the part of a registry in charge of // registering and unregistering. Users of custom registries should use -// Registerer as type for registration purposes (rather than the Registry type +// Registerer as type for registration purposes (rather then the Registry type // directly). In that way, they are free to use custom Registerer implementation // (e.g. for testing purposes). type Registerer interface { @@ -104,13 +95,8 @@ type Registerer interface { // returned error is an instance of AlreadyRegisteredError, which // contains the previously registered Collector. // - // A Collector whose Describe method does not yield any Desc is treated - // as unchecked. Registration will always succeed. No check for - // re-registering (see previous paragraph) is performed. Thus, the - // caller is responsible for not double-registering the same unchecked - // Collector, and for providing a Collector that will not cause - // inconsistent metrics on collection. (This would lead to scrape - // errors.) + // It is in general not safe to register the same Collector multiple + // times concurrently. Register(Collector) error // MustRegister works like Register but registers any number of // Collectors and panics upon the first registration that causes an @@ -119,9 +105,7 @@ type Registerer interface { // Unregister unregisters the Collector that equals the Collector passed // in as an argument. (Two Collectors are considered equal if their // Describe method yields the same set of descriptors.) The function - // returns whether a Collector was unregistered. Note that an unchecked - // Collector cannot be unregistered (as its Describe method does not - // yield any descriptor). + // returns whether a Collector was unregistered. // // Note that even after unregistering, it will not be possible to // register a new Collector that is inconsistent with the unregistered @@ -139,23 +123,15 @@ type Registerer interface { type Gatherer interface { // Gather calls the Collect method of the registered Collectors and then // gathers the collected metrics into a lexicographically sorted slice - // of uniquely named MetricFamily protobufs. Gather ensures that the - // returned slice is valid and self-consistent so that it can be used - // for valid exposition. As an exception to the strict consistency - // requirements described for metric.Desc, Gather will tolerate - // different sets of label names for metrics of the same metric family. - // - // Even if an error occurs, Gather attempts to gather as many metrics as - // possible. Hence, if a non-nil error is returned, the returned - // MetricFamily slice could be nil (in case of a fatal error that - // prevented any meaningful metric collection) or contain a number of - // MetricFamily protobufs, some of which might be incomplete, and some - // might be missing altogether. The returned error (which might be a - // MultiError) explains the details. Note that this is mostly useful for - // debugging purposes. If the gathered protobufs are to be used for - // exposition in actual monitoring, it is almost always better to not - // expose an incomplete result and instead disregard the returned - // MetricFamily protobufs in case the returned error is non-nil. + // of MetricFamily protobufs. Even if an error occurs, Gather attempts + // to gather as many metrics as possible. Hence, if a non-nil error is + // returned, the returned MetricFamily slice could be nil (in case of a + // fatal error that prevented any meaningful metric collection) or + // contain a number of MetricFamily protobufs, some of which might be + // incomplete, and some might be missing altogether. The returned error + // (which might be a MultiError) explains the details. In scenarios + // where complete collection is critical, the returned MetricFamily + // protobufs should be disregarded if the returned error is non-nil. Gather() ([]*dto.MetricFamily, error) } @@ -176,6 +152,38 @@ func MustRegister(cs ...Collector) { DefaultRegisterer.MustRegister(cs...) } +// RegisterOrGet registers the provided Collector with the DefaultRegisterer and +// returns the Collector, unless an equal Collector was registered before, in +// which case that Collector is returned. +// +// Deprecated: RegisterOrGet is merely a convenience function for the +// implementation as described in the documentation for +// AlreadyRegisteredError. As the use case is relatively rare, this function +// will be removed in a future version of this package to clean up the +// namespace. +func RegisterOrGet(c Collector) (Collector, error) { + if err := Register(c); err != nil { + if are, ok := err.(AlreadyRegisteredError); ok { + return are.ExistingCollector, nil + } + return nil, err + } + return c, nil +} + +// MustRegisterOrGet behaves like RegisterOrGet but panics instead of returning +// an error. +// +// Deprecated: This is deprecated for the same reason RegisterOrGet is. See +// there for details. +func MustRegisterOrGet(c Collector) Collector { + c, err := RegisterOrGet(c) + if err != nil { + panic(err) + } + return c +} + // Unregister removes the registration of the provided Collector from the // DefaultRegisterer. // @@ -193,6 +201,25 @@ func (gf GathererFunc) Gather() ([]*dto.MetricFamily, error) { return gf() } +// SetMetricFamilyInjectionHook replaces the DefaultGatherer with one that +// gathers from the previous DefaultGatherers but then merges the MetricFamily +// protobufs returned from the provided hook function with the MetricFamily +// protobufs returned from the original DefaultGatherer. +// +// Deprecated: This function manipulates the DefaultGatherer variable. Consider +// the implications, i.e. don't do this concurrently with any uses of the +// DefaultGatherer. In the rare cases where you need to inject MetricFamily +// protobufs directly, it is recommended to use a custom Registry and combine it +// with a custom Gatherer using the Gatherers type (see +// there). SetMetricFamilyInjectionHook only exists for compatibility reasons +// with previous versions of this package. +func SetMetricFamilyInjectionHook(hook func() []*dto.MetricFamily) { + DefaultGatherer = Gatherers{ + DefaultGatherer, + GathererFunc(func() ([]*dto.MetricFamily, error) { return hook(), nil }), + } +} + // AlreadyRegisteredError is returned by the Register method if the Collector to // be registered has already been registered before, or a different Collector // that collects the same metrics has been registered before. Registration fails @@ -225,13 +252,6 @@ func (errs MultiError) Error() string { return buf.String() } -// Append appends the provided error if it is not nil. -func (errs *MultiError) Append(err error) { - if err != nil { - *errs = append(*errs, err) - } -} - // MaybeUnwrap returns nil if len(errs) is 0. It returns the first and only // contained error as error if len(errs is 1). In all other cases, it returns // the MultiError directly. This is helpful for returning a MultiError in a way @@ -256,7 +276,6 @@ type Registry struct { collectorsByID map[uint64]Collector // ID is a hash of the descIDs. descIDs map[uint64]struct{} dimHashesByName map[string]uint64 - uncheckedCollectors []Collector pedanticChecksEnabled bool } @@ -274,13 +293,8 @@ func (r *Registry) Register(c Collector) error { close(descChan) }() r.mtx.Lock() - defer func() { - // Drain channel in case of premature return to not leak a goroutine. - for range descChan { - } - r.mtx.Unlock() - }() - // Conduct various tests... + defer r.mtx.Unlock() + // Coduct various tests... for desc := range descChan { // Is the descriptor valid at all? @@ -319,10 +333,9 @@ func (r *Registry) Register(c Collector) error { } } } - // A Collector yielding no Desc at all is considered unchecked. + // Did anything happen at all? if len(newDescIDs) == 0 { - r.uncheckedCollectors = append(r.uncheckedCollectors, c) - return nil + return errors.New("collector has no descriptors") } if existing, exists := r.collectorsByID[collectorID]; exists { return AlreadyRegisteredError{ @@ -396,25 +409,31 @@ func (r *Registry) MustRegister(cs ...Collector) { // Gather implements Gatherer. func (r *Registry) Gather() ([]*dto.MetricFamily, error) { var ( - checkedMetricChan = make(chan Metric, capMetricChan) - uncheckedMetricChan = make(chan Metric, capMetricChan) - metricHashes = map[uint64]struct{}{} - wg sync.WaitGroup - errs MultiError // The collected errors to return in the end. - registeredDescIDs map[uint64]struct{} // Only used for pedantic checks + metricChan = make(chan Metric, capMetricChan) + metricHashes = map[uint64]struct{}{} + dimHashes = map[string]uint64{} + wg sync.WaitGroup + errs MultiError // The collected errors to return in the end. + registeredDescIDs map[uint64]struct{} // Only used for pedantic checks ) r.mtx.RLock() - goroutineBudget := len(r.collectorsByID) + len(r.uncheckedCollectors) metricFamiliesByName := make(map[string]*dto.MetricFamily, len(r.dimHashesByName)) - checkedCollectors := make(chan Collector, len(r.collectorsByID)) - uncheckedCollectors := make(chan Collector, len(r.uncheckedCollectors)) + + // Scatter. + // (Collectors could be complex and slow, so we call them all at once.) + wg.Add(len(r.collectorsByID)) + go func() { + wg.Wait() + close(metricChan) + }() for _, collector := range r.collectorsByID { - checkedCollectors <- collector - } - for _, collector := range r.uncheckedCollectors { - uncheckedCollectors <- collector + go func(collector Collector) { + defer wg.Done() + collector.Collect(metricChan) + }(collector) } + // In case pedantic checks are enabled, we have to copy the map before // giving up the RLock. if r.pedanticChecksEnabled { @@ -423,258 +442,127 @@ func (r *Registry) Gather() ([]*dto.MetricFamily, error) { registeredDescIDs[id] = struct{}{} } } - r.mtx.RUnlock() - - wg.Add(goroutineBudget) - collectWorker := func() { - for { - select { - case collector := <-checkedCollectors: - collector.Collect(checkedMetricChan) - case collector := <-uncheckedCollectors: - collector.Collect(uncheckedMetricChan) - default: - return - } - wg.Done() - } - } - - // Start the first worker now to make sure at least one is running. - go collectWorker() - goroutineBudget-- - - // Close checkedMetricChan and uncheckedMetricChan once all collectors - // are collected. - go func() { - wg.Wait() - close(checkedMetricChan) - close(uncheckedMetricChan) - }() + r.mtx.RUnlock() - // Drain checkedMetricChan and uncheckedMetricChan in case of premature return. + // Drain metricChan in case of premature return. defer func() { - if checkedMetricChan != nil { - for range checkedMetricChan { - } - } - if uncheckedMetricChan != nil { - for range uncheckedMetricChan { - } + for _ = range metricChan { } }() - // Copy the channel references so we can nil them out later to remove - // them from the select statements below. - cmc := checkedMetricChan - umc := uncheckedMetricChan - - for { - select { - case metric, ok := <-cmc: - if !ok { - cmc = nil - break - } - errs.Append(processMetric( - metric, metricFamiliesByName, - metricHashes, - registeredDescIDs, + // Gather. + for metric := range metricChan { + // This could be done concurrently, too, but it required locking + // of metricFamiliesByName (and of metricHashes if checks are + // enabled). Most likely not worth it. + desc := metric.Desc() + dtoMetric := &dto.Metric{} + if err := metric.Write(dtoMetric); err != nil { + errs = append(errs, fmt.Errorf( + "error collecting metric %v: %s", desc, err, )) - case metric, ok := <-umc: - if !ok { - umc = nil - break + continue + } + metricFamily, ok := metricFamiliesByName[desc.fqName] + if ok { + if metricFamily.GetHelp() != desc.help { + errs = append(errs, fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + desc.fqName, dtoMetric, desc.help, metricFamily.GetHelp(), + )) + continue } - errs.Append(processMetric( - metric, metricFamiliesByName, - metricHashes, - nil, - )) - default: - if goroutineBudget <= 0 || len(checkedCollectors)+len(uncheckedCollectors) == 0 { - // All collectors are already being worked on or - // we have already as many goroutines started as - // there are collectors. Do the same as above, - // just without the default. - select { - case metric, ok := <-cmc: - if !ok { - cmc = nil - break - } - errs.Append(processMetric( - metric, metricFamiliesByName, - metricHashes, - registeredDescIDs, + // TODO(beorn7): Simplify switch once Desc has type. + switch metricFamily.GetType() { + case dto.MetricType_COUNTER: + if dtoMetric.Counter == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Counter", + desc.fqName, dtoMetric, )) - case metric, ok := <-umc: - if !ok { - umc = nil - break - } - errs.Append(processMetric( - metric, metricFamiliesByName, - metricHashes, - nil, + continue + } + case dto.MetricType_GAUGE: + if dtoMetric.Gauge == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Gauge", + desc.fqName, dtoMetric, )) + continue } - break - } - // Start more workers. - go collectWorker() - goroutineBudget-- - runtime.Gosched() - } - // Once both checkedMetricChan and uncheckdMetricChan are closed - // and drained, the contraption above will nil out cmc and umc, - // and then we can leave the collect loop here. - if cmc == nil && umc == nil { - break - } - } - return internal.NormalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() -} - -// WriteToTextfile calls Gather on the provided Gatherer, encodes the result in the -// Prometheus text format, and writes it to a temporary file. Upon success, the -// temporary file is renamed to the provided filename. -// -// This is intended for use with the textfile collector of the node exporter. -// Note that the node exporter expects the filename to be suffixed with ".prom". -func WriteToTextfile(filename string, g Gatherer) error { - tmp, err := ioutil.TempFile(filepath.Dir(filename), filepath.Base(filename)) - if err != nil { - return err - } - defer os.Remove(tmp.Name()) - - mfs, err := g.Gather() - if err != nil { - return err - } - for _, mf := range mfs { - if _, err := expfmt.MetricFamilyToText(tmp, mf); err != nil { - return err - } - } - if err := tmp.Close(); err != nil { - return err - } - - if err := os.Chmod(tmp.Name(), 0644); err != nil { - return err - } - return os.Rename(tmp.Name(), filename) -} - -// processMetric is an internal helper method only used by the Gather method. -func processMetric( - metric Metric, - metricFamiliesByName map[string]*dto.MetricFamily, - metricHashes map[uint64]struct{}, - registeredDescIDs map[uint64]struct{}, -) error { - desc := metric.Desc() - // Wrapped metrics collected by an unchecked Collector can have an - // invalid Desc. - if desc.err != nil { - return desc.err - } - dtoMetric := &dto.Metric{} - if err := metric.Write(dtoMetric); err != nil { - return fmt.Errorf("error collecting metric %v: %s", desc, err) - } - metricFamily, ok := metricFamiliesByName[desc.fqName] - if ok { // Existing name. - if metricFamily.GetHelp() != desc.help { - return fmt.Errorf( - "collected metric %s %s has help %q but should have %q", - desc.fqName, dtoMetric, desc.help, metricFamily.GetHelp(), - ) - } - // TODO(beorn7): Simplify switch once Desc has type. - switch metricFamily.GetType() { - case dto.MetricType_COUNTER: - if dtoMetric.Counter == nil { - return fmt.Errorf( - "collected metric %s %s should be a Counter", - desc.fqName, dtoMetric, - ) - } - case dto.MetricType_GAUGE: - if dtoMetric.Gauge == nil { - return fmt.Errorf( - "collected metric %s %s should be a Gauge", - desc.fqName, dtoMetric, - ) + case dto.MetricType_SUMMARY: + if dtoMetric.Summary == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Summary", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_UNTYPED: + if dtoMetric.Untyped == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be Untyped", + desc.fqName, dtoMetric, + )) + continue + } + case dto.MetricType_HISTOGRAM: + if dtoMetric.Histogram == nil { + errs = append(errs, fmt.Errorf( + "collected metric %s %s should be a Histogram", + desc.fqName, dtoMetric, + )) + continue + } + default: + panic("encountered MetricFamily with invalid type") } - case dto.MetricType_SUMMARY: - if dtoMetric.Summary == nil { - return fmt.Errorf( - "collected metric %s %s should be a Summary", - desc.fqName, dtoMetric, - ) + } else { + metricFamily = &dto.MetricFamily{} + metricFamily.Name = proto.String(desc.fqName) + metricFamily.Help = proto.String(desc.help) + // TODO(beorn7): Simplify switch once Desc has type. + switch { + case dtoMetric.Gauge != nil: + metricFamily.Type = dto.MetricType_GAUGE.Enum() + case dtoMetric.Counter != nil: + metricFamily.Type = dto.MetricType_COUNTER.Enum() + case dtoMetric.Summary != nil: + metricFamily.Type = dto.MetricType_SUMMARY.Enum() + case dtoMetric.Untyped != nil: + metricFamily.Type = dto.MetricType_UNTYPED.Enum() + case dtoMetric.Histogram != nil: + metricFamily.Type = dto.MetricType_HISTOGRAM.Enum() + default: + errs = append(errs, fmt.Errorf( + "empty metric collected: %s", dtoMetric, + )) + continue } - case dto.MetricType_UNTYPED: - if dtoMetric.Untyped == nil { - return fmt.Errorf( - "collected metric %s %s should be Untyped", - desc.fqName, dtoMetric, - ) + metricFamiliesByName[desc.fqName] = metricFamily + } + if err := checkMetricConsistency(metricFamily, dtoMetric, metricHashes, dimHashes); err != nil { + errs = append(errs, err) + continue + } + if r.pedanticChecksEnabled { + // Is the desc registered at all? + if _, exist := registeredDescIDs[desc.id]; !exist { + errs = append(errs, fmt.Errorf( + "collected metric %s %s with unregistered descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + )) + continue } - case dto.MetricType_HISTOGRAM: - if dtoMetric.Histogram == nil { - return fmt.Errorf( - "collected metric %s %s should be a Histogram", - desc.fqName, dtoMetric, - ) + if err := checkDescConsistency(metricFamily, dtoMetric, desc); err != nil { + errs = append(errs, err) + continue } - default: - panic("encountered MetricFamily with invalid type") - } - } else { // New name. - metricFamily = &dto.MetricFamily{} - metricFamily.Name = proto.String(desc.fqName) - metricFamily.Help = proto.String(desc.help) - // TODO(beorn7): Simplify switch once Desc has type. - switch { - case dtoMetric.Gauge != nil: - metricFamily.Type = dto.MetricType_GAUGE.Enum() - case dtoMetric.Counter != nil: - metricFamily.Type = dto.MetricType_COUNTER.Enum() - case dtoMetric.Summary != nil: - metricFamily.Type = dto.MetricType_SUMMARY.Enum() - case dtoMetric.Untyped != nil: - metricFamily.Type = dto.MetricType_UNTYPED.Enum() - case dtoMetric.Histogram != nil: - metricFamily.Type = dto.MetricType_HISTOGRAM.Enum() - default: - return fmt.Errorf("empty metric collected: %s", dtoMetric) - } - if err := checkSuffixCollisions(metricFamily, metricFamiliesByName); err != nil { - return err } - metricFamiliesByName[desc.fqName] = metricFamily + metricFamily.Metric = append(metricFamily.Metric, dtoMetric) } - if err := checkMetricConsistency(metricFamily, dtoMetric, metricHashes); err != nil { - return err - } - if registeredDescIDs != nil { - // Is the desc registered at all? - if _, exist := registeredDescIDs[desc.id]; !exist { - return fmt.Errorf( - "collected metric %s %s with unregistered descriptor %s", - metricFamily.GetName(), dtoMetric, desc, - ) - } - if err := checkDescConsistency(metricFamily, dtoMetric, desc); err != nil { - return err - } - } - metricFamily.Metric = append(metricFamily.Metric, dtoMetric) - return nil + return normalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() } // Gatherers is a slice of Gatherer instances that implements the Gatherer @@ -700,6 +588,7 @@ func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) { var ( metricFamiliesByName = map[string]*dto.MetricFamily{} metricHashes = map[uint64]struct{}{} + dimHashes = map[string]uint64{} errs MultiError // The collected errors to return in the end. ) @@ -736,14 +625,10 @@ func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) { existingMF.Name = mf.Name existingMF.Help = mf.Help existingMF.Type = mf.Type - if err := checkSuffixCollisions(existingMF, metricFamiliesByName); err != nil { - errs = append(errs, err) - continue - } metricFamiliesByName[mf.GetName()] = existingMF } for _, m := range mf.Metric { - if err := checkMetricConsistency(existingMF, m, metricHashes); err != nil { + if err := checkMetricConsistency(existingMF, m, metricHashes, dimHashes); err != nil { errs = append(errs, err) continue } @@ -751,80 +636,88 @@ func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) { } } } - return internal.NormalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() + return normalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() } -// checkSuffixCollisions checks for collisions with the “magic” suffixes the -// Prometheus text format and the internal metric representation of the -// Prometheus server add while flattening Summaries and Histograms. -func checkSuffixCollisions(mf *dto.MetricFamily, mfs map[string]*dto.MetricFamily) error { - var ( - newName = mf.GetName() - newType = mf.GetType() - newNameWithoutSuffix = "" - ) - switch { - case strings.HasSuffix(newName, "_count"): - newNameWithoutSuffix = newName[:len(newName)-6] - case strings.HasSuffix(newName, "_sum"): - newNameWithoutSuffix = newName[:len(newName)-4] - case strings.HasSuffix(newName, "_bucket"): - newNameWithoutSuffix = newName[:len(newName)-7] - } - if newNameWithoutSuffix != "" { - if existingMF, ok := mfs[newNameWithoutSuffix]; ok { - switch existingMF.GetType() { - case dto.MetricType_SUMMARY: - if !strings.HasSuffix(newName, "_bucket") { - return fmt.Errorf( - "collected metric named %q collides with previously collected summary named %q", - newName, newNameWithoutSuffix, - ) - } - case dto.MetricType_HISTOGRAM: - return fmt.Errorf( - "collected metric named %q collides with previously collected histogram named %q", - newName, newNameWithoutSuffix, - ) - } - } +// metricSorter is a sortable slice of *dto.Metric. +type metricSorter []*dto.Metric + +func (s metricSorter) Len() int { + return len(s) +} + +func (s metricSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s metricSorter) Less(i, j int) bool { + if len(s[i].Label) != len(s[j].Label) { + // This should not happen. The metrics are + // inconsistent. However, we have to deal with the fact, as + // people might use custom collectors or metric family injection + // to create inconsistent metrics. So let's simply compare the + // number of labels in this case. That will still yield + // reproducible sorting. + return len(s[i].Label) < len(s[j].Label) + } + for n, lp := range s[i].Label { + vi := lp.GetValue() + vj := s[j].Label[n].GetValue() + if vi != vj { + return vi < vj + } + } + + // We should never arrive here. Multiple metrics with the same + // label set in the same scrape will lead to undefined ingestion + // behavior. However, as above, we have to provide stable sorting + // here, even for inconsistent metrics. So sort equal metrics + // by their timestamp, with missing timestamps (implying "now") + // coming last. + if s[i].TimestampMs == nil { + return false } - if newType == dto.MetricType_SUMMARY || newType == dto.MetricType_HISTOGRAM { - if _, ok := mfs[newName+"_count"]; ok { - return fmt.Errorf( - "collected histogram or summary named %q collides with previously collected metric named %q", - newName, newName+"_count", - ) - } - if _, ok := mfs[newName+"_sum"]; ok { - return fmt.Errorf( - "collected histogram or summary named %q collides with previously collected metric named %q", - newName, newName+"_sum", - ) - } + if s[j].TimestampMs == nil { + return true } - if newType == dto.MetricType_HISTOGRAM { - if _, ok := mfs[newName+"_bucket"]; ok { - return fmt.Errorf( - "collected histogram named %q collides with previously collected metric named %q", - newName, newName+"_bucket", - ) + return s[i].GetTimestampMs() < s[j].GetTimestampMs() +} + +// normalizeMetricFamilies returns a MetricFamily slice whith empty +// MetricFamilies pruned and the remaining MetricFamilies sorted by name within +// the slice, with the contained Metrics sorted within each MetricFamily. +func normalizeMetricFamilies(metricFamiliesByName map[string]*dto.MetricFamily) []*dto.MetricFamily { + for _, mf := range metricFamiliesByName { + sort.Sort(metricSorter(mf.Metric)) + } + names := make([]string, 0, len(metricFamiliesByName)) + for name, mf := range metricFamiliesByName { + if len(mf.Metric) > 0 { + names = append(names, name) } } - return nil + sort.Strings(names) + result := make([]*dto.MetricFamily, 0, len(names)) + for _, name := range names { + result = append(result, metricFamiliesByName[name]) + } + return result } // checkMetricConsistency checks if the provided Metric is consistent with the -// provided MetricFamily. It also hashes the Metric labels and the MetricFamily -// name. If the resulting hash is already in the provided metricHashes, an error -// is returned. If not, it is added to metricHashes. +// provided MetricFamily. It also hashed the Metric labels and the MetricFamily +// name. If the resulting hash is alread in the provided metricHashes, an error +// is returned. If not, it is added to metricHashes. The provided dimHashes maps +// MetricFamily names to their dimHash (hashed sorted label names). If dimHashes +// doesn't yet contain a hash for the provided MetricFamily, it is +// added. Otherwise, an error is returned if the existing dimHashes in not equal +// the calculated dimHash. func checkMetricConsistency( metricFamily *dto.MetricFamily, dtoMetric *dto.Metric, metricHashes map[uint64]struct{}, + dimHashes map[string]uint64, ) error { - name := metricFamily.GetName() - // Type consistency with metric family. if metricFamily.GetType() == dto.MetricType_GAUGE && dtoMetric.Gauge == nil || metricFamily.GetType() == dto.MetricType_COUNTER && dtoMetric.Counter == nil || @@ -832,65 +725,41 @@ func checkMetricConsistency( metricFamily.GetType() == dto.MetricType_HISTOGRAM && dtoMetric.Histogram == nil || metricFamily.GetType() == dto.MetricType_UNTYPED && dtoMetric.Untyped == nil { return fmt.Errorf( - "collected metric %q { %s} is not a %s", - name, dtoMetric, metricFamily.GetType(), + "collected metric %s %s is not a %s", + metricFamily.GetName(), dtoMetric, metricFamily.GetType(), ) } - previousLabelName := "" - for _, labelPair := range dtoMetric.GetLabel() { - labelName := labelPair.GetName() - if labelName == previousLabelName { - return fmt.Errorf( - "collected metric %q { %s} has two or more labels with the same name: %s", - name, dtoMetric, labelName, - ) - } - if !checkLabelName(labelName) { - return fmt.Errorf( - "collected metric %q { %s} has a label with an invalid name: %s", - name, dtoMetric, labelName, - ) - } - if dtoMetric.Summary != nil && labelName == quantileLabel { - return fmt.Errorf( - "collected metric %q { %s} must not have an explicit %q label", - name, dtoMetric, quantileLabel, - ) - } - if !utf8.ValidString(labelPair.GetValue()) { - return fmt.Errorf( - "collected metric %q { %s} has a label named %q whose value is not utf8: %#v", - name, dtoMetric, labelName, labelPair.GetValue()) - } - previousLabelName = labelName - } - - // Is the metric unique (i.e. no other metric with the same name and the same labels)? + // Is the metric unique (i.e. no other metric with the same name and the same label values)? h := hashNew() - h = hashAdd(h, name) + h = hashAdd(h, metricFamily.GetName()) h = hashAddByte(h, separatorByte) + dh := hashNew() // Make sure label pairs are sorted. We depend on it for the consistency // check. - if !sort.IsSorted(labelPairSorter(dtoMetric.Label)) { - // We cannot sort dtoMetric.Label in place as it is immutable by contract. - copiedLabels := make([]*dto.LabelPair, len(dtoMetric.Label)) - copy(copiedLabels, dtoMetric.Label) - sort.Sort(labelPairSorter(copiedLabels)) - dtoMetric.Label = copiedLabels - } + sort.Sort(LabelPairSorter(dtoMetric.Label)) for _, lp := range dtoMetric.Label { - h = hashAdd(h, lp.GetName()) - h = hashAddByte(h, separatorByte) h = hashAdd(h, lp.GetValue()) h = hashAddByte(h, separatorByte) + dh = hashAdd(dh, lp.GetName()) + dh = hashAddByte(dh, separatorByte) } if _, exists := metricHashes[h]; exists { return fmt.Errorf( - "collected metric %q { %s} was collected before with the same name and label values", - name, dtoMetric, + "collected metric %s %s was collected before with the same name and label values", + metricFamily.GetName(), dtoMetric, ) } + if dimHash, ok := dimHashes[metricFamily.GetName()]; ok { + if dimHash != dh { + return fmt.Errorf( + "collected metric %s %s has label dimensions inconsistent with previously collected metrics in the same metric family", + metricFamily.GetName(), dtoMetric, + ) + } + } else { + dimHashes[metricFamily.GetName()] = dh + } metricHashes[h] = struct{}{} return nil } @@ -909,8 +778,8 @@ func checkDescConsistency( } // Is the desc consistent with the content of the metric? - lpsFromDesc := make([]*dto.LabelPair, len(desc.constLabelPairs), len(dtoMetric.Label)) - copy(lpsFromDesc, desc.constLabelPairs) + lpsFromDesc := make([]*dto.LabelPair, 0, len(dtoMetric.Label)) + lpsFromDesc = append(lpsFromDesc, desc.constLabelPairs...) for _, l := range desc.variableLabels { lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ Name: proto.String(l), @@ -922,7 +791,7 @@ func checkDescConsistency( metricFamily.GetName(), dtoMetric, desc, ) } - sort.Sort(labelPairSorter(lpsFromDesc)) + sort.Sort(LabelPairSorter(lpsFromDesc)) for i, lpFromDesc := range lpsFromDesc { lpFromMetric := dtoMetric.Label[i] if lpFromDesc.GetName() != lpFromMetric.GetName() || diff --git a/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/summary.go similarity index 65% rename from vendor/github.com/prometheus/client_golang/prometheus/summary.go rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/summary.go index 2980614df..da2a7a8fb 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/summary.go +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/summary.go @@ -23,7 +23,7 @@ import ( "github.com/beorn7/perks/quantile" "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" + dto "github.com/m3db/prometheus_client_model/go" ) // quantileLabel is used for the label that defines the quantile in a @@ -36,10 +36,7 @@ const quantileLabel = "quantile" // // A typical use-case is the observation of request latencies. By default, a // Summary provides the median, the 90th and the 99th percentile of the latency -// as rank estimations. However, the default behavior will change in the -// upcoming v0.10 of the library. There will be no rank estimations at all by -// default. For a sane transition, it is recommended to set the desired rank -// estimations explicitly. +// as rank estimations. // // Note that the rank estimations cannot be aggregated in a meaningful way with // the Prometheus query language (i.e. you cannot average or add them). If you @@ -57,9 +54,6 @@ type Summary interface { } // DefObjectives are the default Summary quantile values. -// -// Deprecated: DefObjectives will not be used as the default objectives in -// v0.10 of the library. The default Summary will have no quantiles then. var ( DefObjectives = map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} @@ -81,10 +75,8 @@ const ( ) // SummaryOpts bundles the options for creating a Summary metric. It is -// mandatory to set Name to a non-empty string. While all other fields are -// optional and can safely be left at their zero value, it is recommended to set -// a help string and to explicitly set the Objectives field to the desired value -// as the default value will change in the upcoming v0.10 of the library. +// mandatory to set Name and Help to a non-empty string. All other fields are +// optional and can safely be left at their zero value. type SummaryOpts struct { // Namespace, Subsystem, and Name are components of the fully-qualified // name of the Summary (created by joining these components with @@ -95,39 +87,35 @@ type SummaryOpts struct { Subsystem string Name string - // Help provides information about this Summary. + // Help provides information about this Summary. Mandatory! // // Metrics with the same fully-qualified name must have the same Help // string. Help string - // ConstLabels are used to attach fixed labels to this metric. Metrics - // with the same fully-qualified name must have the same label names in - // their ConstLabels. + // ConstLabels are used to attach fixed labels to this + // Summary. Summaries with the same fully-qualified name must have the + // same label names in their ConstLabels. // - // Due to the way a Summary is represented in the Prometheus text format - // and how it is handled by the Prometheus server internally, “quantile” - // is an illegal label name. Construction of a Summary or SummaryVec - // will panic if this label name is used in ConstLabels. + // Note that in most cases, labels have a value that varies during the + // lifetime of a process. Those labels are usually managed with a + // SummaryVec. ConstLabels serve only special purposes. One is for the + // special case where the value of a label does not change during the + // lifetime of a process, e.g. if the revision of the running binary is + // put into a label. Another, more advanced purpose is if more than one + // Collector needs to collect Summaries with the same fully-qualified + // name. In that case, those Summaries must differ in the values of + // their ConstLabels. See the Collector examples. // - // ConstLabels are only used rarely. In particular, do not use them to - // attach the same labels to all your metrics. Those use cases are - // better covered by target labels set by the scraping Prometheus - // server, or by one specific metric (e.g. a build_info or a - // machine_role metric). See also - // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels,-not-static-scraped-labels + // If the value of a label never changes (not even between binaries), + // that label most likely should not be a label at all (but part of the + // metric name). ConstLabels Labels // Objectives defines the quantile rank estimates with their respective - // absolute error. If Objectives[q] = e, then the value reported for q - // will be the φ-quantile value for some φ between q-e and q+e. The - // default value is DefObjectives. It is used if Objectives is left at - // its zero value (i.e. nil). To create a Summary without Objectives, - // set it to an empty map (i.e. map[float64]float64{}). - // - // Deprecated: Note that the current value of DefObjectives is - // deprecated. It will be replaced by an empty map in v0.10 of the - // library. Please explicitly set Objectives to the desired value. + // absolute error. If Objectives[q] = e, then the value reported + // for q will be the φ-quantile value for some φ between q-e and q+e. + // The default value is DefObjectives. Objectives map[float64]float64 // MaxAge defines the duration for which an observation stays relevant @@ -181,7 +169,7 @@ func NewSummary(opts SummaryOpts) Summary { func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { if len(desc.variableLabels) != len(labelValues) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, labelValues)) + panic(errInconsistentCardinality) } for _, n := range desc.variableLabels { @@ -195,7 +183,7 @@ func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { } } - if opts.Objectives == nil { + if len(opts.Objectives) == 0 { opts.Objectives = DefObjectives } @@ -402,21 +390,13 @@ func (s quantSort) Less(i, j int) bool { // (e.g. HTTP request latencies, partitioned by status code and method). Create // instances with NewSummaryVec. type SummaryVec struct { - *metricVec + *MetricVec } // NewSummaryVec creates a new SummaryVec based on the provided SummaryOpts and -// partitioned by the given label names. -// -// Due to the way a Summary is represented in the Prometheus text format and how -// it is handled by the Prometheus server internally, “quantile” is an illegal -// label name. NewSummaryVec will panic if this label name is used. +// partitioned by the given label names. At least one label name must be +// provided. func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { - for _, ln := range labelNames { - if ln == quantileLabel { - panic(errQuantileLabelNotAllowed) - } - } desc := NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, @@ -424,116 +404,47 @@ func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { opts.ConstLabels, ) return &SummaryVec{ - metricVec: newMetricVec(desc, func(lvs ...string) Metric { + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { return newSummary(desc, opts, lvs...) }), } } -// GetMetricWithLabelValues returns the Summary for the given slice of label -// values (same order as the VariableLabels in Desc). If that combination of -// label values is accessed for the first time, a new Summary is created. -// -// It is possible to call this method without using the returned Summary to only -// create the new Summary but leave it at its starting value, a Summary without -// any observations. -// -// Keeping the Summary for later use is possible (and should be considered if -// performance is critical), but keep in mind that Reset, DeleteLabelValues and -// Delete can be used to delete the Summary from the SummaryVec. In that case, -// the Summary will still exist, but it will not be exported anymore, even if a -// Summary with the same label values is created later. See also the CounterVec -// example. -// -// An error is returned if the number of label values is not the same as the -// number of VariableLabels in Desc (minus any curried labels). -// -// Note that for more than one label value, this method is prone to mistakes -// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as -// an alternative to avoid that type of mistake. For higher label numbers, the -// latter has a much more readable (albeit more verbose) syntax, but it comes -// with a performance overhead (for creating and processing the Labels map). -// See also the GaugeVec example. -func (v *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) { - metric, err := v.metricVec.getMetricWithLabelValues(lvs...) +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns a Summary and not a +// Metric so that no type conversion is required. +func (m *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Summary, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) if metric != nil { - return metric.(Observer), err + return metric.(Summary), err } return nil, err } -// GetMetricWith returns the Summary for the given Labels map (the label names -// must match those of the VariableLabels in Desc). If that label map is -// accessed for the first time, a new Summary is created. Implications of -// creating a Summary without using it and keeping the Summary for later use are -// the same as for GetMetricWithLabelValues. -// -// An error is returned if the number and names of the Labels are inconsistent -// with those of the VariableLabels in Desc (minus any curried labels). -// -// This method is used for the same purpose as -// GetMetricWithLabelValues(...string). See there for pros and cons of the two -// methods. -func (v *SummaryVec) GetMetricWith(labels Labels) (Observer, error) { - metric, err := v.metricVec.getMetricWith(labels) +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns a Summary and not a Metric so that no +// type conversion is required. +func (m *SummaryVec) GetMetricWith(labels Labels) (Summary, error) { + metric, err := m.MetricVec.GetMetricWith(labels) if metric != nil { - return metric.(Observer), err + return metric.(Summary), err } return nil, err } // WithLabelValues works as GetMetricWithLabelValues, but panics where -// GetMetricWithLabelValues would have returned an error. Not returning an -// error allows shortcuts like +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like // myVec.WithLabelValues("404", "GET").Observe(42.21) -func (v *SummaryVec) WithLabelValues(lvs ...string) Observer { - s, err := v.GetMetricWithLabelValues(lvs...) - if err != nil { - panic(err) - } - return s +func (m *SummaryVec) WithLabelValues(lvs ...string) Summary { + return m.MetricVec.WithLabelValues(lvs...).(Summary) } // With works as GetMetricWith, but panics where GetMetricWithLabels would have -// returned an error. Not returning an error allows shortcuts like -// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Observe(42.21) -func (v *SummaryVec) With(labels Labels) Observer { - s, err := v.GetMetricWith(labels) - if err != nil { - panic(err) - } - return s -} - -// CurryWith returns a vector curried with the provided labels, i.e. the -// returned vector has those labels pre-set for all labeled operations performed -// on it. The cardinality of the curried vector is reduced accordingly. The -// order of the remaining labels stays the same (just with the curried labels -// taken out of the sequence – which is relevant for the -// (GetMetric)WithLabelValues methods). It is possible to curry a curried -// vector, but only with labels not yet used for currying before. -// -// The metrics contained in the SummaryVec are shared between the curried and -// uncurried vectors. They are just accessed differently. Curried and uncurried -// vectors behave identically in terms of collection. Only one must be -// registered with a given registry (usually the uncurried version). The Reset -// method deletes all metrics, even if called on a curried vector. -func (v *SummaryVec) CurryWith(labels Labels) (ObserverVec, error) { - vec, err := v.curryWith(labels) - if vec != nil { - return &SummaryVec{vec}, err - } - return nil, err -} - -// MustCurryWith works as CurryWith but panics where CurryWith would have -// returned an error. -func (v *SummaryVec) MustCurryWith(labels Labels) ObserverVec { - vec, err := v.CurryWith(labels) - if err != nil { - panic(err) - } - return vec +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (m *SummaryVec) With(labels Labels) Summary { + return m.MetricVec.With(labels).(Summary) } type constSummary struct { @@ -586,7 +497,7 @@ func (s *constSummary) Write(out *dto.Metric) error { // map[float64]float64{0.5: 0.23, 0.99: 0.56} // // NewConstSummary returns an error if the length of labelValues is not -// consistent with the variable labels in Desc or if Desc is invalid. +// consistent with the variable labels in Desc. func NewConstSummary( desc *Desc, count uint64, @@ -594,11 +505,8 @@ func NewConstSummary( quantiles map[float64]float64, labelValues ...string, ) (Metric, error) { - if desc.err != nil { - return nil, desc.err - } - if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { - return nil, err + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality } return &constSummary{ desc: desc, diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/untyped.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/untyped.go new file mode 100644 index 000000000..5faf7e6e3 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/untyped.go @@ -0,0 +1,138 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Untyped is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// An Untyped metric works the same as a Gauge. The only difference is that to +// no type information is implied. +// +// To create Untyped instances, use NewUntyped. +type Untyped interface { + Metric + Collector + + // Set sets the Untyped metric to an arbitrary value. + Set(float64) + // Inc increments the Untyped metric by 1. + Inc() + // Dec decrements the Untyped metric by 1. + Dec() + // Add adds the given value to the Untyped metric. (The value can be + // negative, resulting in a decrease.) + Add(float64) + // Sub subtracts the given value from the Untyped metric. (The value can + // be negative, resulting in an increase.) + Sub(float64) +} + +// UntypedOpts is an alias for Opts. See there for doc comments. +type UntypedOpts Opts + +// NewUntyped creates a new Untyped metric from the provided UntypedOpts. +func NewUntyped(opts UntypedOpts) Untyped { + return newValue(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, 0) +} + +// UntypedVec is a Collector that bundles a set of Untyped metrics that all +// share the same Desc, but have different values for their variable +// labels. This is used if you want to count the same thing partitioned by +// various dimensions. Create instances with NewUntypedVec. +type UntypedVec struct { + *MetricVec +} + +// NewUntypedVec creates a new UntypedVec based on the provided UntypedOpts and +// partitioned by the given label names. At least one label name must be +// provided. +func NewUntypedVec(opts UntypedOpts, labelNames []string) *UntypedVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &UntypedVec{ + MetricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newValue(desc, UntypedValue, 0, lvs...) + }), + } +} + +// GetMetricWithLabelValues replaces the method of the same name in +// MetricVec. The difference is that this method returns an Untyped and not a +// Metric so that no type conversion is required. +func (m *UntypedVec) GetMetricWithLabelValues(lvs ...string) (Untyped, error) { + metric, err := m.MetricVec.GetMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Untyped), err + } + return nil, err +} + +// GetMetricWith replaces the method of the same name in MetricVec. The +// difference is that this method returns an Untyped and not a Metric so that no +// type conversion is required. +func (m *UntypedVec) GetMetricWith(labels Labels) (Untyped, error) { + metric, err := m.MetricVec.GetMetricWith(labels) + if metric != nil { + return metric.(Untyped), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. By not returning an +// error, WithLabelValues allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (m *UntypedVec) WithLabelValues(lvs ...string) Untyped { + return m.MetricVec.WithLabelValues(lvs...).(Untyped) +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. By not returning an error, With allows shortcuts like +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +func (m *UntypedVec) With(labels Labels) Untyped { + return m.MetricVec.With(labels).(Untyped) +} + +// UntypedFunc is an Untyped whose value is determined at collect time by +// calling a provided function. +// +// To create UntypedFunc instances, use NewUntypedFunc. +type UntypedFunc interface { + Metric + Collector +} + +// NewUntypedFunc creates a new UntypedFunc based on the provided +// UntypedOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where an UntypedFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func NewUntypedFunc(opts UntypedOpts, function func() float64) UntypedFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, function) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/value.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/value.go similarity index 66% rename from vendor/github.com/prometheus/client_golang/prometheus/value.go rename to vendor/github.com/m3db/prometheus_client_golang/prometheus/value.go index eb248f108..c7839d1f0 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/value.go +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/value.go @@ -14,12 +14,15 @@ package prometheus import ( + "errors" "fmt" + "math" "sort" + "sync/atomic" - "github.com/golang/protobuf/proto" + dto "github.com/m3db/prometheus_client_model/go" - dto "github.com/prometheus/client_model/go" + "github.com/golang/protobuf/proto" ) // ValueType is an enumeration of metric types that represent a simple value. @@ -33,6 +36,77 @@ const ( UntypedValue ) +var errInconsistentCardinality = errors.New("inconsistent label cardinality") + +// value is a generic metric for simple values. It implements Metric, Collector, +// Counter, Gauge, and Untyped. Its effective type is determined by +// ValueType. This is a low-level building block used by the library to back the +// implementations of Counter, Gauge, and Untyped. +type value struct { + // valBits containst the bits of the represented float64 value. It has + // to go first in the struct to guarantee alignment for atomic + // operations. http://golang.org/pkg/sync/atomic/#pkg-note-BUG + valBits uint64 + + selfCollector + + desc *Desc + valType ValueType + labelPairs []*dto.LabelPair +} + +// newValue returns a newly allocated value with the given Desc, ValueType, +// sample value and label values. It panics if the number of label +// values is different from the number of variable labels in Desc. +func newValue(desc *Desc, valueType ValueType, val float64, labelValues ...string) *value { + if len(labelValues) != len(desc.variableLabels) { + panic(errInconsistentCardinality) + } + result := &value{ + desc: desc, + valType: valueType, + valBits: math.Float64bits(val), + labelPairs: makeLabelPairs(desc, labelValues), + } + result.init(result) + return result +} + +func (v *value) Desc() *Desc { + return v.desc +} + +func (v *value) Set(val float64) { + atomic.StoreUint64(&v.valBits, math.Float64bits(val)) +} + +func (v *value) Inc() { + v.Add(1) +} + +func (v *value) Dec() { + v.Add(-1) +} + +func (v *value) Add(val float64) { + for { + oldBits := atomic.LoadUint64(&v.valBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + val) + if atomic.CompareAndSwapUint64(&v.valBits, oldBits, newBits) { + return + } + } +} + +func (v *value) Sub(val float64) { + v.Add(val * -1) +} + +func (v *value) Write(out *dto.Metric) error { + val := math.Float64frombits(atomic.LoadUint64(&v.valBits)) + return populateMetric(v.valType, val, v.labelPairs, out) +} + // valueFunc is a generic metric for simple values retrieved on collect time // from a function. It implements Metric and Collector. Its effective type is // determined by ValueType. This is a low-level building block used by the @@ -77,14 +151,10 @@ func (v *valueFunc) Write(out *dto.Metric) error { // operations. However, when implementing custom Collectors, it is useful as a // throw-away metric that is generated on the fly to send it to Prometheus in // the Collect method. NewConstMetric returns an error if the length of -// labelValues is not consistent with the variable labels in Desc or if Desc is -// invalid. +// labelValues is not consistent with the variable labels in Desc. func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) (Metric, error) { - if desc.err != nil { - return nil, desc.err - } - if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { - return nil, err + if len(desc.variableLabels) != len(labelValues) { + return nil, errInconsistentCardinality } return &constMetric{ desc: desc, @@ -156,7 +226,9 @@ func makeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { Value: proto.String(labelValues[i]), }) } - labelPairs = append(labelPairs, desc.constLabelPairs...) - sort.Sort(labelPairSorter(labelPairs)) + for _, lp := range desc.constLabelPairs { + labelPairs = append(labelPairs, lp) + } + sort.Sort(LabelPairSorter(labelPairs)) return labelPairs } diff --git a/vendor/github.com/m3db/prometheus_client_golang/prometheus/vec.go b/vendor/github.com/m3db/prometheus_client_golang/prometheus/vec.go new file mode 100644 index 000000000..1a4329938 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_golang/prometheus/vec.go @@ -0,0 +1,404 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sync" + + "github.com/m3db/prometheus_common/model" +) + +// MetricVec is a Collector to bundle metrics of the same name that +// differ in their label values. MetricVec is usually not used directly but as a +// building block for implementations of vectors of a given metric +// type. GaugeVec, CounterVec, SummaryVec, and UntypedVec are examples already +// provided in this package. +type MetricVec struct { + mtx sync.RWMutex // Protects the children. + children map[uint64][]metricWithLabelValues + desc *Desc + + newMetric func(labelValues ...string) Metric + hashAdd func(h uint64, s string) uint64 // replace hash function for testing collision handling + hashAddByte func(h uint64, b byte) uint64 +} + +// newMetricVec returns an initialized MetricVec. The concrete value is +// returned for embedding into another struct. +func newMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *MetricVec { + return &MetricVec{ + children: map[uint64][]metricWithLabelValues{}, + desc: desc, + newMetric: newMetric, + hashAdd: hashAdd, + hashAddByte: hashAddByte, + } +} + +// metricWithLabelValues provides the metric and its label values for +// disambiguation on hash collision. +type metricWithLabelValues struct { + values []string + metric Metric +} + +// Describe implements Collector. The length of the returned slice +// is always one. +func (m *MetricVec) Describe(ch chan<- *Desc) { + ch <- m.desc +} + +// Collect implements Collector. +func (m *MetricVec) Collect(ch chan<- Metric) { + m.mtx.RLock() + defer m.mtx.RUnlock() + + for _, metrics := range m.children { + for _, metric := range metrics { + ch <- metric.metric + } + } +} + +// GetMetricWithLabelValues returns the Metric for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Metric is created. +// +// It is possible to call this method without using the returned Metric to only +// create the new Metric but leave it at its start value (e.g. a Summary or +// Histogram without any observations). See also the SummaryVec example. +// +// Keeping the Metric for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Metric from the MetricVec. In that case, the +// Metric will still exist, but it will not be exported anymore, even if a +// Metric with the same label values is created later. See also the CounterVec +// example. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the GaugeVec example. +func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { + h, err := m.hashLabelValues(lvs) + if err != nil { + return nil, err + } + + return m.getOrCreateMetricWithLabelValues(h, lvs), nil +} + +// GetMetricWith returns the Metric for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Metric is created. Implications of +// creating a Metric without using it and keeping the Metric for later use are +// the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc. +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { + h, err := m.hashLabels(labels) + if err != nil { + return nil, err + } + + return m.getOrCreateMetricWithLabels(h, labels), nil +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics if an error +// occurs. The method allows neat syntax like: +// httpReqs.WithLabelValues("404", "POST").Inc() +func (m *MetricVec) WithLabelValues(lvs ...string) Metric { + metric, err := m.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return metric +} + +// With works as GetMetricWith, but panics if an error occurs. The method allows +// neat syntax like: +// httpReqs.With(Labels{"status":"404", "method":"POST"}).Inc() +func (m *MetricVec) With(labels Labels) Metric { + metric, err := m.GetMetricWith(labels) + if err != nil { + panic(err) + } + return metric +} + +// DeleteLabelValues removes the metric where the variable labels are the same +// as those passed in as labels (same order as the VariableLabels in Desc). It +// returns true if a metric was deleted. +// +// It is not an error if the number of label values is not the same as the +// number of VariableLabels in Desc. However, such inconsistent label count can +// never match an actual Metric, so the method will always return false in that +// case. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider Delete(Labels) as an +// alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the CounterVec example. +func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + h, err := m.hashLabelValues(lvs) + if err != nil { + return false + } + return m.deleteByHashWithLabelValues(h, lvs) +} + +// Delete deletes the metric where the variable labels are the same as those +// passed in as labels. It returns true if a metric was deleted. +// +// It is not an error if the number and names of the Labels are inconsistent +// with those of the VariableLabels in the Desc of the MetricVec. However, such +// inconsistent Labels can never match an actual Metric, so the method will +// always return false in that case. +// +// This method is used for the same purpose as DeleteLabelValues(...string). See +// there for pros and cons of the two methods. +func (m *MetricVec) Delete(labels Labels) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + h, err := m.hashLabels(labels) + if err != nil { + return false + } + + return m.deleteByHashWithLabels(h, labels) +} + +// deleteByHashWithLabelValues removes the metric from the hash bucket h. If +// there are multiple matches in the bucket, use lvs to select a metric and +// remove only that metric. +func (m *MetricVec) deleteByHashWithLabelValues(h uint64, lvs []string) bool { + metrics, ok := m.children[h] + if !ok { + return false + } + + i := m.findMetricWithLabelValues(metrics, lvs) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.children[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.children, h) + } + return true +} + +// deleteByHashWithLabels removes the metric from the hash bucket h. If there +// are multiple matches in the bucket, use lvs to select a metric and remove +// only that metric. +func (m *MetricVec) deleteByHashWithLabels(h uint64, labels Labels) bool { + metrics, ok := m.children[h] + if !ok { + return false + } + i := m.findMetricWithLabels(metrics, labels) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.children[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.children, h) + } + return true +} + +// Reset deletes all metrics in this vector. +func (m *MetricVec) Reset() { + m.mtx.Lock() + defer m.mtx.Unlock() + + for h := range m.children { + delete(m.children, h) + } +} + +func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) { + if len(vals) != len(m.desc.variableLabels) { + return 0, errInconsistentCardinality + } + h := hashNew() + for _, val := range vals { + h = m.hashAdd(h, val) + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { + if len(labels) != len(m.desc.variableLabels) { + return 0, errInconsistentCardinality + } + h := hashNew() + for _, label := range m.desc.variableLabels { + val, ok := labels[label] + if !ok { + return 0, fmt.Errorf("label name %q missing in label map", label) + } + h = m.hashAdd(h, val) + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *MetricVec) getOrCreateMetricWithLabelValues(hash uint64, lvs []string) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithLabelValues(hash, lvs) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithLabelValues(hash, lvs) + if !ok { + // Copy to avoid allocation in case wo don't go down this code path. + copiedLVs := make([]string, len(lvs)) + copy(copiedLVs, lvs) + metric = m.newMetric(copiedLVs...) + m.children[hash] = append(m.children[hash], metricWithLabelValues{values: copiedLVs, metric: metric}) + } + return metric +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *MetricVec) getOrCreateMetricWithLabels(hash uint64, labels Labels) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithLabels(hash, labels) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithLabels(hash, labels) + if !ok { + lvs := m.extractLabelValues(labels) + metric = m.newMetric(lvs...) + m.children[hash] = append(m.children[hash], metricWithLabelValues{values: lvs, metric: metric}) + } + return metric +} + +// getMetricWithLabelValues gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *MetricVec) getMetricWithLabelValues(h uint64, lvs []string) (Metric, bool) { + metrics, ok := m.children[h] + if ok { + if i := m.findMetricWithLabelValues(metrics, lvs); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// getMetricWithLabels gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *MetricVec) getMetricWithLabels(h uint64, labels Labels) (Metric, bool) { + metrics, ok := m.children[h] + if ok { + if i := m.findMetricWithLabels(metrics, labels); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// findMetricWithLabelValues returns the index of the matching metric or +// len(metrics) if not found. +func (m *MetricVec) findMetricWithLabelValues(metrics []metricWithLabelValues, lvs []string) int { + for i, metric := range metrics { + if m.matchLabelValues(metric.values, lvs) { + return i + } + } + return len(metrics) +} + +// findMetricWithLabels returns the index of the matching metric or len(metrics) +// if not found. +func (m *MetricVec) findMetricWithLabels(metrics []metricWithLabelValues, labels Labels) int { + for i, metric := range metrics { + if m.matchLabels(metric.values, labels) { + return i + } + } + return len(metrics) +} + +func (m *MetricVec) matchLabelValues(values []string, lvs []string) bool { + if len(values) != len(lvs) { + return false + } + for i, v := range values { + if v != lvs[i] { + return false + } + } + return true +} + +func (m *MetricVec) matchLabels(values []string, labels Labels) bool { + if len(labels) != len(values) { + return false + } + for i, k := range m.desc.variableLabels { + if values[i] != labels[k] { + return false + } + } + return true +} + +func (m *MetricVec) extractLabelValues(labels Labels) []string { + labelValues := make([]string, len(labels)) + for i, k := range m.desc.variableLabels { + labelValues[i] = labels[k] + } + return labelValues +} diff --git a/vendor/github.com/prometheus/client_golang/LICENSE b/vendor/github.com/m3db/prometheus_client_model/LICENSE similarity index 100% rename from vendor/github.com/prometheus/client_golang/LICENSE rename to vendor/github.com/m3db/prometheus_client_model/LICENSE diff --git a/vendor/github.com/prometheus/client_model/NOTICE b/vendor/github.com/m3db/prometheus_client_model/NOTICE similarity index 100% rename from vendor/github.com/prometheus/client_model/NOTICE rename to vendor/github.com/m3db/prometheus_client_model/NOTICE diff --git a/vendor/github.com/m3db/prometheus_client_model/go/metrics.pb.go b/vendor/github.com/m3db/prometheus_client_model/go/metrics.pb.go new file mode 100644 index 000000000..e509277e6 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_client_model/go/metrics.pb.go @@ -0,0 +1,360 @@ +// Code generated by protoc-gen-go. +// source: metrics.proto +// DO NOT EDIT! + +/* +Package io_prometheus_client is a generated protocol buffer package. + +It is generated from these files: + metrics.proto + +It has these top-level messages: + LabelPair + Gauge + Counter + Quantile + Summary + Untyped + Histogram + Bucket + Metric + MetricFamily +*/ +package io_prometheus_client + +import proto "github.com/golang/protobuf/proto" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = math.Inf + +type MetricType int32 + +const ( + MetricType_COUNTER MetricType = 0 + MetricType_GAUGE MetricType = 1 + MetricType_SUMMARY MetricType = 2 + MetricType_UNTYPED MetricType = 3 + MetricType_HISTOGRAM MetricType = 4 +) + +var MetricType_name = map[int32]string{ + 0: "COUNTER", + 1: "GAUGE", + 2: "SUMMARY", + 3: "UNTYPED", + 4: "HISTOGRAM", +} +var MetricType_value = map[string]int32{ + "COUNTER": 0, + "GAUGE": 1, + "SUMMARY": 2, + "UNTYPED": 3, + "HISTOGRAM": 4, +} + +func (x MetricType) Enum() *MetricType { + p := new(MetricType) + *p = x + return p +} +func (x MetricType) String() string { + return proto.EnumName(MetricType_name, int32(x)) +} +func (x *MetricType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MetricType_value, data, "MetricType") + if err != nil { + return err + } + *x = MetricType(value) + return nil +} + +type LabelPair struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LabelPair) Reset() { *m = LabelPair{} } +func (m *LabelPair) String() string { return proto.CompactTextString(m) } +func (*LabelPair) ProtoMessage() {} + +func (m *LabelPair) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *LabelPair) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +type Gauge struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Gauge) Reset() { *m = Gauge{} } +func (m *Gauge) String() string { return proto.CompactTextString(m) } +func (*Gauge) ProtoMessage() {} + +func (m *Gauge) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Counter struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Counter) Reset() { *m = Counter{} } +func (m *Counter) String() string { return proto.CompactTextString(m) } +func (*Counter) ProtoMessage() {} + +func (m *Counter) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Quantile struct { + Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Quantile) Reset() { *m = Quantile{} } +func (m *Quantile) String() string { return proto.CompactTextString(m) } +func (*Quantile) ProtoMessage() {} + +func (m *Quantile) GetQuantile() float64 { + if m != nil && m.Quantile != nil { + return *m.Quantile + } + return 0 +} + +func (m *Quantile) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Summary struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum" json:"sample_sum,omitempty"` + Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Summary) Reset() { *m = Summary{} } +func (m *Summary) String() string { return proto.CompactTextString(m) } +func (*Summary) ProtoMessage() {} + +func (m *Summary) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Summary) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Summary) GetQuantile() []*Quantile { + if m != nil { + return m.Quantile + } + return nil +} + +type Untyped struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Untyped) Reset() { *m = Untyped{} } +func (m *Untyped) String() string { return proto.CompactTextString(m) } +func (*Untyped) ProtoMessage() {} + +func (m *Untyped) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Histogram struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum" json:"sample_sum,omitempty"` + Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Histogram) Reset() { *m = Histogram{} } +func (m *Histogram) String() string { return proto.CompactTextString(m) } +func (*Histogram) ProtoMessage() {} + +func (m *Histogram) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Histogram) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Histogram) GetBucket() []*Bucket { + if m != nil { + return m.Bucket + } + return nil +} + +type Bucket struct { + CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count" json:"cumulative_count,omitempty"` + UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound" json:"upper_bound,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Bucket) Reset() { *m = Bucket{} } +func (m *Bucket) String() string { return proto.CompactTextString(m) } +func (*Bucket) ProtoMessage() {} + +func (m *Bucket) GetCumulativeCount() uint64 { + if m != nil && m.CumulativeCount != nil { + return *m.CumulativeCount + } + return 0 +} + +func (m *Bucket) GetUpperBound() float64 { + if m != nil && m.UpperBound != nil { + return *m.UpperBound + } + return 0 +} + +type Metric struct { + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` + Counter *Counter `protobuf:"bytes,3,opt,name=counter" json:"counter,omitempty"` + Summary *Summary `protobuf:"bytes,4,opt,name=summary" json:"summary,omitempty"` + Untyped *Untyped `protobuf:"bytes,5,opt,name=untyped" json:"untyped,omitempty"` + Histogram *Histogram `protobuf:"bytes,7,opt,name=histogram" json:"histogram,omitempty"` + TimestampMs *int64 `protobuf:"varint,6,opt,name=timestamp_ms" json:"timestamp_ms,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Metric) Reset() { *m = Metric{} } +func (m *Metric) String() string { return proto.CompactTextString(m) } +func (*Metric) ProtoMessage() {} + +func (m *Metric) GetLabel() []*LabelPair { + if m != nil { + return m.Label + } + return nil +} + +func (m *Metric) GetGauge() *Gauge { + if m != nil { + return m.Gauge + } + return nil +} + +func (m *Metric) GetCounter() *Counter { + if m != nil { + return m.Counter + } + return nil +} + +func (m *Metric) GetSummary() *Summary { + if m != nil { + return m.Summary + } + return nil +} + +func (m *Metric) GetUntyped() *Untyped { + if m != nil { + return m.Untyped + } + return nil +} + +func (m *Metric) GetHistogram() *Histogram { + if m != nil { + return m.Histogram + } + return nil +} + +func (m *Metric) GetTimestampMs() int64 { + if m != nil && m.TimestampMs != nil { + return *m.TimestampMs + } + return 0 +} + +type MetricFamily struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` + Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` + Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *MetricFamily) Reset() { *m = MetricFamily{} } +func (m *MetricFamily) String() string { return proto.CompactTextString(m) } +func (*MetricFamily) ProtoMessage() {} + +func (m *MetricFamily) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MetricFamily) GetHelp() string { + if m != nil && m.Help != nil { + return *m.Help + } + return "" +} + +func (m *MetricFamily) GetType() MetricType { + if m != nil && m.Type != nil { + return *m.Type + } + return MetricType_COUNTER +} + +func (m *MetricFamily) GetMetric() []*Metric { + if m != nil { + return m.Metric + } + return nil +} diff --git a/vendor/github.com/prometheus/client_model/LICENSE b/vendor/github.com/m3db/prometheus_common/LICENSE similarity index 100% rename from vendor/github.com/prometheus/client_model/LICENSE rename to vendor/github.com/m3db/prometheus_common/LICENSE diff --git a/vendor/github.com/prometheus/common/NOTICE b/vendor/github.com/m3db/prometheus_common/NOTICE similarity index 100% rename from vendor/github.com/prometheus/common/NOTICE rename to vendor/github.com/m3db/prometheus_common/NOTICE diff --git a/vendor/github.com/prometheus/common/expfmt/decode.go b/vendor/github.com/m3db/prometheus_common/expfmt/decode.go similarity index 99% rename from vendor/github.com/prometheus/common/expfmt/decode.go rename to vendor/github.com/m3db/prometheus_common/expfmt/decode.go index c092723e8..c877df030 100644 --- a/vendor/github.com/prometheus/common/expfmt/decode.go +++ b/vendor/github.com/m3db/prometheus_common/expfmt/decode.go @@ -20,10 +20,10 @@ import ( "mime" "net/http" - dto "github.com/prometheus/client_model/go" + dto "github.com/m3db/prometheus_client_model/go" + "github.com/m3db/prometheus_common/model" "github.com/matttproud/golang_protobuf_extensions/pbutil" - "github.com/prometheus/common/model" ) // Decoder types decode an input stream into metric families. diff --git a/vendor/github.com/prometheus/common/expfmt/encode.go b/vendor/github.com/m3db/prometheus_common/expfmt/encode.go similarity index 95% rename from vendor/github.com/prometheus/common/expfmt/encode.go rename to vendor/github.com/m3db/prometheus_common/expfmt/encode.go index 11839ed65..171b9aacc 100644 --- a/vendor/github.com/prometheus/common/expfmt/encode.go +++ b/vendor/github.com/m3db/prometheus_common/expfmt/encode.go @@ -19,10 +19,10 @@ import ( "net/http" "github.com/golang/protobuf/proto" + "github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg" "github.com/matttproud/golang_protobuf_extensions/pbutil" - "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" - dto "github.com/prometheus/client_model/go" + dto "github.com/m3db/prometheus_client_model/go" ) // Encoder types encode metric families into an underlying wire protocol. diff --git a/vendor/github.com/prometheus/common/expfmt/expfmt.go b/vendor/github.com/m3db/prometheus_common/expfmt/expfmt.go similarity index 100% rename from vendor/github.com/prometheus/common/expfmt/expfmt.go rename to vendor/github.com/m3db/prometheus_common/expfmt/expfmt.go diff --git a/vendor/github.com/prometheus/common/expfmt/fuzz.go b/vendor/github.com/m3db/prometheus_common/expfmt/fuzz.go similarity index 100% rename from vendor/github.com/prometheus/common/expfmt/fuzz.go rename to vendor/github.com/m3db/prometheus_common/expfmt/fuzz.go diff --git a/vendor/github.com/m3db/prometheus_common/expfmt/text_create.go b/vendor/github.com/m3db/prometheus_common/expfmt/text_create.go new file mode 100644 index 000000000..4957b63b8 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_common/expfmt/text_create.go @@ -0,0 +1,303 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "fmt" + "io" + "math" + "strings" + + dto "github.com/m3db/prometheus_client_model/go" + "github.com/m3db/prometheus_common/model" +) + +// MetricFamilyToText converts a MetricFamily proto message into text format and +// writes the resulting lines to 'out'. It returns the number of bytes written +// and any error encountered. The output will have the same order as the input, +// no further sorting is performed. Furthermore, this function assumes the input +// is already sanitized and does not perform any sanity checks. If the input +// contains duplicate metrics or invalid metric or label names, the conversion +// will result in invalid text format output. +// +// This method fulfills the type 'prometheus.encoder'. +func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (int, error) { + var written int + + // Fail-fast checks. + if len(in.Metric) == 0 { + return written, fmt.Errorf("MetricFamily has no metrics: %s", in) + } + name := in.GetName() + if name == "" { + return written, fmt.Errorf("MetricFamily has no name: %s", in) + } + + // Comments, first HELP, then TYPE. + if in.Help != nil { + n, err := fmt.Fprintf( + out, "# HELP %s %s\n", + name, escapeString(*in.Help, false), + ) + written += n + if err != nil { + return written, err + } + } + metricType := in.GetType() + n, err := fmt.Fprintf( + out, "# TYPE %s %s\n", + name, strings.ToLower(metricType.String()), + ) + written += n + if err != nil { + return written, err + } + + // Finally the samples, one line for each. + for _, metric := range in.Metric { + switch metricType { + case dto.MetricType_COUNTER: + if metric.Counter == nil { + return written, fmt.Errorf( + "expected counter in metric %s %s", name, metric, + ) + } + n, err = writeSample( + name, metric, "", "", + metric.Counter.GetValue(), + out, + ) + case dto.MetricType_GAUGE: + if metric.Gauge == nil { + return written, fmt.Errorf( + "expected gauge in metric %s %s", name, metric, + ) + } + n, err = writeSample( + name, metric, "", "", + metric.Gauge.GetValue(), + out, + ) + case dto.MetricType_UNTYPED: + if metric.Untyped == nil { + return written, fmt.Errorf( + "expected untyped in metric %s %s", name, metric, + ) + } + n, err = writeSample( + name, metric, "", "", + metric.Untyped.GetValue(), + out, + ) + case dto.MetricType_SUMMARY: + if metric.Summary == nil { + return written, fmt.Errorf( + "expected summary in metric %s %s", name, metric, + ) + } + for _, q := range metric.Summary.Quantile { + n, err = writeSample( + name, metric, + model.QuantileLabel, fmt.Sprint(q.GetQuantile()), + q.GetValue(), + out, + ) + written += n + if err != nil { + return written, err + } + } + n, err = writeSample( + name+"_sum", metric, "", "", + metric.Summary.GetSampleSum(), + out, + ) + if err != nil { + return written, err + } + written += n + n, err = writeSample( + name+"_count", metric, "", "", + float64(metric.Summary.GetSampleCount()), + out, + ) + case dto.MetricType_HISTOGRAM: + if metric.Histogram == nil { + return written, fmt.Errorf( + "expected histogram in metric %s %s", name, metric, + ) + } + infSeen := false + for _, q := range metric.Histogram.Bucket { + n, err = writeSample( + name+"_bucket", metric, + model.BucketLabel, fmt.Sprint(q.GetUpperBound()), + float64(q.GetCumulativeCount()), + out, + ) + written += n + if err != nil { + return written, err + } + if math.IsInf(q.GetUpperBound(), +1) { + infSeen = true + } + } + if !infSeen { + n, err = writeSample( + name+"_bucket", metric, + model.BucketLabel, "+Inf", + float64(metric.Histogram.GetSampleCount()), + out, + ) + if err != nil { + return written, err + } + written += n + } + n, err = writeSample( + name+"_sum", metric, "", "", + metric.Histogram.GetSampleSum(), + out, + ) + if err != nil { + return written, err + } + written += n + n, err = writeSample( + name+"_count", metric, "", "", + float64(metric.Histogram.GetSampleCount()), + out, + ) + default: + return written, fmt.Errorf( + "unexpected type in metric %s %s", name, metric, + ) + } + written += n + if err != nil { + return written, err + } + } + return written, nil +} + +// writeSample writes a single sample in text format to out, given the metric +// name, the metric proto message itself, optionally an additional label name +// and value (use empty strings if not required), and the value. The function +// returns the number of bytes written and any error encountered. +func writeSample( + name string, + metric *dto.Metric, + additionalLabelName, additionalLabelValue string, + value float64, + out io.Writer, +) (int, error) { + var written int + n, err := fmt.Fprint(out, name) + written += n + if err != nil { + return written, err + } + n, err = labelPairsToText( + metric.Label, + additionalLabelName, additionalLabelValue, + out, + ) + written += n + if err != nil { + return written, err + } + n, err = fmt.Fprintf(out, " %v", value) + written += n + if err != nil { + return written, err + } + if metric.TimestampMs != nil { + n, err = fmt.Fprintf(out, " %v", *metric.TimestampMs) + written += n + if err != nil { + return written, err + } + } + n, err = out.Write([]byte{'\n'}) + written += n + if err != nil { + return written, err + } + return written, nil +} + +// labelPairsToText converts a slice of LabelPair proto messages plus the +// explicitly given additional label pair into text formatted as required by the +// text format and writes it to 'out'. An empty slice in combination with an +// empty string 'additionalLabelName' results in nothing being +// written. Otherwise, the label pairs are written, escaped as required by the +// text format, and enclosed in '{...}'. The function returns the number of +// bytes written and any error encountered. +func labelPairsToText( + in []*dto.LabelPair, + additionalLabelName, additionalLabelValue string, + out io.Writer, +) (int, error) { + if len(in) == 0 && additionalLabelName == "" { + return 0, nil + } + var written int + separator := '{' + for _, lp := range in { + n, err := fmt.Fprintf( + out, `%c%s="%s"`, + separator, lp.GetName(), escapeString(lp.GetValue(), true), + ) + written += n + if err != nil { + return written, err + } + separator = ',' + } + if additionalLabelName != "" { + n, err := fmt.Fprintf( + out, `%c%s="%s"`, + separator, additionalLabelName, + escapeString(additionalLabelValue, true), + ) + written += n + if err != nil { + return written, err + } + } + n, err := out.Write([]byte{'}'}) + written += n + if err != nil { + return written, err + } + return written, nil +} + +var ( + escape = strings.NewReplacer("\\", `\\`, "\n", `\n`) + escapeWithDoubleQuote = strings.NewReplacer("\\", `\\`, "\n", `\n`, "\"", `\"`) +) + +// escapeString replaces '\' by '\\', new line character by '\n', and - if +// includeDoubleQuote is true - '"' by '\"'. +func escapeString(v string, includeDoubleQuote bool) string { + if includeDoubleQuote { + return escapeWithDoubleQuote.Replace(v) + } + + return escape.Replace(v) +} diff --git a/vendor/github.com/prometheus/common/expfmt/text_parse.go b/vendor/github.com/m3db/prometheus_common/expfmt/text_parse.go similarity index 99% rename from vendor/github.com/prometheus/common/expfmt/text_parse.go rename to vendor/github.com/m3db/prometheus_common/expfmt/text_parse.go index ec3d86ba7..6f34c20a4 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_parse.go +++ b/vendor/github.com/m3db/prometheus_common/expfmt/text_parse.go @@ -22,10 +22,10 @@ import ( "strconv" "strings" - dto "github.com/prometheus/client_model/go" + dto "github.com/m3db/prometheus_client_model/go" "github.com/golang/protobuf/proto" - "github.com/prometheus/common/model" + "github.com/m3db/prometheus_common/model" ) // A stateFn is a function that represents a state in a state machine. By @@ -359,7 +359,7 @@ func (p *TextParser) startLabelValue() stateFn { } return p.readingValue default: - p.parseError(fmt.Sprintf("unexpected end of label value %q", p.currentLabelPair.GetValue())) + p.parseError(fmt.Sprintf("unexpected end of label value %q", p.currentLabelPair.Value)) return nil } } diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt b/vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/README.txt similarity index 100% rename from vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt rename to vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/README.txt diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go b/vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/autoneg.go similarity index 100% rename from vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go rename to vendor/github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg/autoneg.go diff --git a/vendor/github.com/prometheus/common/model/alert.go b/vendor/github.com/m3db/prometheus_common/model/alert.go similarity index 100% rename from vendor/github.com/prometheus/common/model/alert.go rename to vendor/github.com/m3db/prometheus_common/model/alert.go diff --git a/vendor/github.com/prometheus/common/model/fingerprinting.go b/vendor/github.com/m3db/prometheus_common/model/fingerprinting.go similarity index 100% rename from vendor/github.com/prometheus/common/model/fingerprinting.go rename to vendor/github.com/m3db/prometheus_common/model/fingerprinting.go diff --git a/vendor/github.com/prometheus/common/model/fnv.go b/vendor/github.com/m3db/prometheus_common/model/fnv.go similarity index 100% rename from vendor/github.com/prometheus/common/model/fnv.go rename to vendor/github.com/m3db/prometheus_common/model/fnv.go diff --git a/vendor/github.com/prometheus/common/model/labels.go b/vendor/github.com/m3db/prometheus_common/model/labels.go similarity index 100% rename from vendor/github.com/prometheus/common/model/labels.go rename to vendor/github.com/m3db/prometheus_common/model/labels.go diff --git a/vendor/github.com/prometheus/common/model/labelset.go b/vendor/github.com/m3db/prometheus_common/model/labelset.go similarity index 100% rename from vendor/github.com/prometheus/common/model/labelset.go rename to vendor/github.com/m3db/prometheus_common/model/labelset.go diff --git a/vendor/github.com/prometheus/common/model/metric.go b/vendor/github.com/m3db/prometheus_common/model/metric.go similarity index 100% rename from vendor/github.com/prometheus/common/model/metric.go rename to vendor/github.com/m3db/prometheus_common/model/metric.go diff --git a/vendor/github.com/prometheus/common/model/model.go b/vendor/github.com/m3db/prometheus_common/model/model.go similarity index 100% rename from vendor/github.com/prometheus/common/model/model.go rename to vendor/github.com/m3db/prometheus_common/model/model.go diff --git a/vendor/github.com/prometheus/common/model/signature.go b/vendor/github.com/m3db/prometheus_common/model/signature.go similarity index 100% rename from vendor/github.com/prometheus/common/model/signature.go rename to vendor/github.com/m3db/prometheus_common/model/signature.go diff --git a/vendor/github.com/prometheus/common/model/silence.go b/vendor/github.com/m3db/prometheus_common/model/silence.go similarity index 100% rename from vendor/github.com/prometheus/common/model/silence.go rename to vendor/github.com/m3db/prometheus_common/model/silence.go diff --git a/vendor/github.com/prometheus/common/model/time.go b/vendor/github.com/m3db/prometheus_common/model/time.go similarity index 99% rename from vendor/github.com/prometheus/common/model/time.go rename to vendor/github.com/m3db/prometheus_common/model/time.go index 46259b1f1..74ed5a9f7 100644 --- a/vendor/github.com/prometheus/common/model/time.go +++ b/vendor/github.com/m3db/prometheus_common/model/time.go @@ -43,7 +43,7 @@ const ( // (1970-01-01 00:00 UTC) excluding leap seconds. type Time int64 -// Interval describes an interval between two timestamps. +// Interval describes and interval between two timestamps. type Interval struct { Start, End Time } diff --git a/vendor/github.com/prometheus/common/model/value.go b/vendor/github.com/m3db/prometheus_common/model/value.go similarity index 100% rename from vendor/github.com/prometheus/common/model/value.go rename to vendor/github.com/m3db/prometheus_common/model/value.go diff --git a/vendor/github.com/m3db/prometheus_procfs/.travis.yml b/vendor/github.com/m3db/prometheus_procfs/.travis.yml new file mode 100644 index 000000000..a9e28bf5d --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/.travis.yml @@ -0,0 +1,5 @@ +sudo: false +language: go +go: + - 1.6.4 + - 1.7.4 diff --git a/vendor/github.com/m3db/prometheus_procfs/AUTHORS.md b/vendor/github.com/m3db/prometheus_procfs/AUTHORS.md new file mode 100644 index 000000000..d55863560 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/AUTHORS.md @@ -0,0 +1,21 @@ +The Prometheus project was started by Matt T. Proud (emeritus) and +Julius Volz in 2012. + +Maintainers of this repository: + +* Tobias Schmidt + +The following individuals have contributed code to this repository +(listed in alphabetical order): + +* Armen Baghumian +* Bjoern Rabenstein +* David Cournapeau +* Ji-Hoon, Seol +* Jonas Große Sundrup +* Julius Volz +* Matt Layher +* Matthias Rampke +* Nicky Gerritsen +* Rémi Audebert +* Tobias Schmidt diff --git a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md b/vendor/github.com/m3db/prometheus_procfs/CONTRIBUTING.md similarity index 81% rename from vendor/github.com/prometheus/procfs/CONTRIBUTING.md rename to vendor/github.com/m3db/prometheus_procfs/CONTRIBUTING.md index 40503edbf..5705f0fbe 100644 --- a/vendor/github.com/prometheus/procfs/CONTRIBUTING.md +++ b/vendor/github.com/m3db/prometheus_procfs/CONTRIBUTING.md @@ -2,9 +2,9 @@ Prometheus uses GitHub to manage reviews of pull requests. -* If you have a trivial fix or improvement, go ahead and create a pull request, - addressing (with `@...`) the maintainer of this repository (see - [MAINTAINERS.md](MAINTAINERS.md)) in the description of the pull request. +* If you have a trivial fix or improvement, go ahead and create a pull + request, addressing (with `@...`) one or more of the maintainers + (see [AUTHORS.md](AUTHORS.md)) in the description of the pull request. * If you plan to do something more involved, first discuss your ideas on our [mailing list](https://groups.google.com/forum/?fromgroups#!forum/prometheus-developers). diff --git a/vendor/github.com/prometheus/common/LICENSE b/vendor/github.com/m3db/prometheus_procfs/LICENSE similarity index 100% rename from vendor/github.com/prometheus/common/LICENSE rename to vendor/github.com/m3db/prometheus_procfs/LICENSE diff --git a/vendor/github.com/m3db/prometheus_procfs/Makefile b/vendor/github.com/m3db/prometheus_procfs/Makefile new file mode 100644 index 000000000..c264a49d1 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/Makefile @@ -0,0 +1,6 @@ +ci: + ! gofmt -l *.go | read nothing + go vet + go test -v ./... + go get github.com/golang/lint/golint + golint *.go diff --git a/vendor/github.com/prometheus/procfs/NOTICE b/vendor/github.com/m3db/prometheus_procfs/NOTICE similarity index 100% rename from vendor/github.com/prometheus/procfs/NOTICE rename to vendor/github.com/m3db/prometheus_procfs/NOTICE diff --git a/vendor/github.com/prometheus/procfs/README.md b/vendor/github.com/m3db/prometheus_procfs/README.md similarity index 78% rename from vendor/github.com/prometheus/procfs/README.md rename to vendor/github.com/m3db/prometheus_procfs/README.md index 209549471..6e7ee6b8b 100644 --- a/vendor/github.com/prometheus/procfs/README.md +++ b/vendor/github.com/m3db/prometheus_procfs/README.md @@ -8,4 +8,3 @@ backwards-incompatible ways without warnings. Use it at your own risk. [![GoDoc](https://godoc.org/github.com/prometheus/procfs?status.png)](https://godoc.org/github.com/prometheus/procfs) [![Build Status](https://travis-ci.org/prometheus/procfs.svg?branch=master)](https://travis-ci.org/prometheus/procfs) -[![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/procfs)](https://goreportcard.com/report/github.com/prometheus/procfs) diff --git a/vendor/github.com/prometheus/procfs/doc.go b/vendor/github.com/m3db/prometheus_procfs/doc.go similarity index 100% rename from vendor/github.com/prometheus/procfs/doc.go rename to vendor/github.com/m3db/prometheus_procfs/doc.go diff --git a/vendor/github.com/m3db/prometheus_procfs/fs.go b/vendor/github.com/m3db/prometheus_procfs/fs.go new file mode 100644 index 000000000..49aaab050 --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/fs.go @@ -0,0 +1,33 @@ +package procfs + +import ( + "fmt" + "os" + "path" +) + +// FS represents the pseudo-filesystem proc, which provides an interface to +// kernel data structures. +type FS string + +// DefaultMountPoint is the common mount point of the proc filesystem. +const DefaultMountPoint = "/proc" + +// NewFS returns a new FS mounted under the given mountPoint. It will error +// if the mount point can't be read. +func NewFS(mountPoint string) (FS, error) { + info, err := os.Stat(mountPoint) + if err != nil { + return "", fmt.Errorf("could not read %s: %s", mountPoint, err) + } + if !info.IsDir() { + return "", fmt.Errorf("mount point %s is not a directory", mountPoint) + } + + return FS(mountPoint), nil +} + +// Path returns the path of the given subsystem relative to the procfs root. +func (fs FS) Path(p ...string) string { + return path.Join(append([]string{string(fs)}, p...)...) +} diff --git a/vendor/github.com/prometheus/procfs/ipvs.go b/vendor/github.com/m3db/prometheus_procfs/ipvs.go similarity index 78% rename from vendor/github.com/prometheus/procfs/ipvs.go rename to vendor/github.com/m3db/prometheus_procfs/ipvs.go index e36d4a3bd..e7012f732 100644 --- a/vendor/github.com/prometheus/procfs/ipvs.go +++ b/vendor/github.com/m3db/prometheus_procfs/ipvs.go @@ -1,16 +1,3 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package procfs import ( @@ -44,16 +31,14 @@ type IPVSStats struct { type IPVSBackendStatus struct { // The local (virtual) IP address. LocalAddress net.IP - // The remote (real) IP address. - RemoteAddress net.IP // The local (virtual) port. LocalPort uint16 - // The remote (real) port. - RemotePort uint16 - // The local firewall mark - LocalMark string // The transport protocol (TCP, UDP). Proto string + // The remote (real) IP address. + RemoteAddress net.IP + // The remote (real) port. + RemotePort uint16 // The current number of active connections for this virtual/real address pair. ActiveConn uint64 // The current number of inactive connections for this virtual/real address pair. @@ -157,14 +142,13 @@ func parseIPVSBackendStatus(file io.Reader) ([]IPVSBackendStatus, error) { status []IPVSBackendStatus scanner = bufio.NewScanner(file) proto string - localMark string localAddress net.IP localPort uint16 err error ) for scanner.Scan() { - fields := strings.Fields(scanner.Text()) + fields := strings.Fields(string(scanner.Text())) if len(fields) == 0 { continue } @@ -176,19 +160,10 @@ func parseIPVSBackendStatus(file io.Reader) ([]IPVSBackendStatus, error) { continue } proto = fields[0] - localMark = "" localAddress, localPort, err = parseIPPort(fields[1]) if err != nil { return nil, err } - case fields[0] == "FWM": - if len(fields) < 2 { - continue - } - proto = fields[0] - localMark = fields[1] - localAddress = nil - localPort = 0 case fields[0] == "->": if len(fields) < 6 { continue @@ -212,7 +187,6 @@ func parseIPVSBackendStatus(file io.Reader) ([]IPVSBackendStatus, error) { status = append(status, IPVSBackendStatus{ LocalAddress: localAddress, LocalPort: localPort, - LocalMark: localMark, RemoteAddress: remoteAddress, RemotePort: remotePort, Proto: proto, @@ -226,31 +200,22 @@ func parseIPVSBackendStatus(file io.Reader) ([]IPVSBackendStatus, error) { } func parseIPPort(s string) (net.IP, uint16, error) { - var ( - ip net.IP - err error - ) + tmp := strings.SplitN(s, ":", 2) - switch len(s) { - case 13: - ip, err = hex.DecodeString(s[0:8]) - if err != nil { - return nil, 0, err - } - case 46: - ip = net.ParseIP(s[1:40]) - if ip == nil { - return nil, 0, fmt.Errorf("invalid IPv6 address: %s", s[1:40]) - } - default: - return nil, 0, fmt.Errorf("unexpected IP:Port: %s", s) + if len(tmp) != 2 { + return nil, 0, fmt.Errorf("invalid IP:Port: %s", s) } - portString := s[len(s)-4:] - if len(portString) != 4 { - return nil, 0, fmt.Errorf("unexpected port string format: %s", portString) + if len(tmp[0]) != 8 && len(tmp[0]) != 32 { + return nil, 0, fmt.Errorf("invalid IP: %s", tmp[0]) } - port, err := strconv.ParseUint(portString, 16, 16) + + ip, err := hex.DecodeString(tmp[0]) + if err != nil { + return nil, 0, err + } + + port, err := strconv.ParseUint(tmp[1], 16, 16) if err != nil { return nil, 0, err } diff --git a/vendor/github.com/prometheus/procfs/mdstat.go b/vendor/github.com/m3db/prometheus_procfs/mdstat.go similarity index 85% rename from vendor/github.com/prometheus/procfs/mdstat.go rename to vendor/github.com/m3db/prometheus_procfs/mdstat.go index 9dc19583d..d7a248c0d 100644 --- a/vendor/github.com/prometheus/procfs/mdstat.go +++ b/vendor/github.com/m3db/prometheus_procfs/mdstat.go @@ -1,16 +1,3 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package procfs import ( diff --git a/vendor/github.com/prometheus/procfs/mountstats.go b/vendor/github.com/m3db/prometheus_procfs/mountstats.go similarity index 86% rename from vendor/github.com/prometheus/procfs/mountstats.go rename to vendor/github.com/m3db/prometheus_procfs/mountstats.go index 7a8a1e099..47ab0a744 100644 --- a/vendor/github.com/prometheus/procfs/mountstats.go +++ b/vendor/github.com/m3db/prometheus_procfs/mountstats.go @@ -1,16 +1,3 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package procfs // While implementing parsing of /proc/[pid]/mountstats, this blog was used @@ -39,11 +26,8 @@ const ( statVersion10 = "1.0" statVersion11 = "1.1" - fieldTransport10TCPLen = 10 - fieldTransport10UDPLen = 7 - - fieldTransport11TCPLen = 13 - fieldTransport11UDPLen = 10 + fieldTransport10Len = 10 + fieldTransport11Len = 13 ) // A Mount is a device mount parsed from /proc/[pid]/mountstats. @@ -139,7 +123,7 @@ type NFSEventsStats struct { VFSFlush uint64 // Number of times fsync() has been called on directories and files. VFSFsync uint64 - // Number of times locking has been attempted on a file. + // Number of times locking has been attemped on a file. VFSLock uint64 // Number of times files have been closed and released. VFSFileRelease uint64 @@ -189,8 +173,6 @@ type NFSOperationStats struct { // A NFSTransportStats contains statistics for the NFS mount RPC requests and // responses. type NFSTransportStats struct { - // The transport protocol used for the NFS mount. - Protocol string // The local port used for the NFS mount. Port uint64 // Number of times the client has had to establish a connection from scratch @@ -365,7 +347,7 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e return nil, fmt.Errorf("not enough information for NFS transport stats: %v", ss) } - tstats, err := parseNFSTransportStats(ss[1:], statVersion) + tstats, err := parseNFSTransportStats(ss[2:], statVersion) if err != nil { return nil, err } @@ -374,7 +356,7 @@ func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, e } // When encountering "per-operation statistics", we must break this - // loop and parse them separately to ensure we can terminate parsing + // loop and parse them seperately to ensure we can terminate parsing // before reaching another device entry; hence why this 'if' statement // is not just another switch case if ss[0] == fieldPerOpStats { @@ -527,33 +509,13 @@ func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { // parseNFSTransportStats parses a NFSTransportStats line using an input set of // integer fields matched to a specific stats version. func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats, error) { - // Extract the protocol field. It is the only string value in the line - protocol := ss[0] - ss = ss[1:] - switch statVersion { case statVersion10: - var expectedLength int - if protocol == "tcp" { - expectedLength = fieldTransport10TCPLen - } else if protocol == "udp" { - expectedLength = fieldTransport10UDPLen - } else { - return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.0 statement: %v", protocol, ss) - } - if len(ss) != expectedLength { + if len(ss) != fieldTransport10Len { return nil, fmt.Errorf("invalid NFS transport stats 1.0 statement: %v", ss) } case statVersion11: - var expectedLength int - if protocol == "tcp" { - expectedLength = fieldTransport11TCPLen - } else if protocol == "udp" { - expectedLength = fieldTransport11UDPLen - } else { - return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.1 statement: %v", protocol, ss) - } - if len(ss) != expectedLength { + if len(ss) != fieldTransport11Len { return nil, fmt.Errorf("invalid NFS transport stats 1.1 statement: %v", ss) } default: @@ -561,34 +523,18 @@ func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats } // Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay - // in a v1.0 response. Since the stat length is bigger for TCP stats, we use - // the TCP length here. - // - // Note: slice length must be set to length of v1.1 stats to avoid a panic when - // only v1.0 stats are present. - // See: https://github.com/prometheus/node_exporter/issues/571. - ns := make([]uint64, fieldTransport11TCPLen) - for i, s := range ss { + // in a v1.0 response + ns := make([]uint64, 0, fieldTransport11Len) + for _, s := range ss { n, err := strconv.ParseUint(s, 10, 64) if err != nil { return nil, err } - ns[i] = n - } - - // The fields differ depending on the transport protocol (TCP or UDP) - // From https://utcc.utoronto.ca/%7Ecks/space/blog/linux/NFSMountstatsXprt - // - // For the udp RPC transport there is no connection count, connect idle time, - // or idle time (fields #3, #4, and #5); all other fields are the same. So - // we set them to 0 here. - if protocol == "udp" { - ns = append(ns[:2], append(make([]uint64, 3), ns[2:]...)...) + ns = append(ns, n) } return &NFSTransportStats{ - Protocol: protocol, Port: ns[0], Bind: ns[1], Connect: ns[2], diff --git a/vendor/github.com/prometheus/procfs/proc.go b/vendor/github.com/m3db/prometheus_procfs/proc.go similarity index 80% rename from vendor/github.com/prometheus/procfs/proc.go rename to vendor/github.com/m3db/prometheus_procfs/proc.go index 06bed0ef4..8717e1fe0 100644 --- a/vendor/github.com/prometheus/procfs/proc.go +++ b/vendor/github.com/m3db/prometheus_procfs/proc.go @@ -1,20 +1,6 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package procfs import ( - "bytes" "fmt" "io/ioutil" "os" @@ -127,7 +113,7 @@ func (p Proc) CmdLine() ([]string, error) { return []string{}, nil } - return strings.Split(string(bytes.TrimRight(data, string("\x00"))), string(byte(0))), nil + return strings.Split(string(data[:len(data)-1]), string(byte(0))), nil } // Comm returns the command name of a process. @@ -156,26 +142,6 @@ func (p Proc) Executable() (string, error) { return exe, err } -// Cwd returns the absolute path to the current working directory of the process. -func (p Proc) Cwd() (string, error) { - wd, err := os.Readlink(p.path("cwd")) - if os.IsNotExist(err) { - return "", nil - } - - return wd, err -} - -// RootDir returns the absolute path to the process's root directory (as set by chroot) -func (p Proc) RootDir() (string, error) { - rdir, err := os.Readlink(p.path("root")) - if os.IsNotExist(err) { - return "", nil - } - - return rdir, err -} - // FileDescriptors returns the currently open file descriptors of a process. func (p Proc) FileDescriptors() ([]uintptr, error) { names, err := p.fileDescriptors() diff --git a/vendor/github.com/prometheus/procfs/proc_io.go b/vendor/github.com/m3db/prometheus_procfs/proc_io.go similarity index 63% rename from vendor/github.com/prometheus/procfs/proc_io.go rename to vendor/github.com/m3db/prometheus_procfs/proc_io.go index 0251c83bf..b4e31d7ba 100644 --- a/vendor/github.com/prometheus/procfs/proc_io.go +++ b/vendor/github.com/m3db/prometheus_procfs/proc_io.go @@ -1,16 +1,3 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package procfs import ( @@ -60,6 +47,9 @@ func (p Proc) NewIO() (ProcIO, error) { _, err = fmt.Sscanf(string(data), ioFormat, &pio.RChar, &pio.WChar, &pio.SyscR, &pio.SyscW, &pio.ReadBytes, &pio.WriteBytes, &pio.CancelledWriteBytes) + if err != nil { + return pio, err + } - return pio, err + return pio, nil } diff --git a/vendor/github.com/prometheus/procfs/proc_limits.go b/vendor/github.com/m3db/prometheus_procfs/proc_limits.go similarity index 78% rename from vendor/github.com/prometheus/procfs/proc_limits.go rename to vendor/github.com/m3db/prometheus_procfs/proc_limits.go index f04ba6fda..2df997ce1 100644 --- a/vendor/github.com/prometheus/procfs/proc_limits.go +++ b/vendor/github.com/m3db/prometheus_procfs/proc_limits.go @@ -1,16 +1,3 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package procfs import ( @@ -26,46 +13,46 @@ import ( // http://man7.org/linux/man-pages/man2/getrlimit.2.html. type ProcLimits struct { // CPU time limit in seconds. - CPUTime int64 + CPUTime int // Maximum size of files that the process may create. - FileSize int64 + FileSize int // Maximum size of the process's data segment (initialized data, // uninitialized data, and heap). - DataSize int64 + DataSize int // Maximum size of the process stack in bytes. - StackSize int64 + StackSize int // Maximum size of a core file. - CoreFileSize int64 + CoreFileSize int // Limit of the process's resident set in pages. - ResidentSet int64 + ResidentSet int // Maximum number of processes that can be created for the real user ID of // the calling process. - Processes int64 + Processes int // Value one greater than the maximum file descriptor number that can be // opened by this process. - OpenFiles int64 + OpenFiles int // Maximum number of bytes of memory that may be locked into RAM. - LockedMemory int64 + LockedMemory int // Maximum size of the process's virtual memory address space in bytes. - AddressSpace int64 + AddressSpace int // Limit on the combined number of flock(2) locks and fcntl(2) leases that // this process may establish. - FileLocks int64 + FileLocks int // Limit of signals that may be queued for the real user ID of the calling // process. - PendingSignals int64 + PendingSignals int // Limit on the number of bytes that can be allocated for POSIX message // queues for the real user ID of the calling process. - MsqqueueSize int64 + MsqqueueSize int // Limit of the nice priority set using setpriority(2) or nice(2). - NicePriority int64 + NicePriority int // Limit of the real-time priority set using sched_setscheduler(2) or // sched_setparam(2). - RealtimePriority int64 + RealtimePriority int // Limit (in microseconds) on the amount of CPU time that a process // scheduled under a real-time scheduling policy may consume without making // a blocking system call. - RealtimeTimeout int64 + RealtimeTimeout int } const ( @@ -138,13 +125,13 @@ func (p Proc) NewLimits() (ProcLimits, error) { return l, s.Err() } -func parseInt(s string) (int64, error) { +func parseInt(s string) (int, error) { if s == limitsUnlimited { return -1, nil } - i, err := strconv.ParseInt(s, 10, 64) + i, err := strconv.ParseInt(s, 10, 32) if err != nil { return 0, fmt.Errorf("couldn't parse value %s: %s", s, err) } - return i, nil + return int(i), nil } diff --git a/vendor/github.com/prometheus/procfs/proc_stat.go b/vendor/github.com/m3db/prometheus_procfs/proc_stat.go similarity index 88% rename from vendor/github.com/prometheus/procfs/proc_stat.go rename to vendor/github.com/m3db/prometheus_procfs/proc_stat.go index 3cf2a9f18..724e271b9 100644 --- a/vendor/github.com/prometheus/procfs/proc_stat.go +++ b/vendor/github.com/m3db/prometheus_procfs/proc_stat.go @@ -1,16 +1,3 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package procfs import ( diff --git a/vendor/github.com/m3db/prometheus_procfs/stat.go b/vendor/github.com/m3db/prometheus_procfs/stat.go new file mode 100644 index 000000000..1ca217e8c --- /dev/null +++ b/vendor/github.com/m3db/prometheus_procfs/stat.go @@ -0,0 +1,56 @@ +package procfs + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +// Stat represents kernel/system statistics. +type Stat struct { + // Boot time in seconds since the Epoch. + BootTime int64 +} + +// NewStat returns kernel/system statistics read from /proc/stat. +func NewStat() (Stat, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Stat{}, err + } + + return fs.NewStat() +} + +// NewStat returns an information about current kernel/system statistics. +func (fs FS) NewStat() (Stat, error) { + f, err := os.Open(fs.Path("stat")) + if err != nil { + return Stat{}, err + } + defer f.Close() + + s := bufio.NewScanner(f) + for s.Scan() { + line := s.Text() + if !strings.HasPrefix(line, "btime") { + continue + } + fields := strings.Fields(line) + if len(fields) != 2 { + return Stat{}, fmt.Errorf("couldn't parse %s line %s", f.Name(), line) + } + i, err := strconv.ParseInt(fields[1], 10, 32) + if err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s: %s", fields[1], err) + } + return Stat{BootTime: i}, nil + } + if err := s.Err(); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s: %s", f.Name(), err) + } + + return Stat{}, fmt.Errorf("couldn't parse %s, missing btime", f.Name()) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/collector.go b/vendor/github.com/prometheus/client_golang/prometheus/collector.go deleted file mode 100644 index c0d70b2fa..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/collector.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -// Collector is the interface implemented by anything that can be used by -// Prometheus to collect metrics. A Collector has to be registered for -// collection. See Registerer.Register. -// -// The stock metrics provided by this package (Gauge, Counter, Summary, -// Histogram, Untyped) are also Collectors (which only ever collect one metric, -// namely itself). An implementer of Collector may, however, collect multiple -// metrics in a coordinated fashion and/or create metrics on the fly. Examples -// for collectors already implemented in this library are the metric vectors -// (i.e. collection of multiple instances of the same Metric but with different -// label values) like GaugeVec or SummaryVec, and the ExpvarCollector. -type Collector interface { - // Describe sends the super-set of all possible descriptors of metrics - // collected by this Collector to the provided channel and returns once - // the last descriptor has been sent. The sent descriptors fulfill the - // consistency and uniqueness requirements described in the Desc - // documentation. - // - // It is valid if one and the same Collector sends duplicate - // descriptors. Those duplicates are simply ignored. However, two - // different Collectors must not send duplicate descriptors. - // - // Sending no descriptor at all marks the Collector as “unchecked”, - // i.e. no checks will be performed at registration time, and the - // Collector may yield any Metric it sees fit in its Collect method. - // - // This method idempotently sends the same descriptors throughout the - // lifetime of the Collector. It may be called concurrently and - // therefore must be implemented in a concurrency safe way. - // - // If a Collector encounters an error while executing this method, it - // must send an invalid descriptor (created with NewInvalidDesc) to - // signal the error to the registry. - Describe(chan<- *Desc) - // Collect is called by the Prometheus registry when collecting - // metrics. The implementation sends each collected metric via the - // provided channel and returns once the last metric has been sent. The - // descriptor of each sent metric is one of those returned by Describe - // (unless the Collector is unchecked, see above). Returned metrics that - // share the same descriptor must differ in their variable label - // values. - // - // This method may be called concurrently and must therefore be - // implemented in a concurrency safe way. Blocking occurs at the expense - // of total performance of rendering all registered metrics. Ideally, - // Collector implementations support concurrent readers. - Collect(chan<- Metric) -} - -// DescribeByCollect is a helper to implement the Describe method of a custom -// Collector. It collects the metrics from the provided Collector and sends -// their descriptors to the provided channel. -// -// If a Collector collects the same metrics throughout its lifetime, its -// Describe method can simply be implemented as: -// -// func (c customCollector) Describe(ch chan<- *Desc) { -// DescribeByCollect(c, ch) -// } -// -// However, this will not work if the metrics collected change dynamically over -// the lifetime of the Collector in a way that their combined set of descriptors -// changes as well. The shortcut implementation will then violate the contract -// of the Describe method. If a Collector sometimes collects no metrics at all -// (for example vectors like CounterVec, GaugeVec, etc., which only collect -// metrics after a metric with a fully specified label set has been accessed), -// it might even get registered as an unchecked Collecter (cf. the Register -// method of the Registerer interface). Hence, only use this shortcut -// implementation of Describe if you are certain to fulfill the contract. -// -// The Collector example demonstrates a use of DescribeByCollect. -func DescribeByCollect(c Collector, descs chan<- *Desc) { - metrics := make(chan Metric) - go func() { - c.Collect(metrics) - close(metrics) - }() - for m := range metrics { - descs <- m.Desc() - } -} - -// selfCollector implements Collector for a single Metric so that the Metric -// collects itself. Add it as an anonymous field to a struct that implements -// Metric, and call init with the Metric itself as an argument. -type selfCollector struct { - self Metric -} - -// init provides the selfCollector with a reference to the metric it is supposed -// to collect. It is usually called within the factory function to create a -// metric. See example. -func (c *selfCollector) init(self Metric) { - c.self = self -} - -// Describe implements Collector. -func (c *selfCollector) Describe(ch chan<- *Desc) { - ch <- c.self.Desc() -} - -// Collect implements Collector. -func (c *selfCollector) Collect(ch chan<- Metric) { - ch <- c.self -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/vendor/github.com/prometheus/client_golang/prometheus/counter.go deleted file mode 100644 index d463e36d3..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/counter.go +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "errors" - "math" - "sync/atomic" - - dto "github.com/prometheus/client_model/go" -) - -// Counter is a Metric that represents a single numerical value that only ever -// goes up. That implies that it cannot be used to count items whose number can -// also go down, e.g. the number of currently running goroutines. Those -// "counters" are represented by Gauges. -// -// A Counter is typically used to count requests served, tasks completed, errors -// occurred, etc. -// -// To create Counter instances, use NewCounter. -type Counter interface { - Metric - Collector - - // Inc increments the counter by 1. Use Add to increment it by arbitrary - // non-negative values. - Inc() - // Add adds the given value to the counter. It panics if the value is < - // 0. - Add(float64) -} - -// CounterOpts is an alias for Opts. See there for doc comments. -type CounterOpts Opts - -// NewCounter creates a new Counter based on the provided CounterOpts. -// -// The returned implementation tracks the counter value in two separate -// variables, a float64 and a uint64. The latter is used to track calls of the -// Inc method and calls of the Add method with a value that can be represented -// as a uint64. This allows atomic increments of the counter with optimal -// performance. (It is common to have an Inc call in very hot execution paths.) -// Both internal tracking values are added up in the Write method. This has to -// be taken into account when it comes to precision and overflow behavior. -func NewCounter(opts CounterOpts) Counter { - desc := NewDesc( - BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), - opts.Help, - nil, - opts.ConstLabels, - ) - result := &counter{desc: desc, labelPairs: desc.constLabelPairs} - result.init(result) // Init self-collection. - return result -} - -type counter struct { - // valBits contains the bits of the represented float64 value, while - // valInt stores values that are exact integers. Both have to go first - // in the struct to guarantee alignment for atomic operations. - // http://golang.org/pkg/sync/atomic/#pkg-note-BUG - valBits uint64 - valInt uint64 - - selfCollector - desc *Desc - - labelPairs []*dto.LabelPair -} - -func (c *counter) Desc() *Desc { - return c.desc -} - -func (c *counter) Add(v float64) { - if v < 0 { - panic(errors.New("counter cannot decrease in value")) - } - ival := uint64(v) - if float64(ival) == v { - atomic.AddUint64(&c.valInt, ival) - return - } - - for { - oldBits := atomic.LoadUint64(&c.valBits) - newBits := math.Float64bits(math.Float64frombits(oldBits) + v) - if atomic.CompareAndSwapUint64(&c.valBits, oldBits, newBits) { - return - } - } -} - -func (c *counter) Inc() { - atomic.AddUint64(&c.valInt, 1) -} - -func (c *counter) Write(out *dto.Metric) error { - fval := math.Float64frombits(atomic.LoadUint64(&c.valBits)) - ival := atomic.LoadUint64(&c.valInt) - val := fval + float64(ival) - - return populateMetric(CounterValue, val, c.labelPairs, out) -} - -// CounterVec is a Collector that bundles a set of Counters that all share the -// same Desc, but have different values for their variable labels. This is used -// if you want to count the same thing partitioned by various dimensions -// (e.g. number of HTTP requests, partitioned by response code and -// method). Create instances with NewCounterVec. -type CounterVec struct { - *metricVec -} - -// NewCounterVec creates a new CounterVec based on the provided CounterOpts and -// partitioned by the given label names. -func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { - desc := NewDesc( - BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), - opts.Help, - labelNames, - opts.ConstLabels, - ) - return &CounterVec{ - metricVec: newMetricVec(desc, func(lvs ...string) Metric { - if len(lvs) != len(desc.variableLabels) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) - } - result := &counter{desc: desc, labelPairs: makeLabelPairs(desc, lvs)} - result.init(result) // Init self-collection. - return result - }), - } -} - -// GetMetricWithLabelValues returns the Counter for the given slice of label -// values (same order as the VariableLabels in Desc). If that combination of -// label values is accessed for the first time, a new Counter is created. -// -// It is possible to call this method without using the returned Counter to only -// create the new Counter but leave it at its starting value 0. See also the -// SummaryVec example. -// -// Keeping the Counter for later use is possible (and should be considered if -// performance is critical), but keep in mind that Reset, DeleteLabelValues and -// Delete can be used to delete the Counter from the CounterVec. In that case, -// the Counter will still exist, but it will not be exported anymore, even if a -// Counter with the same label values is created later. -// -// An error is returned if the number of label values is not the same as the -// number of VariableLabels in Desc (minus any curried labels). -// -// Note that for more than one label value, this method is prone to mistakes -// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as -// an alternative to avoid that type of mistake. For higher label numbers, the -// latter has a much more readable (albeit more verbose) syntax, but it comes -// with a performance overhead (for creating and processing the Labels map). -// See also the GaugeVec example. -func (v *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter, error) { - metric, err := v.metricVec.getMetricWithLabelValues(lvs...) - if metric != nil { - return metric.(Counter), err - } - return nil, err -} - -// GetMetricWith returns the Counter for the given Labels map (the label names -// must match those of the VariableLabels in Desc). If that label map is -// accessed for the first time, a new Counter is created. Implications of -// creating a Counter without using it and keeping the Counter for later use are -// the same as for GetMetricWithLabelValues. -// -// An error is returned if the number and names of the Labels are inconsistent -// with those of the VariableLabels in Desc (minus any curried labels). -// -// This method is used for the same purpose as -// GetMetricWithLabelValues(...string). See there for pros and cons of the two -// methods. -func (v *CounterVec) GetMetricWith(labels Labels) (Counter, error) { - metric, err := v.metricVec.getMetricWith(labels) - if metric != nil { - return metric.(Counter), err - } - return nil, err -} - -// WithLabelValues works as GetMetricWithLabelValues, but panics where -// GetMetricWithLabelValues would have returned an error. Not returning an -// error allows shortcuts like -// myVec.WithLabelValues("404", "GET").Add(42) -func (v *CounterVec) WithLabelValues(lvs ...string) Counter { - c, err := v.GetMetricWithLabelValues(lvs...) - if err != nil { - panic(err) - } - return c -} - -// With works as GetMetricWith, but panics where GetMetricWithLabels would have -// returned an error. Not returning an error allows shortcuts like -// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Add(42) -func (v *CounterVec) With(labels Labels) Counter { - c, err := v.GetMetricWith(labels) - if err != nil { - panic(err) - } - return c -} - -// CurryWith returns a vector curried with the provided labels, i.e. the -// returned vector has those labels pre-set for all labeled operations performed -// on it. The cardinality of the curried vector is reduced accordingly. The -// order of the remaining labels stays the same (just with the curried labels -// taken out of the sequence – which is relevant for the -// (GetMetric)WithLabelValues methods). It is possible to curry a curried -// vector, but only with labels not yet used for currying before. -// -// The metrics contained in the CounterVec are shared between the curried and -// uncurried vectors. They are just accessed differently. Curried and uncurried -// vectors behave identically in terms of collection. Only one must be -// registered with a given registry (usually the uncurried version). The Reset -// method deletes all metrics, even if called on a curried vector. -func (v *CounterVec) CurryWith(labels Labels) (*CounterVec, error) { - vec, err := v.curryWith(labels) - if vec != nil { - return &CounterVec{vec}, err - } - return nil, err -} - -// MustCurryWith works as CurryWith but panics where CurryWith would have -// returned an error. -func (v *CounterVec) MustCurryWith(labels Labels) *CounterVec { - vec, err := v.CurryWith(labels) - if err != nil { - panic(err) - } - return vec -} - -// CounterFunc is a Counter whose value is determined at collect time by calling a -// provided function. -// -// To create CounterFunc instances, use NewCounterFunc. -type CounterFunc interface { - Metric - Collector -} - -// NewCounterFunc creates a new CounterFunc based on the provided -// CounterOpts. The value reported is determined by calling the given function -// from within the Write method. Take into account that metric collection may -// happen concurrently. If that results in concurrent calls to Write, like in -// the case where a CounterFunc is directly registered with Prometheus, the -// provided function must be concurrency-safe. The function should also honor -// the contract for a Counter (values only go up, not down), but compliance will -// not be checked. -func NewCounterFunc(opts CounterOpts, function func() float64) CounterFunc { - return newValueFunc(NewDesc( - BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), - opts.Help, - nil, - opts.ConstLabels, - ), CounterValue, function) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go deleted file mode 100644 index 71d406bd9..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go +++ /dev/null @@ -1,286 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "math" - "sync/atomic" - "time" - - dto "github.com/prometheus/client_model/go" -) - -// Gauge is a Metric that represents a single numerical value that can -// arbitrarily go up and down. -// -// A Gauge is typically used for measured values like temperatures or current -// memory usage, but also "counts" that can go up and down, like the number of -// running goroutines. -// -// To create Gauge instances, use NewGauge. -type Gauge interface { - Metric - Collector - - // Set sets the Gauge to an arbitrary value. - Set(float64) - // Inc increments the Gauge by 1. Use Add to increment it by arbitrary - // values. - Inc() - // Dec decrements the Gauge by 1. Use Sub to decrement it by arbitrary - // values. - Dec() - // Add adds the given value to the Gauge. (The value can be negative, - // resulting in a decrease of the Gauge.) - Add(float64) - // Sub subtracts the given value from the Gauge. (The value can be - // negative, resulting in an increase of the Gauge.) - Sub(float64) - - // SetToCurrentTime sets the Gauge to the current Unix time in seconds. - SetToCurrentTime() -} - -// GaugeOpts is an alias for Opts. See there for doc comments. -type GaugeOpts Opts - -// NewGauge creates a new Gauge based on the provided GaugeOpts. -// -// The returned implementation is optimized for a fast Set method. If you have a -// choice for managing the value of a Gauge via Set vs. Inc/Dec/Add/Sub, pick -// the former. For example, the Inc method of the returned Gauge is slower than -// the Inc method of a Counter returned by NewCounter. This matches the typical -// scenarios for Gauges and Counters, where the former tends to be Set-heavy and -// the latter Inc-heavy. -func NewGauge(opts GaugeOpts) Gauge { - desc := NewDesc( - BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), - opts.Help, - nil, - opts.ConstLabels, - ) - result := &gauge{desc: desc, labelPairs: desc.constLabelPairs} - result.init(result) // Init self-collection. - return result -} - -type gauge struct { - // valBits contains the bits of the represented float64 value. It has - // to go first in the struct to guarantee alignment for atomic - // operations. http://golang.org/pkg/sync/atomic/#pkg-note-BUG - valBits uint64 - - selfCollector - - desc *Desc - labelPairs []*dto.LabelPair -} - -func (g *gauge) Desc() *Desc { - return g.desc -} - -func (g *gauge) Set(val float64) { - atomic.StoreUint64(&g.valBits, math.Float64bits(val)) -} - -func (g *gauge) SetToCurrentTime() { - g.Set(float64(time.Now().UnixNano()) / 1e9) -} - -func (g *gauge) Inc() { - g.Add(1) -} - -func (g *gauge) Dec() { - g.Add(-1) -} - -func (g *gauge) Add(val float64) { - for { - oldBits := atomic.LoadUint64(&g.valBits) - newBits := math.Float64bits(math.Float64frombits(oldBits) + val) - if atomic.CompareAndSwapUint64(&g.valBits, oldBits, newBits) { - return - } - } -} - -func (g *gauge) Sub(val float64) { - g.Add(val * -1) -} - -func (g *gauge) Write(out *dto.Metric) error { - val := math.Float64frombits(atomic.LoadUint64(&g.valBits)) - return populateMetric(GaugeValue, val, g.labelPairs, out) -} - -// GaugeVec is a Collector that bundles a set of Gauges that all share the same -// Desc, but have different values for their variable labels. This is used if -// you want to count the same thing partitioned by various dimensions -// (e.g. number of operations queued, partitioned by user and operation -// type). Create instances with NewGaugeVec. -type GaugeVec struct { - *metricVec -} - -// NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and -// partitioned by the given label names. -func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { - desc := NewDesc( - BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), - opts.Help, - labelNames, - opts.ConstLabels, - ) - return &GaugeVec{ - metricVec: newMetricVec(desc, func(lvs ...string) Metric { - if len(lvs) != len(desc.variableLabels) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) - } - result := &gauge{desc: desc, labelPairs: makeLabelPairs(desc, lvs)} - result.init(result) // Init self-collection. - return result - }), - } -} - -// GetMetricWithLabelValues returns the Gauge for the given slice of label -// values (same order as the VariableLabels in Desc). If that combination of -// label values is accessed for the first time, a new Gauge is created. -// -// It is possible to call this method without using the returned Gauge to only -// create the new Gauge but leave it at its starting value 0. See also the -// SummaryVec example. -// -// Keeping the Gauge for later use is possible (and should be considered if -// performance is critical), but keep in mind that Reset, DeleteLabelValues and -// Delete can be used to delete the Gauge from the GaugeVec. In that case, the -// Gauge will still exist, but it will not be exported anymore, even if a -// Gauge with the same label values is created later. See also the CounterVec -// example. -// -// An error is returned if the number of label values is not the same as the -// number of VariableLabels in Desc (minus any curried labels). -// -// Note that for more than one label value, this method is prone to mistakes -// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as -// an alternative to avoid that type of mistake. For higher label numbers, the -// latter has a much more readable (albeit more verbose) syntax, but it comes -// with a performance overhead (for creating and processing the Labels map). -func (v *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, error) { - metric, err := v.metricVec.getMetricWithLabelValues(lvs...) - if metric != nil { - return metric.(Gauge), err - } - return nil, err -} - -// GetMetricWith returns the Gauge for the given Labels map (the label names -// must match those of the VariableLabels in Desc). If that label map is -// accessed for the first time, a new Gauge is created. Implications of -// creating a Gauge without using it and keeping the Gauge for later use are -// the same as for GetMetricWithLabelValues. -// -// An error is returned if the number and names of the Labels are inconsistent -// with those of the VariableLabels in Desc (minus any curried labels). -// -// This method is used for the same purpose as -// GetMetricWithLabelValues(...string). See there for pros and cons of the two -// methods. -func (v *GaugeVec) GetMetricWith(labels Labels) (Gauge, error) { - metric, err := v.metricVec.getMetricWith(labels) - if metric != nil { - return metric.(Gauge), err - } - return nil, err -} - -// WithLabelValues works as GetMetricWithLabelValues, but panics where -// GetMetricWithLabelValues would have returned an error. Not returning an -// error allows shortcuts like -// myVec.WithLabelValues("404", "GET").Add(42) -func (v *GaugeVec) WithLabelValues(lvs ...string) Gauge { - g, err := v.GetMetricWithLabelValues(lvs...) - if err != nil { - panic(err) - } - return g -} - -// With works as GetMetricWith, but panics where GetMetricWithLabels would have -// returned an error. Not returning an error allows shortcuts like -// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Add(42) -func (v *GaugeVec) With(labels Labels) Gauge { - g, err := v.GetMetricWith(labels) - if err != nil { - panic(err) - } - return g -} - -// CurryWith returns a vector curried with the provided labels, i.e. the -// returned vector has those labels pre-set for all labeled operations performed -// on it. The cardinality of the curried vector is reduced accordingly. The -// order of the remaining labels stays the same (just with the curried labels -// taken out of the sequence – which is relevant for the -// (GetMetric)WithLabelValues methods). It is possible to curry a curried -// vector, but only with labels not yet used for currying before. -// -// The metrics contained in the GaugeVec are shared between the curried and -// uncurried vectors. They are just accessed differently. Curried and uncurried -// vectors behave identically in terms of collection. Only one must be -// registered with a given registry (usually the uncurried version). The Reset -// method deletes all metrics, even if called on a curried vector. -func (v *GaugeVec) CurryWith(labels Labels) (*GaugeVec, error) { - vec, err := v.curryWith(labels) - if vec != nil { - return &GaugeVec{vec}, err - } - return nil, err -} - -// MustCurryWith works as CurryWith but panics where CurryWith would have -// returned an error. -func (v *GaugeVec) MustCurryWith(labels Labels) *GaugeVec { - vec, err := v.CurryWith(labels) - if err != nil { - panic(err) - } - return vec -} - -// GaugeFunc is a Gauge whose value is determined at collect time by calling a -// provided function. -// -// To create GaugeFunc instances, use NewGaugeFunc. -type GaugeFunc interface { - Metric - Collector -} - -// NewGaugeFunc creates a new GaugeFunc based on the provided GaugeOpts. The -// value reported is determined by calling the given function from within the -// Write method. Take into account that metric collection may happen -// concurrently. If that results in concurrent calls to Write, like in the case -// where a GaugeFunc is directly registered with Prometheus, the provided -// function must be concurrency-safe. -func NewGaugeFunc(opts GaugeOpts, function func() float64) GaugeFunc { - return newValueFunc(NewDesc( - BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), - opts.Help, - nil, - opts.ConstLabels, - ), GaugeValue, function) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go b/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go deleted file mode 100644 index 351c26e1a..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package internal - -import ( - "sort" - - dto "github.com/prometheus/client_model/go" -) - -// metricSorter is a sortable slice of *dto.Metric. -type metricSorter []*dto.Metric - -func (s metricSorter) Len() int { - return len(s) -} - -func (s metricSorter) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func (s metricSorter) Less(i, j int) bool { - if len(s[i].Label) != len(s[j].Label) { - // This should not happen. The metrics are - // inconsistent. However, we have to deal with the fact, as - // people might use custom collectors or metric family injection - // to create inconsistent metrics. So let's simply compare the - // number of labels in this case. That will still yield - // reproducible sorting. - return len(s[i].Label) < len(s[j].Label) - } - for n, lp := range s[i].Label { - vi := lp.GetValue() - vj := s[j].Label[n].GetValue() - if vi != vj { - return vi < vj - } - } - - // We should never arrive here. Multiple metrics with the same - // label set in the same scrape will lead to undefined ingestion - // behavior. However, as above, we have to provide stable sorting - // here, even for inconsistent metrics. So sort equal metrics - // by their timestamp, with missing timestamps (implying "now") - // coming last. - if s[i].TimestampMs == nil { - return false - } - if s[j].TimestampMs == nil { - return true - } - return s[i].GetTimestampMs() < s[j].GetTimestampMs() -} - -// NormalizeMetricFamilies returns a MetricFamily slice with empty -// MetricFamilies pruned and the remaining MetricFamilies sorted by name within -// the slice, with the contained Metrics sorted within each MetricFamily. -func NormalizeMetricFamilies(metricFamiliesByName map[string]*dto.MetricFamily) []*dto.MetricFamily { - for _, mf := range metricFamiliesByName { - sort.Sort(metricSorter(mf.Metric)) - } - names := make([]string, 0, len(metricFamiliesByName)) - for name, mf := range metricFamiliesByName { - if len(mf.Metric) > 0 { - names = append(names, name) - } - } - sort.Strings(names) - result := make([]*dto.MetricFamily, 0, len(names)) - for _, name := range names { - result = append(result, metricFamiliesByName[name]) - } - return result -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/labels.go b/vendor/github.com/prometheus/client_golang/prometheus/labels.go deleted file mode 100644 index 2744443ac..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/labels.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "errors" - "fmt" - "strings" - "unicode/utf8" - - "github.com/prometheus/common/model" -) - -// Labels represents a collection of label name -> value mappings. This type is -// commonly used with the With(Labels) and GetMetricWith(Labels) methods of -// metric vector Collectors, e.g.: -// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) -// -// The other use-case is the specification of constant label pairs in Opts or to -// create a Desc. -type Labels map[string]string - -// reservedLabelPrefix is a prefix which is not legal in user-supplied -// label names. -const reservedLabelPrefix = "__" - -var errInconsistentCardinality = errors.New("inconsistent label cardinality") - -func makeInconsistentCardinalityError(fqName string, labels, labelValues []string) error { - return fmt.Errorf( - "%s: %q has %d variable labels named %q but %d values %q were provided", - errInconsistentCardinality, fqName, - len(labels), labels, - len(labelValues), labelValues, - ) -} - -func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error { - if len(labels) != expectedNumberOfValues { - return fmt.Errorf( - "%s: expected %d label values but got %d in %#v", - errInconsistentCardinality, expectedNumberOfValues, - len(labels), labels, - ) - } - - for name, val := range labels { - if !utf8.ValidString(val) { - return fmt.Errorf("label %s: value %q is not valid UTF-8", name, val) - } - } - - return nil -} - -func validateLabelValues(vals []string, expectedNumberOfValues int) error { - if len(vals) != expectedNumberOfValues { - return fmt.Errorf( - "%s: expected %d label values but got %d in %#v", - errInconsistentCardinality, expectedNumberOfValues, - len(vals), vals, - ) - } - - for _, val := range vals { - if !utf8.ValidString(val) { - return fmt.Errorf("label value %q is not valid UTF-8", val) - } - } - - return nil -} - -func checkLabelName(l string) bool { - return model.LabelName(l).IsValid() && !strings.HasPrefix(l, reservedLabelPrefix) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/observer.go b/vendor/github.com/prometheus/client_golang/prometheus/observer.go deleted file mode 100644 index 5806cd09e..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/observer.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -// Observer is the interface that wraps the Observe method, which is used by -// Histogram and Summary to add observations. -type Observer interface { - Observe(float64) -} - -// The ObserverFunc type is an adapter to allow the use of ordinary -// functions as Observers. If f is a function with the appropriate -// signature, ObserverFunc(f) is an Observer that calls f. -// -// This adapter is usually used in connection with the Timer type, and there are -// two general use cases: -// -// The most common one is to use a Gauge as the Observer for a Timer. -// See the "Gauge" Timer example. -// -// The more advanced use case is to create a function that dynamically decides -// which Observer to use for observing the duration. See the "Complex" Timer -// example. -type ObserverFunc func(float64) - -// Observe calls f(value). It implements Observer. -func (f ObserverFunc) Observe(value float64) { - f(value) -} - -// ObserverVec is an interface implemented by `HistogramVec` and `SummaryVec`. -type ObserverVec interface { - GetMetricWith(Labels) (Observer, error) - GetMetricWithLabelValues(lvs ...string) (Observer, error) - With(Labels) Observer - WithLabelValues(...string) Observer - CurryWith(Labels) (ObserverVec, error) - MustCurryWith(Labels) ObserverVec - - Collector -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go deleted file mode 100644 index 55176d58c..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright 2015 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "errors" - "os" - - "github.com/prometheus/procfs" -) - -type processCollector struct { - collectFn func(chan<- Metric) - pidFn func() (int, error) - reportErrors bool - cpuTotal *Desc - openFDs, maxFDs *Desc - vsize, maxVsize *Desc - rss *Desc - startTime *Desc -} - -// ProcessCollectorOpts defines the behavior of a process metrics collector -// created with NewProcessCollector. -type ProcessCollectorOpts struct { - // PidFn returns the PID of the process the collector collects metrics - // for. It is called upon each collection. By default, the PID of the - // current process is used, as determined on construction time by - // calling os.Getpid(). - PidFn func() (int, error) - // If non-empty, each of the collected metrics is prefixed by the - // provided string and an underscore ("_"). - Namespace string - // If true, any error encountered during collection is reported as an - // invalid metric (see NewInvalidMetric). Otherwise, errors are ignored - // and the collected metrics will be incomplete. (Possibly, no metrics - // will be collected at all.) While that's usually not desired, it is - // appropriate for the common "mix-in" of process metrics, where process - // metrics are nice to have, but failing to collect them should not - // disrupt the collection of the remaining metrics. - ReportErrors bool -} - -// NewProcessCollector returns a collector which exports the current state of -// process metrics including CPU, memory and file descriptor usage as well as -// the process start time. The detailed behavior is defined by the provided -// ProcessCollectorOpts. The zero value of ProcessCollectorOpts creates a -// collector for the current process with an empty namespace string and no error -// reporting. -// -// Currently, the collector depends on a Linux-style proc filesystem and -// therefore only exports metrics for Linux. -// -// Note: An older version of this function had the following signature: -// -// NewProcessCollector(pid int, namespace string) Collector -// -// Most commonly, it was called as -// -// NewProcessCollector(os.Getpid(), "") -// -// The following call of the current version is equivalent to the above: -// -// NewProcessCollector(ProcessCollectorOpts{}) -func NewProcessCollector(opts ProcessCollectorOpts) Collector { - ns := "" - if len(opts.Namespace) > 0 { - ns = opts.Namespace + "_" - } - - c := &processCollector{ - reportErrors: opts.ReportErrors, - cpuTotal: NewDesc( - ns+"process_cpu_seconds_total", - "Total user and system CPU time spent in seconds.", - nil, nil, - ), - openFDs: NewDesc( - ns+"process_open_fds", - "Number of open file descriptors.", - nil, nil, - ), - maxFDs: NewDesc( - ns+"process_max_fds", - "Maximum number of open file descriptors.", - nil, nil, - ), - vsize: NewDesc( - ns+"process_virtual_memory_bytes", - "Virtual memory size in bytes.", - nil, nil, - ), - maxVsize: NewDesc( - ns+"process_virtual_memory_max_bytes", - "Maximum amount of virtual memory available in bytes.", - nil, nil, - ), - rss: NewDesc( - ns+"process_resident_memory_bytes", - "Resident memory size in bytes.", - nil, nil, - ), - startTime: NewDesc( - ns+"process_start_time_seconds", - "Start time of the process since unix epoch in seconds.", - nil, nil, - ), - } - - if opts.PidFn == nil { - pid := os.Getpid() - c.pidFn = func() (int, error) { return pid, nil } - } else { - c.pidFn = opts.PidFn - } - - // Set up process metric collection if supported by the runtime. - if _, err := procfs.NewStat(); err == nil { - c.collectFn = c.processCollect - } else { - c.collectFn = func(ch chan<- Metric) { - c.reportError(ch, nil, errors.New("process metrics not supported on this platform")) - } - } - - return c -} - -// Describe returns all descriptions of the collector. -func (c *processCollector) Describe(ch chan<- *Desc) { - ch <- c.cpuTotal - ch <- c.openFDs - ch <- c.maxFDs - ch <- c.vsize - ch <- c.maxVsize - ch <- c.rss - ch <- c.startTime -} - -// Collect returns the current state of all metrics of the collector. -func (c *processCollector) Collect(ch chan<- Metric) { - c.collectFn(ch) -} - -func (c *processCollector) processCollect(ch chan<- Metric) { - pid, err := c.pidFn() - if err != nil { - c.reportError(ch, nil, err) - return - } - - p, err := procfs.NewProc(pid) - if err != nil { - c.reportError(ch, nil, err) - return - } - - if stat, err := p.NewStat(); err == nil { - ch <- MustNewConstMetric(c.cpuTotal, CounterValue, stat.CPUTime()) - ch <- MustNewConstMetric(c.vsize, GaugeValue, float64(stat.VirtualMemory())) - ch <- MustNewConstMetric(c.rss, GaugeValue, float64(stat.ResidentMemory())) - if startTime, err := stat.StartTime(); err == nil { - ch <- MustNewConstMetric(c.startTime, GaugeValue, startTime) - } else { - c.reportError(ch, c.startTime, err) - } - } else { - c.reportError(ch, nil, err) - } - - if fds, err := p.FileDescriptorsLen(); err == nil { - ch <- MustNewConstMetric(c.openFDs, GaugeValue, float64(fds)) - } else { - c.reportError(ch, c.openFDs, err) - } - - if limits, err := p.NewLimits(); err == nil { - ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(limits.OpenFiles)) - ch <- MustNewConstMetric(c.maxVsize, GaugeValue, float64(limits.AddressSpace)) - } else { - c.reportError(ch, nil, err) - } -} - -func (c *processCollector) reportError(ch chan<- Metric, desc *Desc, err error) { - if !c.reportErrors { - return - } - if desc == nil { - desc = NewInvalidDesc(err) - } - ch <- NewInvalidMetric(desc, err) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go deleted file mode 100644 index 67b56d37c..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package promhttp - -import ( - "bufio" - "io" - "net" - "net/http" -) - -const ( - closeNotifier = 1 << iota - flusher - hijacker - readerFrom - pusher -) - -type delegator interface { - http.ResponseWriter - - Status() int - Written() int64 -} - -type responseWriterDelegator struct { - http.ResponseWriter - - handler, method string - status int - written int64 - wroteHeader bool - observeWriteHeader func(int) -} - -func (r *responseWriterDelegator) Status() int { - return r.status -} - -func (r *responseWriterDelegator) Written() int64 { - return r.written -} - -func (r *responseWriterDelegator) WriteHeader(code int) { - r.status = code - r.wroteHeader = true - r.ResponseWriter.WriteHeader(code) - if r.observeWriteHeader != nil { - r.observeWriteHeader(code) - } -} - -func (r *responseWriterDelegator) Write(b []byte) (int, error) { - if !r.wroteHeader { - r.WriteHeader(http.StatusOK) - } - n, err := r.ResponseWriter.Write(b) - r.written += int64(n) - return n, err -} - -type closeNotifierDelegator struct{ *responseWriterDelegator } -type flusherDelegator struct{ *responseWriterDelegator } -type hijackerDelegator struct{ *responseWriterDelegator } -type readerFromDelegator struct{ *responseWriterDelegator } - -func (d closeNotifierDelegator) CloseNotify() <-chan bool { - return d.ResponseWriter.(http.CloseNotifier).CloseNotify() -} -func (d flusherDelegator) Flush() { - d.ResponseWriter.(http.Flusher).Flush() -} -func (d hijackerDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) { - return d.ResponseWriter.(http.Hijacker).Hijack() -} -func (d readerFromDelegator) ReadFrom(re io.Reader) (int64, error) { - if !d.wroteHeader { - d.WriteHeader(http.StatusOK) - } - n, err := d.ResponseWriter.(io.ReaderFrom).ReadFrom(re) - d.written += n - return n, err -} - -var pickDelegator = make([]func(*responseWriterDelegator) delegator, 32) - -func init() { - // TODO(beorn7): Code generation would help here. - pickDelegator[0] = func(d *responseWriterDelegator) delegator { // 0 - return d - } - pickDelegator[closeNotifier] = func(d *responseWriterDelegator) delegator { // 1 - return closeNotifierDelegator{d} - } - pickDelegator[flusher] = func(d *responseWriterDelegator) delegator { // 2 - return flusherDelegator{d} - } - pickDelegator[flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 3 - return struct { - *responseWriterDelegator - http.Flusher - http.CloseNotifier - }{d, flusherDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[hijacker] = func(d *responseWriterDelegator) delegator { // 4 - return hijackerDelegator{d} - } - pickDelegator[hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 5 - return struct { - *responseWriterDelegator - http.Hijacker - http.CloseNotifier - }{d, hijackerDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 6 - return struct { - *responseWriterDelegator - http.Hijacker - http.Flusher - }{d, hijackerDelegator{d}, flusherDelegator{d}} - } - pickDelegator[hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 7 - return struct { - *responseWriterDelegator - http.Hijacker - http.Flusher - http.CloseNotifier - }{d, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[readerFrom] = func(d *responseWriterDelegator) delegator { // 8 - return readerFromDelegator{d} - } - pickDelegator[readerFrom+closeNotifier] = func(d *responseWriterDelegator) delegator { // 9 - return struct { - *responseWriterDelegator - io.ReaderFrom - http.CloseNotifier - }{d, readerFromDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[readerFrom+flusher] = func(d *responseWriterDelegator) delegator { // 10 - return struct { - *responseWriterDelegator - io.ReaderFrom - http.Flusher - }{d, readerFromDelegator{d}, flusherDelegator{d}} - } - pickDelegator[readerFrom+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 11 - return struct { - *responseWriterDelegator - io.ReaderFrom - http.Flusher - http.CloseNotifier - }{d, readerFromDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[readerFrom+hijacker] = func(d *responseWriterDelegator) delegator { // 12 - return struct { - *responseWriterDelegator - io.ReaderFrom - http.Hijacker - }{d, readerFromDelegator{d}, hijackerDelegator{d}} - } - pickDelegator[readerFrom+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 13 - return struct { - *responseWriterDelegator - io.ReaderFrom - http.Hijacker - http.CloseNotifier - }{d, readerFromDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[readerFrom+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 14 - return struct { - *responseWriterDelegator - io.ReaderFrom - http.Hijacker - http.Flusher - }{d, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} - } - pickDelegator[readerFrom+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 15 - return struct { - *responseWriterDelegator - io.ReaderFrom - http.Hijacker - http.Flusher - http.CloseNotifier - }{d, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} - } -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_1_8.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_1_8.go deleted file mode 100644 index 31a706956..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_1_8.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build go1.8 - -package promhttp - -import ( - "io" - "net/http" -) - -type pusherDelegator struct{ *responseWriterDelegator } - -func (d pusherDelegator) Push(target string, opts *http.PushOptions) error { - return d.ResponseWriter.(http.Pusher).Push(target, opts) -} - -func init() { - pickDelegator[pusher] = func(d *responseWriterDelegator) delegator { // 16 - return pusherDelegator{d} - } - pickDelegator[pusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 17 - return struct { - *responseWriterDelegator - http.Pusher - http.CloseNotifier - }{d, pusherDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+flusher] = func(d *responseWriterDelegator) delegator { // 18 - return struct { - *responseWriterDelegator - http.Pusher - http.Flusher - }{d, pusherDelegator{d}, flusherDelegator{d}} - } - pickDelegator[pusher+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 19 - return struct { - *responseWriterDelegator - http.Pusher - http.Flusher - http.CloseNotifier - }{d, pusherDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+hijacker] = func(d *responseWriterDelegator) delegator { // 20 - return struct { - *responseWriterDelegator - http.Pusher - http.Hijacker - }{d, pusherDelegator{d}, hijackerDelegator{d}} - } - pickDelegator[pusher+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 21 - return struct { - *responseWriterDelegator - http.Pusher - http.Hijacker - http.CloseNotifier - }{d, pusherDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 22 - return struct { - *responseWriterDelegator - http.Pusher - http.Hijacker - http.Flusher - }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} - } - pickDelegator[pusher+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { //23 - return struct { - *responseWriterDelegator - http.Pusher - http.Hijacker - http.Flusher - http.CloseNotifier - }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+readerFrom] = func(d *responseWriterDelegator) delegator { // 24 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - }{d, pusherDelegator{d}, readerFromDelegator{d}} - } - pickDelegator[pusher+readerFrom+closeNotifier] = func(d *responseWriterDelegator) delegator { // 25 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.CloseNotifier - }{d, pusherDelegator{d}, readerFromDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+readerFrom+flusher] = func(d *responseWriterDelegator) delegator { // 26 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Flusher - }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}} - } - pickDelegator[pusher+readerFrom+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 27 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Flusher - http.CloseNotifier - }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+readerFrom+hijacker] = func(d *responseWriterDelegator) delegator { // 28 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Hijacker - }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}} - } - pickDelegator[pusher+readerFrom+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 29 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Hijacker - http.CloseNotifier - }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} - } - pickDelegator[pusher+readerFrom+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 30 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Hijacker - http.Flusher - }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} - } - pickDelegator[pusher+readerFrom+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 31 - return struct { - *responseWriterDelegator - http.Pusher - io.ReaderFrom - http.Hijacker - http.Flusher - http.CloseNotifier - }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} - } -} - -func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int)) delegator { - d := &responseWriterDelegator{ - ResponseWriter: w, - observeWriteHeader: observeWriteHeaderFunc, - } - - id := 0 - if _, ok := w.(http.CloseNotifier); ok { - id += closeNotifier - } - if _, ok := w.(http.Flusher); ok { - id += flusher - } - if _, ok := w.(http.Hijacker); ok { - id += hijacker - } - if _, ok := w.(io.ReaderFrom); ok { - id += readerFrom - } - if _, ok := w.(http.Pusher); ok { - id += pusher - } - - return pickDelegator[id](d) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go deleted file mode 100644 index 8bb9b8b68..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build !go1.8 - -package promhttp - -import ( - "io" - "net/http" -) - -func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int)) delegator { - d := &responseWriterDelegator{ - ResponseWriter: w, - observeWriteHeader: observeWriteHeaderFunc, - } - - id := 0 - if _, ok := w.(http.CloseNotifier); ok { - id += closeNotifier - } - if _, ok := w.(http.Flusher); ok { - id += flusher - } - if _, ok := w.(http.Hijacker); ok { - id += hijacker - } - if _, ok := w.(io.ReaderFrom); ok { - id += readerFrom - } - - return pickDelegator[id](d) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go deleted file mode 100644 index 668eb6b3c..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go +++ /dev/null @@ -1,311 +0,0 @@ -// Copyright 2016 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package promhttp provides tooling around HTTP servers and clients. -// -// First, the package allows the creation of http.Handler instances to expose -// Prometheus metrics via HTTP. promhttp.Handler acts on the -// prometheus.DefaultGatherer. With HandlerFor, you can create a handler for a -// custom registry or anything that implements the Gatherer interface. It also -// allows the creation of handlers that act differently on errors or allow to -// log errors. -// -// Second, the package provides tooling to instrument instances of http.Handler -// via middleware. Middleware wrappers follow the naming scheme -// InstrumentHandlerX, where X describes the intended use of the middleware. -// See each function's doc comment for specific details. -// -// Finally, the package allows for an http.RoundTripper to be instrumented via -// middleware. Middleware wrappers follow the naming scheme -// InstrumentRoundTripperX, where X describes the intended use of the -// middleware. See each function's doc comment for specific details. -package promhttp - -import ( - "compress/gzip" - "fmt" - "io" - "net/http" - "strings" - "sync" - "time" - - "github.com/prometheus/common/expfmt" - - "github.com/prometheus/client_golang/prometheus" -) - -const ( - contentTypeHeader = "Content-Type" - contentLengthHeader = "Content-Length" - contentEncodingHeader = "Content-Encoding" - acceptEncodingHeader = "Accept-Encoding" -) - -var gzipPool = sync.Pool{ - New: func() interface{} { - return gzip.NewWriter(nil) - }, -} - -// Handler returns an http.Handler for the prometheus.DefaultGatherer, using -// default HandlerOpts, i.e. it reports the first error as an HTTP error, it has -// no error logging, and it applies compression if requested by the client. -// -// The returned http.Handler is already instrumented using the -// InstrumentMetricHandler function and the prometheus.DefaultRegisterer. If you -// create multiple http.Handlers by separate calls of the Handler function, the -// metrics used for instrumentation will be shared between them, providing -// global scrape counts. -// -// This function is meant to cover the bulk of basic use cases. If you are doing -// anything that requires more customization (including using a non-default -// Gatherer, different instrumentation, and non-default HandlerOpts), use the -// HandlerFor function. See there for details. -func Handler() http.Handler { - return InstrumentMetricHandler( - prometheus.DefaultRegisterer, HandlerFor(prometheus.DefaultGatherer, HandlerOpts{}), - ) -} - -// HandlerFor returns an uninstrumented http.Handler for the provided -// Gatherer. The behavior of the Handler is defined by the provided -// HandlerOpts. Thus, HandlerFor is useful to create http.Handlers for custom -// Gatherers, with non-default HandlerOpts, and/or with custom (or no) -// instrumentation. Use the InstrumentMetricHandler function to apply the same -// kind of instrumentation as it is used by the Handler function. -func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { - var inFlightSem chan struct{} - if opts.MaxRequestsInFlight > 0 { - inFlightSem = make(chan struct{}, opts.MaxRequestsInFlight) - } - - h := http.HandlerFunc(func(rsp http.ResponseWriter, req *http.Request) { - if inFlightSem != nil { - select { - case inFlightSem <- struct{}{}: // All good, carry on. - defer func() { <-inFlightSem }() - default: - http.Error(rsp, fmt.Sprintf( - "Limit of concurrent requests reached (%d), try again later.", opts.MaxRequestsInFlight, - ), http.StatusServiceUnavailable) - return - } - } - mfs, err := reg.Gather() - if err != nil { - if opts.ErrorLog != nil { - opts.ErrorLog.Println("error gathering metrics:", err) - } - switch opts.ErrorHandling { - case PanicOnError: - panic(err) - case ContinueOnError: - if len(mfs) == 0 { - // Still report the error if no metrics have been gathered. - httpError(rsp, err) - return - } - case HTTPErrorOnError: - httpError(rsp, err) - return - } - } - - contentType := expfmt.Negotiate(req.Header) - header := rsp.Header() - header.Set(contentTypeHeader, string(contentType)) - - w := io.Writer(rsp) - if !opts.DisableCompression && gzipAccepted(req.Header) { - header.Set(contentEncodingHeader, "gzip") - gz := gzipPool.Get().(*gzip.Writer) - defer gzipPool.Put(gz) - - gz.Reset(w) - defer gz.Close() - - w = gz - } - - enc := expfmt.NewEncoder(w, contentType) - - var lastErr error - for _, mf := range mfs { - if err := enc.Encode(mf); err != nil { - lastErr = err - if opts.ErrorLog != nil { - opts.ErrorLog.Println("error encoding and sending metric family:", err) - } - switch opts.ErrorHandling { - case PanicOnError: - panic(err) - case ContinueOnError: - // Handled later. - case HTTPErrorOnError: - httpError(rsp, err) - return - } - } - } - - if lastErr != nil { - httpError(rsp, lastErr) - } - }) - - if opts.Timeout <= 0 { - return h - } - return http.TimeoutHandler(h, opts.Timeout, fmt.Sprintf( - "Exceeded configured timeout of %v.\n", - opts.Timeout, - )) -} - -// InstrumentMetricHandler is usually used with an http.Handler returned by the -// HandlerFor function. It instruments the provided http.Handler with two -// metrics: A counter vector "promhttp_metric_handler_requests_total" to count -// scrapes partitioned by HTTP status code, and a gauge -// "promhttp_metric_handler_requests_in_flight" to track the number of -// simultaneous scrapes. This function idempotently registers collectors for -// both metrics with the provided Registerer. It panics if the registration -// fails. The provided metrics are useful to see how many scrapes hit the -// monitored target (which could be from different Prometheus servers or other -// scrapers), and how often they overlap (which would result in more than one -// scrape in flight at the same time). Note that the scrapes-in-flight gauge -// will contain the scrape by which it is exposed, while the scrape counter will -// only get incremented after the scrape is complete (as only then the status -// code is known). For tracking scrape durations, use the -// "scrape_duration_seconds" gauge created by the Prometheus server upon each -// scrape. -func InstrumentMetricHandler(reg prometheus.Registerer, handler http.Handler) http.Handler { - cnt := prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "promhttp_metric_handler_requests_total", - Help: "Total number of scrapes by HTTP status code.", - }, - []string{"code"}, - ) - // Initialize the most likely HTTP status codes. - cnt.WithLabelValues("200") - cnt.WithLabelValues("500") - cnt.WithLabelValues("503") - if err := reg.Register(cnt); err != nil { - if are, ok := err.(prometheus.AlreadyRegisteredError); ok { - cnt = are.ExistingCollector.(*prometheus.CounterVec) - } else { - panic(err) - } - } - - gge := prometheus.NewGauge(prometheus.GaugeOpts{ - Name: "promhttp_metric_handler_requests_in_flight", - Help: "Current number of scrapes being served.", - }) - if err := reg.Register(gge); err != nil { - if are, ok := err.(prometheus.AlreadyRegisteredError); ok { - gge = are.ExistingCollector.(prometheus.Gauge) - } else { - panic(err) - } - } - - return InstrumentHandlerCounter(cnt, InstrumentHandlerInFlight(gge, handler)) -} - -// HandlerErrorHandling defines how a Handler serving metrics will handle -// errors. -type HandlerErrorHandling int - -// These constants cause handlers serving metrics to behave as described if -// errors are encountered. -const ( - // Serve an HTTP status code 500 upon the first error - // encountered. Report the error message in the body. - HTTPErrorOnError HandlerErrorHandling = iota - // Ignore errors and try to serve as many metrics as possible. However, - // if no metrics can be served, serve an HTTP status code 500 and the - // last error message in the body. Only use this in deliberate "best - // effort" metrics collection scenarios. It is recommended to at least - // log errors (by providing an ErrorLog in HandlerOpts) to not mask - // errors completely. - ContinueOnError - // Panic upon the first error encountered (useful for "crash only" apps). - PanicOnError -) - -// Logger is the minimal interface HandlerOpts needs for logging. Note that -// log.Logger from the standard library implements this interface, and it is -// easy to implement by custom loggers, if they don't do so already anyway. -type Logger interface { - Println(v ...interface{}) -} - -// HandlerOpts specifies options how to serve metrics via an http.Handler. The -// zero value of HandlerOpts is a reasonable default. -type HandlerOpts struct { - // ErrorLog specifies an optional logger for errors collecting and - // serving metrics. If nil, errors are not logged at all. - ErrorLog Logger - // ErrorHandling defines how errors are handled. Note that errors are - // logged regardless of the configured ErrorHandling provided ErrorLog - // is not nil. - ErrorHandling HandlerErrorHandling - // If DisableCompression is true, the handler will never compress the - // response, even if requested by the client. - DisableCompression bool - // The number of concurrent HTTP requests is limited to - // MaxRequestsInFlight. Additional requests are responded to with 503 - // Service Unavailable and a suitable message in the body. If - // MaxRequestsInFlight is 0 or negative, no limit is applied. - MaxRequestsInFlight int - // If handling a request takes longer than Timeout, it is responded to - // with 503 ServiceUnavailable and a suitable Message. No timeout is - // applied if Timeout is 0 or negative. Note that with the current - // implementation, reaching the timeout simply ends the HTTP requests as - // described above (and even that only if sending of the body hasn't - // started yet), while the bulk work of gathering all the metrics keeps - // running in the background (with the eventual result to be thrown - // away). Until the implementation is improved, it is recommended to - // implement a separate timeout in potentially slow Collectors. - Timeout time.Duration -} - -// gzipAccepted returns whether the client will accept gzip-encoded content. -func gzipAccepted(header http.Header) bool { - a := header.Get(acceptEncodingHeader) - parts := strings.Split(a, ",") - for _, part := range parts { - part = strings.TrimSpace(part) - if part == "gzip" || strings.HasPrefix(part, "gzip;") { - return true - } - } - return false -} - -// httpError removes any content-encoding header and then calls http.Error with -// the provided error and http.StatusInternalServerErrer. Error contents is -// supposed to be uncompressed plain text. However, same as with a plain -// http.Error, any header settings will be void if the header has already been -// sent. The error message will still be written to the writer, but it will -// probably be of limited use. -func httpError(rsp http.ResponseWriter, err error) { - rsp.Header().Del(contentEncodingHeader) - http.Error( - rsp, - "An error has occurred while serving metrics:\n\n"+err.Error(), - http.StatusInternalServerError, - ) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go deleted file mode 100644 index 86fd56447..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package promhttp - -import ( - "net/http" - "time" - - "github.com/prometheus/client_golang/prometheus" -) - -// The RoundTripperFunc type is an adapter to allow the use of ordinary -// functions as RoundTrippers. If f is a function with the appropriate -// signature, RountTripperFunc(f) is a RoundTripper that calls f. -type RoundTripperFunc func(req *http.Request) (*http.Response, error) - -// RoundTrip implements the RoundTripper interface. -func (rt RoundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) { - return rt(r) -} - -// InstrumentRoundTripperInFlight is a middleware that wraps the provided -// http.RoundTripper. It sets the provided prometheus.Gauge to the number of -// requests currently handled by the wrapped http.RoundTripper. -// -// See the example for ExampleInstrumentRoundTripperDuration for example usage. -func InstrumentRoundTripperInFlight(gauge prometheus.Gauge, next http.RoundTripper) RoundTripperFunc { - return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { - gauge.Inc() - defer gauge.Dec() - return next.RoundTrip(r) - }) -} - -// InstrumentRoundTripperCounter is a middleware that wraps the provided -// http.RoundTripper to observe the request result with the provided CounterVec. -// The CounterVec must have zero, one, or two non-const non-curried labels. For -// those, the only allowed label names are "code" and "method". The function -// panics otherwise. Partitioning of the CounterVec happens by HTTP status code -// and/or HTTP method if the respective instance label names are present in the -// CounterVec. For unpartitioned counting, use a CounterVec with zero labels. -// -// If the wrapped RoundTripper panics or returns a non-nil error, the Counter -// is not incremented. -// -// See the example for ExampleInstrumentRoundTripperDuration for example usage. -func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next http.RoundTripper) RoundTripperFunc { - code, method := checkLabels(counter) - - return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { - resp, err := next.RoundTrip(r) - if err == nil { - counter.With(labels(code, method, r.Method, resp.StatusCode)).Inc() - } - return resp, err - }) -} - -// InstrumentRoundTripperDuration is a middleware that wraps the provided -// http.RoundTripper to observe the request duration with the provided -// ObserverVec. The ObserverVec must have zero, one, or two non-const -// non-curried labels. For those, the only allowed label names are "code" and -// "method". The function panics otherwise. The Observe method of the Observer -// in the ObserverVec is called with the request duration in -// seconds. Partitioning happens by HTTP status code and/or HTTP method if the -// respective instance label names are present in the ObserverVec. For -// unpartitioned observations, use an ObserverVec with zero labels. Note that -// partitioning of Histograms is expensive and should be used judiciously. -// -// If the wrapped RoundTripper panics or returns a non-nil error, no values are -// reported. -// -// Note that this method is only guaranteed to never observe negative durations -// if used with Go1.9+. -func InstrumentRoundTripperDuration(obs prometheus.ObserverVec, next http.RoundTripper) RoundTripperFunc { - code, method := checkLabels(obs) - - return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { - start := time.Now() - resp, err := next.RoundTrip(r) - if err == nil { - obs.With(labels(code, method, r.Method, resp.StatusCode)).Observe(time.Since(start).Seconds()) - } - return resp, err - }) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go deleted file mode 100644 index a034d1ec0..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build go1.8 - -package promhttp - -import ( - "context" - "crypto/tls" - "net/http" - "net/http/httptrace" - "time" -) - -// InstrumentTrace is used to offer flexibility in instrumenting the available -// httptrace.ClientTrace hook functions. Each function is passed a float64 -// representing the time in seconds since the start of the http request. A user -// may choose to use separately buckets Histograms, or implement custom -// instance labels on a per function basis. -type InstrumentTrace struct { - GotConn func(float64) - PutIdleConn func(float64) - GotFirstResponseByte func(float64) - Got100Continue func(float64) - DNSStart func(float64) - DNSDone func(float64) - ConnectStart func(float64) - ConnectDone func(float64) - TLSHandshakeStart func(float64) - TLSHandshakeDone func(float64) - WroteHeaders func(float64) - Wait100Continue func(float64) - WroteRequest func(float64) -} - -// InstrumentRoundTripperTrace is a middleware that wraps the provided -// RoundTripper and reports times to hook functions provided in the -// InstrumentTrace struct. Hook functions that are not present in the provided -// InstrumentTrace struct are ignored. Times reported to the hook functions are -// time since the start of the request. Only with Go1.9+, those times are -// guaranteed to never be negative. (Earlier Go versions are not using a -// monotonic clock.) Note that partitioning of Histograms is expensive and -// should be used judiciously. -// -// For hook functions that receive an error as an argument, no observations are -// made in the event of a non-nil error value. -// -// See the example for ExampleInstrumentRoundTripperDuration for example usage. -func InstrumentRoundTripperTrace(it *InstrumentTrace, next http.RoundTripper) RoundTripperFunc { - return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { - start := time.Now() - - trace := &httptrace.ClientTrace{ - GotConn: func(_ httptrace.GotConnInfo) { - if it.GotConn != nil { - it.GotConn(time.Since(start).Seconds()) - } - }, - PutIdleConn: func(err error) { - if err != nil { - return - } - if it.PutIdleConn != nil { - it.PutIdleConn(time.Since(start).Seconds()) - } - }, - DNSStart: func(_ httptrace.DNSStartInfo) { - if it.DNSStart != nil { - it.DNSStart(time.Since(start).Seconds()) - } - }, - DNSDone: func(_ httptrace.DNSDoneInfo) { - if it.DNSDone != nil { - it.DNSDone(time.Since(start).Seconds()) - } - }, - ConnectStart: func(_, _ string) { - if it.ConnectStart != nil { - it.ConnectStart(time.Since(start).Seconds()) - } - }, - ConnectDone: func(_, _ string, err error) { - if err != nil { - return - } - if it.ConnectDone != nil { - it.ConnectDone(time.Since(start).Seconds()) - } - }, - GotFirstResponseByte: func() { - if it.GotFirstResponseByte != nil { - it.GotFirstResponseByte(time.Since(start).Seconds()) - } - }, - Got100Continue: func() { - if it.Got100Continue != nil { - it.Got100Continue(time.Since(start).Seconds()) - } - }, - TLSHandshakeStart: func() { - if it.TLSHandshakeStart != nil { - it.TLSHandshakeStart(time.Since(start).Seconds()) - } - }, - TLSHandshakeDone: func(_ tls.ConnectionState, err error) { - if err != nil { - return - } - if it.TLSHandshakeDone != nil { - it.TLSHandshakeDone(time.Since(start).Seconds()) - } - }, - WroteHeaders: func() { - if it.WroteHeaders != nil { - it.WroteHeaders(time.Since(start).Seconds()) - } - }, - Wait100Continue: func() { - if it.Wait100Continue != nil { - it.Wait100Continue(time.Since(start).Seconds()) - } - }, - WroteRequest: func(_ httptrace.WroteRequestInfo) { - if it.WroteRequest != nil { - it.WroteRequest(time.Since(start).Seconds()) - } - }, - } - r = r.WithContext(httptrace.WithClientTrace(context.Background(), trace)) - - return next.RoundTrip(r) - }) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go deleted file mode 100644 index 9db243805..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go +++ /dev/null @@ -1,447 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package promhttp - -import ( - "errors" - "net/http" - "strconv" - "strings" - "time" - - dto "github.com/prometheus/client_model/go" - - "github.com/prometheus/client_golang/prometheus" -) - -// magicString is used for the hacky label test in checkLabels. Remove once fixed. -const magicString = "zZgWfBxLqvG8kc8IMv3POi2Bb0tZI3vAnBx+gBaFi9FyPzB/CzKUer1yufDa" - -// InstrumentHandlerInFlight is a middleware that wraps the provided -// http.Handler. It sets the provided prometheus.Gauge to the number of -// requests currently handled by the wrapped http.Handler. -// -// See the example for InstrumentHandlerDuration for example usage. -func InstrumentHandlerInFlight(g prometheus.Gauge, next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - g.Inc() - defer g.Dec() - next.ServeHTTP(w, r) - }) -} - -// InstrumentHandlerDuration is a middleware that wraps the provided -// http.Handler to observe the request duration with the provided ObserverVec. -// The ObserverVec must have zero, one, or two non-const non-curried labels. For -// those, the only allowed label names are "code" and "method". The function -// panics otherwise. The Observe method of the Observer in the ObserverVec is -// called with the request duration in seconds. Partitioning happens by HTTP -// status code and/or HTTP method if the respective instance label names are -// present in the ObserverVec. For unpartitioned observations, use an -// ObserverVec with zero labels. Note that partitioning of Histograms is -// expensive and should be used judiciously. -// -// If the wrapped Handler does not set a status code, a status code of 200 is assumed. -// -// If the wrapped Handler panics, no values are reported. -// -// Note that this method is only guaranteed to never observe negative durations -// if used with Go1.9+. -func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler) http.HandlerFunc { - code, method := checkLabels(obs) - - if code { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - now := time.Now() - d := newDelegator(w, nil) - next.ServeHTTP(d, r) - - obs.With(labels(code, method, r.Method, d.Status())).Observe(time.Since(now).Seconds()) - }) - } - - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - now := time.Now() - next.ServeHTTP(w, r) - obs.With(labels(code, method, r.Method, 0)).Observe(time.Since(now).Seconds()) - }) -} - -// InstrumentHandlerCounter is a middleware that wraps the provided http.Handler -// to observe the request result with the provided CounterVec. The CounterVec -// must have zero, one, or two non-const non-curried labels. For those, the only -// allowed label names are "code" and "method". The function panics -// otherwise. Partitioning of the CounterVec happens by HTTP status code and/or -// HTTP method if the respective instance label names are present in the -// CounterVec. For unpartitioned counting, use a CounterVec with zero labels. -// -// If the wrapped Handler does not set a status code, a status code of 200 is assumed. -// -// If the wrapped Handler panics, the Counter is not incremented. -// -// See the example for InstrumentHandlerDuration for example usage. -func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler) http.HandlerFunc { - code, method := checkLabels(counter) - - if code { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - d := newDelegator(w, nil) - next.ServeHTTP(d, r) - counter.With(labels(code, method, r.Method, d.Status())).Inc() - }) - } - - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - next.ServeHTTP(w, r) - counter.With(labels(code, method, r.Method, 0)).Inc() - }) -} - -// InstrumentHandlerTimeToWriteHeader is a middleware that wraps the provided -// http.Handler to observe with the provided ObserverVec the request duration -// until the response headers are written. The ObserverVec must have zero, one, -// or two non-const non-curried labels. For those, the only allowed label names -// are "code" and "method". The function panics otherwise. The Observe method of -// the Observer in the ObserverVec is called with the request duration in -// seconds. Partitioning happens by HTTP status code and/or HTTP method if the -// respective instance label names are present in the ObserverVec. For -// unpartitioned observations, use an ObserverVec with zero labels. Note that -// partitioning of Histograms is expensive and should be used judiciously. -// -// If the wrapped Handler panics before calling WriteHeader, no value is -// reported. -// -// Note that this method is only guaranteed to never observe negative durations -// if used with Go1.9+. -// -// See the example for InstrumentHandlerDuration for example usage. -func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next http.Handler) http.HandlerFunc { - code, method := checkLabels(obs) - - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - now := time.Now() - d := newDelegator(w, func(status int) { - obs.With(labels(code, method, r.Method, status)).Observe(time.Since(now).Seconds()) - }) - next.ServeHTTP(d, r) - }) -} - -// InstrumentHandlerRequestSize is a middleware that wraps the provided -// http.Handler to observe the request size with the provided ObserverVec. The -// ObserverVec must have zero, one, or two non-const non-curried labels. For -// those, the only allowed label names are "code" and "method". The function -// panics otherwise. The Observe method of the Observer in the ObserverVec is -// called with the request size in bytes. Partitioning happens by HTTP status -// code and/or HTTP method if the respective instance label names are present in -// the ObserverVec. For unpartitioned observations, use an ObserverVec with zero -// labels. Note that partitioning of Histograms is expensive and should be used -// judiciously. -// -// If the wrapped Handler does not set a status code, a status code of 200 is assumed. -// -// If the wrapped Handler panics, no values are reported. -// -// See the example for InstrumentHandlerDuration for example usage. -func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler) http.HandlerFunc { - code, method := checkLabels(obs) - - if code { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - d := newDelegator(w, nil) - next.ServeHTTP(d, r) - size := computeApproximateRequestSize(r) - obs.With(labels(code, method, r.Method, d.Status())).Observe(float64(size)) - }) - } - - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - next.ServeHTTP(w, r) - size := computeApproximateRequestSize(r) - obs.With(labels(code, method, r.Method, 0)).Observe(float64(size)) - }) -} - -// InstrumentHandlerResponseSize is a middleware that wraps the provided -// http.Handler to observe the response size with the provided ObserverVec. The -// ObserverVec must have zero, one, or two non-const non-curried labels. For -// those, the only allowed label names are "code" and "method". The function -// panics otherwise. The Observe method of the Observer in the ObserverVec is -// called with the response size in bytes. Partitioning happens by HTTP status -// code and/or HTTP method if the respective instance label names are present in -// the ObserverVec. For unpartitioned observations, use an ObserverVec with zero -// labels. Note that partitioning of Histograms is expensive and should be used -// judiciously. -// -// If the wrapped Handler does not set a status code, a status code of 200 is assumed. -// -// If the wrapped Handler panics, no values are reported. -// -// See the example for InstrumentHandlerDuration for example usage. -func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http.Handler) http.Handler { - code, method := checkLabels(obs) - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - d := newDelegator(w, nil) - next.ServeHTTP(d, r) - obs.With(labels(code, method, r.Method, d.Status())).Observe(float64(d.Written())) - }) -} - -func checkLabels(c prometheus.Collector) (code bool, method bool) { - // TODO(beorn7): Remove this hacky way to check for instance labels - // once Descriptors can have their dimensionality queried. - var ( - desc *prometheus.Desc - m prometheus.Metric - pm dto.Metric - lvs []string - ) - - // Get the Desc from the Collector. - descc := make(chan *prometheus.Desc, 1) - c.Describe(descc) - - select { - case desc = <-descc: - default: - panic("no description provided by collector") - } - select { - case <-descc: - panic("more than one description provided by collector") - default: - } - - close(descc) - - // Create a ConstMetric with the Desc. Since we don't know how many - // variable labels there are, try for as long as it needs. - for err := errors.New("dummy"); err != nil; lvs = append(lvs, magicString) { - m, err = prometheus.NewConstMetric(desc, prometheus.UntypedValue, 0, lvs...) - } - - // Write out the metric into a proto message and look at the labels. - // If the value is not the magicString, it is a constLabel, which doesn't interest us. - // If the label is curried, it doesn't interest us. - // In all other cases, only "code" or "method" is allowed. - if err := m.Write(&pm); err != nil { - panic("error checking metric for labels") - } - for _, label := range pm.Label { - name, value := label.GetName(), label.GetValue() - if value != magicString || isLabelCurried(c, name) { - continue - } - switch name { - case "code": - code = true - case "method": - method = true - default: - panic("metric partitioned with non-supported labels") - } - } - return -} - -func isLabelCurried(c prometheus.Collector, label string) bool { - // This is even hackier than the label test above. - // We essentially try to curry again and see if it works. - // But for that, we need to type-convert to the two - // types we use here, ObserverVec or *CounterVec. - switch v := c.(type) { - case *prometheus.CounterVec: - if _, err := v.CurryWith(prometheus.Labels{label: "dummy"}); err == nil { - return false - } - case prometheus.ObserverVec: - if _, err := v.CurryWith(prometheus.Labels{label: "dummy"}); err == nil { - return false - } - default: - panic("unsupported metric vec type") - } - return true -} - -// emptyLabels is a one-time allocation for non-partitioned metrics to avoid -// unnecessary allocations on each request. -var emptyLabels = prometheus.Labels{} - -func labels(code, method bool, reqMethod string, status int) prometheus.Labels { - if !(code || method) { - return emptyLabels - } - labels := prometheus.Labels{} - - if code { - labels["code"] = sanitizeCode(status) - } - if method { - labels["method"] = sanitizeMethod(reqMethod) - } - - return labels -} - -func computeApproximateRequestSize(r *http.Request) int { - s := 0 - if r.URL != nil { - s += len(r.URL.String()) - } - - s += len(r.Method) - s += len(r.Proto) - for name, values := range r.Header { - s += len(name) - for _, value := range values { - s += len(value) - } - } - s += len(r.Host) - - // N.B. r.Form and r.MultipartForm are assumed to be included in r.URL. - - if r.ContentLength != -1 { - s += int(r.ContentLength) - } - return s -} - -func sanitizeMethod(m string) string { - switch m { - case "GET", "get": - return "get" - case "PUT", "put": - return "put" - case "HEAD", "head": - return "head" - case "POST", "post": - return "post" - case "DELETE", "delete": - return "delete" - case "CONNECT", "connect": - return "connect" - case "OPTIONS", "options": - return "options" - case "NOTIFY", "notify": - return "notify" - default: - return strings.ToLower(m) - } -} - -// If the wrapped http.Handler has not set a status code, i.e. the value is -// currently 0, santizeCode will return 200, for consistency with behavior in -// the stdlib. -func sanitizeCode(s int) string { - switch s { - case 100: - return "100" - case 101: - return "101" - - case 200, 0: - return "200" - case 201: - return "201" - case 202: - return "202" - case 203: - return "203" - case 204: - return "204" - case 205: - return "205" - case 206: - return "206" - - case 300: - return "300" - case 301: - return "301" - case 302: - return "302" - case 304: - return "304" - case 305: - return "305" - case 307: - return "307" - - case 400: - return "400" - case 401: - return "401" - case 402: - return "402" - case 403: - return "403" - case 404: - return "404" - case 405: - return "405" - case 406: - return "406" - case 407: - return "407" - case 408: - return "408" - case 409: - return "409" - case 410: - return "410" - case 411: - return "411" - case 412: - return "412" - case 413: - return "413" - case 414: - return "414" - case 415: - return "415" - case 416: - return "416" - case 417: - return "417" - case 418: - return "418" - - case 500: - return "500" - case 501: - return "501" - case 502: - return "502" - case 503: - return "503" - case 504: - return "504" - case 505: - return "505" - - case 428: - return "428" - case 429: - return "429" - case 431: - return "431" - case 511: - return "511" - - default: - return strconv.Itoa(s) - } -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/timer.go b/vendor/github.com/prometheus/client_golang/prometheus/timer.go deleted file mode 100644 index 8d5f10523..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/timer.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2016 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import "time" - -// Timer is a helper type to time functions. Use NewTimer to create new -// instances. -type Timer struct { - begin time.Time - observer Observer -} - -// NewTimer creates a new Timer. The provided Observer is used to observe a -// duration in seconds. Timer is usually used to time a function call in the -// following way: -// func TimeMe() { -// timer := NewTimer(myHistogram) -// defer timer.ObserveDuration() -// // Do actual work. -// } -func NewTimer(o Observer) *Timer { - return &Timer{ - begin: time.Now(), - observer: o, - } -} - -// ObserveDuration records the duration passed since the Timer was created with -// NewTimer. It calls the Observe method of the Observer provided during -// construction with the duration in seconds as an argument. The observed -// duration is also returned. ObserveDuration is usually called with a defer -// statement. -// -// Note that this method is only guaranteed to never observe negative durations -// if used with Go1.9+. -func (t *Timer) ObserveDuration() time.Duration { - d := time.Since(t.begin) - if t.observer != nil { - t.observer.Observe(d.Seconds()) - } - return d -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/untyped.go b/vendor/github.com/prometheus/client_golang/prometheus/untyped.go deleted file mode 100644 index 0f9ce63f4..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/untyped.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -// UntypedOpts is an alias for Opts. See there for doc comments. -type UntypedOpts Opts - -// UntypedFunc works like GaugeFunc but the collected metric is of type -// "Untyped". UntypedFunc is useful to mirror an external metric of unknown -// type. -// -// To create UntypedFunc instances, use NewUntypedFunc. -type UntypedFunc interface { - Metric - Collector -} - -// NewUntypedFunc creates a new UntypedFunc based on the provided -// UntypedOpts. The value reported is determined by calling the given function -// from within the Write method. Take into account that metric collection may -// happen concurrently. If that results in concurrent calls to Write, like in -// the case where an UntypedFunc is directly registered with Prometheus, the -// provided function must be concurrency-safe. -func NewUntypedFunc(opts UntypedOpts, function func() float64) UntypedFunc { - return newValueFunc(NewDesc( - BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), - opts.Help, - nil, - opts.ConstLabels, - ), UntypedValue, function) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/vendor/github.com/prometheus/client_golang/prometheus/vec.go deleted file mode 100644 index 14ed9e856..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/vec.go +++ /dev/null @@ -1,472 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "fmt" - "sync" - - "github.com/prometheus/common/model" -) - -// metricVec is a Collector to bundle metrics of the same name that differ in -// their label values. metricVec is not used directly (and therefore -// unexported). It is used as a building block for implementations of vectors of -// a given metric type, like GaugeVec, CounterVec, SummaryVec, and HistogramVec. -// It also handles label currying. It uses basicMetricVec internally. -type metricVec struct { - *metricMap - - curry []curriedLabelValue - - // hashAdd and hashAddByte can be replaced for testing collision handling. - hashAdd func(h uint64, s string) uint64 - hashAddByte func(h uint64, b byte) uint64 -} - -// newMetricVec returns an initialized metricVec. -func newMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *metricVec { - return &metricVec{ - metricMap: &metricMap{ - metrics: map[uint64][]metricWithLabelValues{}, - desc: desc, - newMetric: newMetric, - }, - hashAdd: hashAdd, - hashAddByte: hashAddByte, - } -} - -// DeleteLabelValues removes the metric where the variable labels are the same -// as those passed in as labels (same order as the VariableLabels in Desc). It -// returns true if a metric was deleted. -// -// It is not an error if the number of label values is not the same as the -// number of VariableLabels in Desc. However, such inconsistent label count can -// never match an actual metric, so the method will always return false in that -// case. -// -// Note that for more than one label value, this method is prone to mistakes -// caused by an incorrect order of arguments. Consider Delete(Labels) as an -// alternative to avoid that type of mistake. For higher label numbers, the -// latter has a much more readable (albeit more verbose) syntax, but it comes -// with a performance overhead (for creating and processing the Labels map). -// See also the CounterVec example. -func (m *metricVec) DeleteLabelValues(lvs ...string) bool { - h, err := m.hashLabelValues(lvs) - if err != nil { - return false - } - - return m.metricMap.deleteByHashWithLabelValues(h, lvs, m.curry) -} - -// Delete deletes the metric where the variable labels are the same as those -// passed in as labels. It returns true if a metric was deleted. -// -// It is not an error if the number and names of the Labels are inconsistent -// with those of the VariableLabels in Desc. However, such inconsistent Labels -// can never match an actual metric, so the method will always return false in -// that case. -// -// This method is used for the same purpose as DeleteLabelValues(...string). See -// there for pros and cons of the two methods. -func (m *metricVec) Delete(labels Labels) bool { - h, err := m.hashLabels(labels) - if err != nil { - return false - } - - return m.metricMap.deleteByHashWithLabels(h, labels, m.curry) -} - -func (m *metricVec) curryWith(labels Labels) (*metricVec, error) { - var ( - newCurry []curriedLabelValue - oldCurry = m.curry - iCurry int - ) - for i, label := range m.desc.variableLabels { - val, ok := labels[label] - if iCurry < len(oldCurry) && oldCurry[iCurry].index == i { - if ok { - return nil, fmt.Errorf("label name %q is already curried", label) - } - newCurry = append(newCurry, oldCurry[iCurry]) - iCurry++ - } else { - if !ok { - continue // Label stays uncurried. - } - newCurry = append(newCurry, curriedLabelValue{i, val}) - } - } - if l := len(oldCurry) + len(labels) - len(newCurry); l > 0 { - return nil, fmt.Errorf("%d unknown label(s) found during currying", l) - } - - return &metricVec{ - metricMap: m.metricMap, - curry: newCurry, - hashAdd: m.hashAdd, - hashAddByte: m.hashAddByte, - }, nil -} - -func (m *metricVec) getMetricWithLabelValues(lvs ...string) (Metric, error) { - h, err := m.hashLabelValues(lvs) - if err != nil { - return nil, err - } - - return m.metricMap.getOrCreateMetricWithLabelValues(h, lvs, m.curry), nil -} - -func (m *metricVec) getMetricWith(labels Labels) (Metric, error) { - h, err := m.hashLabels(labels) - if err != nil { - return nil, err - } - - return m.metricMap.getOrCreateMetricWithLabels(h, labels, m.curry), nil -} - -func (m *metricVec) hashLabelValues(vals []string) (uint64, error) { - if err := validateLabelValues(vals, len(m.desc.variableLabels)-len(m.curry)); err != nil { - return 0, err - } - - var ( - h = hashNew() - curry = m.curry - iVals, iCurry int - ) - for i := 0; i < len(m.desc.variableLabels); i++ { - if iCurry < len(curry) && curry[iCurry].index == i { - h = m.hashAdd(h, curry[iCurry].value) - iCurry++ - } else { - h = m.hashAdd(h, vals[iVals]) - iVals++ - } - h = m.hashAddByte(h, model.SeparatorByte) - } - return h, nil -} - -func (m *metricVec) hashLabels(labels Labels) (uint64, error) { - if err := validateValuesInLabels(labels, len(m.desc.variableLabels)-len(m.curry)); err != nil { - return 0, err - } - - var ( - h = hashNew() - curry = m.curry - iCurry int - ) - for i, label := range m.desc.variableLabels { - val, ok := labels[label] - if iCurry < len(curry) && curry[iCurry].index == i { - if ok { - return 0, fmt.Errorf("label name %q is already curried", label) - } - h = m.hashAdd(h, curry[iCurry].value) - iCurry++ - } else { - if !ok { - return 0, fmt.Errorf("label name %q missing in label map", label) - } - h = m.hashAdd(h, val) - } - h = m.hashAddByte(h, model.SeparatorByte) - } - return h, nil -} - -// metricWithLabelValues provides the metric and its label values for -// disambiguation on hash collision. -type metricWithLabelValues struct { - values []string - metric Metric -} - -// curriedLabelValue sets the curried value for a label at the given index. -type curriedLabelValue struct { - index int - value string -} - -// metricMap is a helper for metricVec and shared between differently curried -// metricVecs. -type metricMap struct { - mtx sync.RWMutex // Protects metrics. - metrics map[uint64][]metricWithLabelValues - desc *Desc - newMetric func(labelValues ...string) Metric -} - -// Describe implements Collector. It will send exactly one Desc to the provided -// channel. -func (m *metricMap) Describe(ch chan<- *Desc) { - ch <- m.desc -} - -// Collect implements Collector. -func (m *metricMap) Collect(ch chan<- Metric) { - m.mtx.RLock() - defer m.mtx.RUnlock() - - for _, metrics := range m.metrics { - for _, metric := range metrics { - ch <- metric.metric - } - } -} - -// Reset deletes all metrics in this vector. -func (m *metricMap) Reset() { - m.mtx.Lock() - defer m.mtx.Unlock() - - for h := range m.metrics { - delete(m.metrics, h) - } -} - -// deleteByHashWithLabelValues removes the metric from the hash bucket h. If -// there are multiple matches in the bucket, use lvs to select a metric and -// remove only that metric. -func (m *metricMap) deleteByHashWithLabelValues( - h uint64, lvs []string, curry []curriedLabelValue, -) bool { - m.mtx.Lock() - defer m.mtx.Unlock() - - metrics, ok := m.metrics[h] - if !ok { - return false - } - - i := findMetricWithLabelValues(metrics, lvs, curry) - if i >= len(metrics) { - return false - } - - if len(metrics) > 1 { - m.metrics[h] = append(metrics[:i], metrics[i+1:]...) - } else { - delete(m.metrics, h) - } - return true -} - -// deleteByHashWithLabels removes the metric from the hash bucket h. If there -// are multiple matches in the bucket, use lvs to select a metric and remove -// only that metric. -func (m *metricMap) deleteByHashWithLabels( - h uint64, labels Labels, curry []curriedLabelValue, -) bool { - m.mtx.Lock() - defer m.mtx.Unlock() - - metrics, ok := m.metrics[h] - if !ok { - return false - } - i := findMetricWithLabels(m.desc, metrics, labels, curry) - if i >= len(metrics) { - return false - } - - if len(metrics) > 1 { - m.metrics[h] = append(metrics[:i], metrics[i+1:]...) - } else { - delete(m.metrics, h) - } - return true -} - -// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value -// or creates it and returns the new one. -// -// This function holds the mutex. -func (m *metricMap) getOrCreateMetricWithLabelValues( - hash uint64, lvs []string, curry []curriedLabelValue, -) Metric { - m.mtx.RLock() - metric, ok := m.getMetricWithHashAndLabelValues(hash, lvs, curry) - m.mtx.RUnlock() - if ok { - return metric - } - - m.mtx.Lock() - defer m.mtx.Unlock() - metric, ok = m.getMetricWithHashAndLabelValues(hash, lvs, curry) - if !ok { - inlinedLVs := inlineLabelValues(lvs, curry) - metric = m.newMetric(inlinedLVs...) - m.metrics[hash] = append(m.metrics[hash], metricWithLabelValues{values: inlinedLVs, metric: metric}) - } - return metric -} - -// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value -// or creates it and returns the new one. -// -// This function holds the mutex. -func (m *metricMap) getOrCreateMetricWithLabels( - hash uint64, labels Labels, curry []curriedLabelValue, -) Metric { - m.mtx.RLock() - metric, ok := m.getMetricWithHashAndLabels(hash, labels, curry) - m.mtx.RUnlock() - if ok { - return metric - } - - m.mtx.Lock() - defer m.mtx.Unlock() - metric, ok = m.getMetricWithHashAndLabels(hash, labels, curry) - if !ok { - lvs := extractLabelValues(m.desc, labels, curry) - metric = m.newMetric(lvs...) - m.metrics[hash] = append(m.metrics[hash], metricWithLabelValues{values: lvs, metric: metric}) - } - return metric -} - -// getMetricWithHashAndLabelValues gets a metric while handling possible -// collisions in the hash space. Must be called while holding the read mutex. -func (m *metricMap) getMetricWithHashAndLabelValues( - h uint64, lvs []string, curry []curriedLabelValue, -) (Metric, bool) { - metrics, ok := m.metrics[h] - if ok { - if i := findMetricWithLabelValues(metrics, lvs, curry); i < len(metrics) { - return metrics[i].metric, true - } - } - return nil, false -} - -// getMetricWithHashAndLabels gets a metric while handling possible collisions in -// the hash space. Must be called while holding read mutex. -func (m *metricMap) getMetricWithHashAndLabels( - h uint64, labels Labels, curry []curriedLabelValue, -) (Metric, bool) { - metrics, ok := m.metrics[h] - if ok { - if i := findMetricWithLabels(m.desc, metrics, labels, curry); i < len(metrics) { - return metrics[i].metric, true - } - } - return nil, false -} - -// findMetricWithLabelValues returns the index of the matching metric or -// len(metrics) if not found. -func findMetricWithLabelValues( - metrics []metricWithLabelValues, lvs []string, curry []curriedLabelValue, -) int { - for i, metric := range metrics { - if matchLabelValues(metric.values, lvs, curry) { - return i - } - } - return len(metrics) -} - -// findMetricWithLabels returns the index of the matching metric or len(metrics) -// if not found. -func findMetricWithLabels( - desc *Desc, metrics []metricWithLabelValues, labels Labels, curry []curriedLabelValue, -) int { - for i, metric := range metrics { - if matchLabels(desc, metric.values, labels, curry) { - return i - } - } - return len(metrics) -} - -func matchLabelValues(values []string, lvs []string, curry []curriedLabelValue) bool { - if len(values) != len(lvs)+len(curry) { - return false - } - var iLVs, iCurry int - for i, v := range values { - if iCurry < len(curry) && curry[iCurry].index == i { - if v != curry[iCurry].value { - return false - } - iCurry++ - continue - } - if v != lvs[iLVs] { - return false - } - iLVs++ - } - return true -} - -func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabelValue) bool { - if len(values) != len(labels)+len(curry) { - return false - } - iCurry := 0 - for i, k := range desc.variableLabels { - if iCurry < len(curry) && curry[iCurry].index == i { - if values[i] != curry[iCurry].value { - return false - } - iCurry++ - continue - } - if values[i] != labels[k] { - return false - } - } - return true -} - -func extractLabelValues(desc *Desc, labels Labels, curry []curriedLabelValue) []string { - labelValues := make([]string, len(labels)+len(curry)) - iCurry := 0 - for i, k := range desc.variableLabels { - if iCurry < len(curry) && curry[iCurry].index == i { - labelValues[i] = curry[iCurry].value - iCurry++ - continue - } - labelValues[i] = labels[k] - } - return labelValues -} - -func inlineLabelValues(lvs []string, curry []curriedLabelValue) []string { - labelValues := make([]string, len(lvs)+len(curry)) - var iCurry, iLVs int - for i := range labelValues { - if iCurry < len(curry) && curry[iCurry].index == i { - labelValues[i] = curry[iCurry].value - iCurry++ - continue - } - labelValues[i] = lvs[iLVs] - iLVs++ - } - return labelValues -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go deleted file mode 100644 index 49159bf3e..000000000 --- a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package prometheus - -import ( - "fmt" - "sort" - - "github.com/golang/protobuf/proto" - - dto "github.com/prometheus/client_model/go" -) - -// WrapRegistererWith returns a Registerer wrapping the provided -// Registerer. Collectors registered with the returned Registerer will be -// registered with the wrapped Registerer in a modified way. The modified -// Collector adds the provided Labels to all Metrics it collects (as -// ConstLabels). The Metrics collected by the unmodified Collector must not -// duplicate any of those labels. -// -// WrapRegistererWith provides a way to add fixed labels to a subset of -// Collectors. It should not be used to add fixed labels to all metrics exposed. -// -// The Collector example demonstrates a use of WrapRegistererWith. -func WrapRegistererWith(labels Labels, reg Registerer) Registerer { - return &wrappingRegisterer{ - wrappedRegisterer: reg, - labels: labels, - } -} - -// WrapRegistererWithPrefix returns a Registerer wrapping the provided -// Registerer. Collectors registered with the returned Registerer will be -// registered with the wrapped Registerer in a modified way. The modified -// Collector adds the provided prefix to the name of all Metrics it collects. -// -// WrapRegistererWithPrefix is useful to have one place to prefix all metrics of -// a sub-system. To make this work, register metrics of the sub-system with the -// wrapping Registerer returned by WrapRegistererWithPrefix. It is rarely useful -// to use the same prefix for all metrics exposed. In particular, do not prefix -// metric names that are standardized across applications, as that would break -// horizontal monitoring, for example the metrics provided by the Go collector -// (see NewGoCollector) and the process collector (see NewProcessCollector). (In -// fact, those metrics are already prefixed with “go_” or “process_”, -// respectively.) -func WrapRegistererWithPrefix(prefix string, reg Registerer) Registerer { - return &wrappingRegisterer{ - wrappedRegisterer: reg, - prefix: prefix, - } -} - -type wrappingRegisterer struct { - wrappedRegisterer Registerer - prefix string - labels Labels -} - -func (r *wrappingRegisterer) Register(c Collector) error { - return r.wrappedRegisterer.Register(&wrappingCollector{ - wrappedCollector: c, - prefix: r.prefix, - labels: r.labels, - }) -} - -func (r *wrappingRegisterer) MustRegister(cs ...Collector) { - for _, c := range cs { - if err := r.Register(c); err != nil { - panic(err) - } - } -} - -func (r *wrappingRegisterer) Unregister(c Collector) bool { - return r.wrappedRegisterer.Unregister(&wrappingCollector{ - wrappedCollector: c, - prefix: r.prefix, - labels: r.labels, - }) -} - -type wrappingCollector struct { - wrappedCollector Collector - prefix string - labels Labels -} - -func (c *wrappingCollector) Collect(ch chan<- Metric) { - wrappedCh := make(chan Metric) - go func() { - c.wrappedCollector.Collect(wrappedCh) - close(wrappedCh) - }() - for m := range wrappedCh { - ch <- &wrappingMetric{ - wrappedMetric: m, - prefix: c.prefix, - labels: c.labels, - } - } -} - -func (c *wrappingCollector) Describe(ch chan<- *Desc) { - wrappedCh := make(chan *Desc) - go func() { - c.wrappedCollector.Describe(wrappedCh) - close(wrappedCh) - }() - for desc := range wrappedCh { - ch <- wrapDesc(desc, c.prefix, c.labels) - } -} - -type wrappingMetric struct { - wrappedMetric Metric - prefix string - labels Labels -} - -func (m *wrappingMetric) Desc() *Desc { - return wrapDesc(m.wrappedMetric.Desc(), m.prefix, m.labels) -} - -func (m *wrappingMetric) Write(out *dto.Metric) error { - if err := m.wrappedMetric.Write(out); err != nil { - return err - } - if len(m.labels) == 0 { - // No wrapping labels. - return nil - } - for ln, lv := range m.labels { - out.Label = append(out.Label, &dto.LabelPair{ - Name: proto.String(ln), - Value: proto.String(lv), - }) - } - sort.Sort(labelPairSorter(out.Label)) - return nil -} - -func wrapDesc(desc *Desc, prefix string, labels Labels) *Desc { - constLabels := Labels{} - for _, lp := range desc.constLabelPairs { - constLabels[*lp.Name] = *lp.Value - } - for ln, lv := range labels { - if _, alreadyUsed := constLabels[ln]; alreadyUsed { - return &Desc{ - fqName: desc.fqName, - help: desc.help, - variableLabels: desc.variableLabels, - constLabelPairs: desc.constLabelPairs, - err: fmt.Errorf("attempted wrapping with already existing label name %q", ln), - } - } - constLabels[ln] = lv - } - // NewDesc will do remaining validations. - newDesc := NewDesc(prefix+desc.fqName, desc.help, desc.variableLabels, constLabels) - // Propagate errors if there was any. This will override any errer - // created by NewDesc above, i.e. earlier errors get precedence. - if desc.err != nil { - newDesc.err = desc.err - } - return newDesc -} diff --git a/vendor/github.com/prometheus/client_model/go/metrics.pb.go b/vendor/github.com/prometheus/client_model/go/metrics.pb.go deleted file mode 100644 index 9805432c2..000000000 --- a/vendor/github.com/prometheus/client_model/go/metrics.pb.go +++ /dev/null @@ -1,629 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: metrics.proto - -package io_prometheus_client // import "github.com/prometheus/client_model/go" - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type MetricType int32 - -const ( - MetricType_COUNTER MetricType = 0 - MetricType_GAUGE MetricType = 1 - MetricType_SUMMARY MetricType = 2 - MetricType_UNTYPED MetricType = 3 - MetricType_HISTOGRAM MetricType = 4 -) - -var MetricType_name = map[int32]string{ - 0: "COUNTER", - 1: "GAUGE", - 2: "SUMMARY", - 3: "UNTYPED", - 4: "HISTOGRAM", -} -var MetricType_value = map[string]int32{ - "COUNTER": 0, - "GAUGE": 1, - "SUMMARY": 2, - "UNTYPED": 3, - "HISTOGRAM": 4, -} - -func (x MetricType) Enum() *MetricType { - p := new(MetricType) - *p = x - return p -} -func (x MetricType) String() string { - return proto.EnumName(MetricType_name, int32(x)) -} -func (x *MetricType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(MetricType_value, data, "MetricType") - if err != nil { - return err - } - *x = MetricType(value) - return nil -} -func (MetricType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{0} -} - -type LabelPair struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LabelPair) Reset() { *m = LabelPair{} } -func (m *LabelPair) String() string { return proto.CompactTextString(m) } -func (*LabelPair) ProtoMessage() {} -func (*LabelPair) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{0} -} -func (m *LabelPair) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LabelPair.Unmarshal(m, b) -} -func (m *LabelPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LabelPair.Marshal(b, m, deterministic) -} -func (dst *LabelPair) XXX_Merge(src proto.Message) { - xxx_messageInfo_LabelPair.Merge(dst, src) -} -func (m *LabelPair) XXX_Size() int { - return xxx_messageInfo_LabelPair.Size(m) -} -func (m *LabelPair) XXX_DiscardUnknown() { - xxx_messageInfo_LabelPair.DiscardUnknown(m) -} - -var xxx_messageInfo_LabelPair proto.InternalMessageInfo - -func (m *LabelPair) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *LabelPair) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value - } - return "" -} - -type Gauge struct { - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Gauge) Reset() { *m = Gauge{} } -func (m *Gauge) String() string { return proto.CompactTextString(m) } -func (*Gauge) ProtoMessage() {} -func (*Gauge) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{1} -} -func (m *Gauge) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Gauge.Unmarshal(m, b) -} -func (m *Gauge) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Gauge.Marshal(b, m, deterministic) -} -func (dst *Gauge) XXX_Merge(src proto.Message) { - xxx_messageInfo_Gauge.Merge(dst, src) -} -func (m *Gauge) XXX_Size() int { - return xxx_messageInfo_Gauge.Size(m) -} -func (m *Gauge) XXX_DiscardUnknown() { - xxx_messageInfo_Gauge.DiscardUnknown(m) -} - -var xxx_messageInfo_Gauge proto.InternalMessageInfo - -func (m *Gauge) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value - } - return 0 -} - -type Counter struct { - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Counter) Reset() { *m = Counter{} } -func (m *Counter) String() string { return proto.CompactTextString(m) } -func (*Counter) ProtoMessage() {} -func (*Counter) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{2} -} -func (m *Counter) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Counter.Unmarshal(m, b) -} -func (m *Counter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Counter.Marshal(b, m, deterministic) -} -func (dst *Counter) XXX_Merge(src proto.Message) { - xxx_messageInfo_Counter.Merge(dst, src) -} -func (m *Counter) XXX_Size() int { - return xxx_messageInfo_Counter.Size(m) -} -func (m *Counter) XXX_DiscardUnknown() { - xxx_messageInfo_Counter.DiscardUnknown(m) -} - -var xxx_messageInfo_Counter proto.InternalMessageInfo - -func (m *Counter) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value - } - return 0 -} - -type Quantile struct { - Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` - Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Quantile) Reset() { *m = Quantile{} } -func (m *Quantile) String() string { return proto.CompactTextString(m) } -func (*Quantile) ProtoMessage() {} -func (*Quantile) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{3} -} -func (m *Quantile) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Quantile.Unmarshal(m, b) -} -func (m *Quantile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Quantile.Marshal(b, m, deterministic) -} -func (dst *Quantile) XXX_Merge(src proto.Message) { - xxx_messageInfo_Quantile.Merge(dst, src) -} -func (m *Quantile) XXX_Size() int { - return xxx_messageInfo_Quantile.Size(m) -} -func (m *Quantile) XXX_DiscardUnknown() { - xxx_messageInfo_Quantile.DiscardUnknown(m) -} - -var xxx_messageInfo_Quantile proto.InternalMessageInfo - -func (m *Quantile) GetQuantile() float64 { - if m != nil && m.Quantile != nil { - return *m.Quantile - } - return 0 -} - -func (m *Quantile) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value - } - return 0 -} - -type Summary struct { - SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` - SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` - Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Summary) Reset() { *m = Summary{} } -func (m *Summary) String() string { return proto.CompactTextString(m) } -func (*Summary) ProtoMessage() {} -func (*Summary) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{4} -} -func (m *Summary) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Summary.Unmarshal(m, b) -} -func (m *Summary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Summary.Marshal(b, m, deterministic) -} -func (dst *Summary) XXX_Merge(src proto.Message) { - xxx_messageInfo_Summary.Merge(dst, src) -} -func (m *Summary) XXX_Size() int { - return xxx_messageInfo_Summary.Size(m) -} -func (m *Summary) XXX_DiscardUnknown() { - xxx_messageInfo_Summary.DiscardUnknown(m) -} - -var xxx_messageInfo_Summary proto.InternalMessageInfo - -func (m *Summary) GetSampleCount() uint64 { - if m != nil && m.SampleCount != nil { - return *m.SampleCount - } - return 0 -} - -func (m *Summary) GetSampleSum() float64 { - if m != nil && m.SampleSum != nil { - return *m.SampleSum - } - return 0 -} - -func (m *Summary) GetQuantile() []*Quantile { - if m != nil { - return m.Quantile - } - return nil -} - -type Untyped struct { - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Untyped) Reset() { *m = Untyped{} } -func (m *Untyped) String() string { return proto.CompactTextString(m) } -func (*Untyped) ProtoMessage() {} -func (*Untyped) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{5} -} -func (m *Untyped) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Untyped.Unmarshal(m, b) -} -func (m *Untyped) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Untyped.Marshal(b, m, deterministic) -} -func (dst *Untyped) XXX_Merge(src proto.Message) { - xxx_messageInfo_Untyped.Merge(dst, src) -} -func (m *Untyped) XXX_Size() int { - return xxx_messageInfo_Untyped.Size(m) -} -func (m *Untyped) XXX_DiscardUnknown() { - xxx_messageInfo_Untyped.DiscardUnknown(m) -} - -var xxx_messageInfo_Untyped proto.InternalMessageInfo - -func (m *Untyped) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value - } - return 0 -} - -type Histogram struct { - SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` - SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` - Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Histogram) Reset() { *m = Histogram{} } -func (m *Histogram) String() string { return proto.CompactTextString(m) } -func (*Histogram) ProtoMessage() {} -func (*Histogram) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{6} -} -func (m *Histogram) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Histogram.Unmarshal(m, b) -} -func (m *Histogram) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Histogram.Marshal(b, m, deterministic) -} -func (dst *Histogram) XXX_Merge(src proto.Message) { - xxx_messageInfo_Histogram.Merge(dst, src) -} -func (m *Histogram) XXX_Size() int { - return xxx_messageInfo_Histogram.Size(m) -} -func (m *Histogram) XXX_DiscardUnknown() { - xxx_messageInfo_Histogram.DiscardUnknown(m) -} - -var xxx_messageInfo_Histogram proto.InternalMessageInfo - -func (m *Histogram) GetSampleCount() uint64 { - if m != nil && m.SampleCount != nil { - return *m.SampleCount - } - return 0 -} - -func (m *Histogram) GetSampleSum() float64 { - if m != nil && m.SampleSum != nil { - return *m.SampleSum - } - return 0 -} - -func (m *Histogram) GetBucket() []*Bucket { - if m != nil { - return m.Bucket - } - return nil -} - -type Bucket struct { - CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count,json=cumulativeCount" json:"cumulative_count,omitempty"` - UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound,json=upperBound" json:"upper_bound,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Bucket) Reset() { *m = Bucket{} } -func (m *Bucket) String() string { return proto.CompactTextString(m) } -func (*Bucket) ProtoMessage() {} -func (*Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{7} -} -func (m *Bucket) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Bucket.Unmarshal(m, b) -} -func (m *Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Bucket.Marshal(b, m, deterministic) -} -func (dst *Bucket) XXX_Merge(src proto.Message) { - xxx_messageInfo_Bucket.Merge(dst, src) -} -func (m *Bucket) XXX_Size() int { - return xxx_messageInfo_Bucket.Size(m) -} -func (m *Bucket) XXX_DiscardUnknown() { - xxx_messageInfo_Bucket.DiscardUnknown(m) -} - -var xxx_messageInfo_Bucket proto.InternalMessageInfo - -func (m *Bucket) GetCumulativeCount() uint64 { - if m != nil && m.CumulativeCount != nil { - return *m.CumulativeCount - } - return 0 -} - -func (m *Bucket) GetUpperBound() float64 { - if m != nil && m.UpperBound != nil { - return *m.UpperBound - } - return 0 -} - -type Metric struct { - Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` - Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` - Counter *Counter `protobuf:"bytes,3,opt,name=counter" json:"counter,omitempty"` - Summary *Summary `protobuf:"bytes,4,opt,name=summary" json:"summary,omitempty"` - Untyped *Untyped `protobuf:"bytes,5,opt,name=untyped" json:"untyped,omitempty"` - Histogram *Histogram `protobuf:"bytes,7,opt,name=histogram" json:"histogram,omitempty"` - TimestampMs *int64 `protobuf:"varint,6,opt,name=timestamp_ms,json=timestampMs" json:"timestamp_ms,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Metric) Reset() { *m = Metric{} } -func (m *Metric) String() string { return proto.CompactTextString(m) } -func (*Metric) ProtoMessage() {} -func (*Metric) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{8} -} -func (m *Metric) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Metric.Unmarshal(m, b) -} -func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Metric.Marshal(b, m, deterministic) -} -func (dst *Metric) XXX_Merge(src proto.Message) { - xxx_messageInfo_Metric.Merge(dst, src) -} -func (m *Metric) XXX_Size() int { - return xxx_messageInfo_Metric.Size(m) -} -func (m *Metric) XXX_DiscardUnknown() { - xxx_messageInfo_Metric.DiscardUnknown(m) -} - -var xxx_messageInfo_Metric proto.InternalMessageInfo - -func (m *Metric) GetLabel() []*LabelPair { - if m != nil { - return m.Label - } - return nil -} - -func (m *Metric) GetGauge() *Gauge { - if m != nil { - return m.Gauge - } - return nil -} - -func (m *Metric) GetCounter() *Counter { - if m != nil { - return m.Counter - } - return nil -} - -func (m *Metric) GetSummary() *Summary { - if m != nil { - return m.Summary - } - return nil -} - -func (m *Metric) GetUntyped() *Untyped { - if m != nil { - return m.Untyped - } - return nil -} - -func (m *Metric) GetHistogram() *Histogram { - if m != nil { - return m.Histogram - } - return nil -} - -func (m *Metric) GetTimestampMs() int64 { - if m != nil && m.TimestampMs != nil { - return *m.TimestampMs - } - return 0 -} - -type MetricFamily struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` - Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` - Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MetricFamily) Reset() { *m = MetricFamily{} } -func (m *MetricFamily) String() string { return proto.CompactTextString(m) } -func (*MetricFamily) ProtoMessage() {} -func (*MetricFamily) Descriptor() ([]byte, []int) { - return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{9} -} -func (m *MetricFamily) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MetricFamily.Unmarshal(m, b) -} -func (m *MetricFamily) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MetricFamily.Marshal(b, m, deterministic) -} -func (dst *MetricFamily) XXX_Merge(src proto.Message) { - xxx_messageInfo_MetricFamily.Merge(dst, src) -} -func (m *MetricFamily) XXX_Size() int { - return xxx_messageInfo_MetricFamily.Size(m) -} -func (m *MetricFamily) XXX_DiscardUnknown() { - xxx_messageInfo_MetricFamily.DiscardUnknown(m) -} - -var xxx_messageInfo_MetricFamily proto.InternalMessageInfo - -func (m *MetricFamily) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MetricFamily) GetHelp() string { - if m != nil && m.Help != nil { - return *m.Help - } - return "" -} - -func (m *MetricFamily) GetType() MetricType { - if m != nil && m.Type != nil { - return *m.Type - } - return MetricType_COUNTER -} - -func (m *MetricFamily) GetMetric() []*Metric { - if m != nil { - return m.Metric - } - return nil -} - -func init() { - proto.RegisterType((*LabelPair)(nil), "io.prometheus.client.LabelPair") - proto.RegisterType((*Gauge)(nil), "io.prometheus.client.Gauge") - proto.RegisterType((*Counter)(nil), "io.prometheus.client.Counter") - proto.RegisterType((*Quantile)(nil), "io.prometheus.client.Quantile") - proto.RegisterType((*Summary)(nil), "io.prometheus.client.Summary") - proto.RegisterType((*Untyped)(nil), "io.prometheus.client.Untyped") - proto.RegisterType((*Histogram)(nil), "io.prometheus.client.Histogram") - proto.RegisterType((*Bucket)(nil), "io.prometheus.client.Bucket") - proto.RegisterType((*Metric)(nil), "io.prometheus.client.Metric") - proto.RegisterType((*MetricFamily)(nil), "io.prometheus.client.MetricFamily") - proto.RegisterEnum("io.prometheus.client.MetricType", MetricType_name, MetricType_value) -} - -func init() { proto.RegisterFile("metrics.proto", fileDescriptor_metrics_c97c9a2b9560cb8f) } - -var fileDescriptor_metrics_c97c9a2b9560cb8f = []byte{ - // 591 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x4f, 0x4f, 0xdb, 0x4e, - 0x14, 0xfc, 0x99, 0xd8, 0x09, 0x7e, 0x86, 0x5f, 0xad, 0x15, 0x07, 0xab, 0x2d, 0x25, 0xcd, 0x89, - 0xf6, 0x10, 0x54, 0x04, 0xaa, 0x44, 0xdb, 0x03, 0x50, 0x1a, 0x2a, 0xd5, 0x40, 0x37, 0xc9, 0x81, - 0x5e, 0xac, 0x8d, 0x59, 0x25, 0x56, 0xbd, 0xb6, 0x6b, 0xef, 0x22, 0xe5, 0xdc, 0x43, 0xbf, 0x47, - 0xbf, 0x68, 0xab, 0xfd, 0xe3, 0x18, 0x24, 0xc3, 0xa9, 0xb7, 0xb7, 0xf3, 0x66, 0xde, 0x8e, 0x77, - 0xc7, 0x0b, 0x9b, 0x8c, 0xf2, 0x32, 0x89, 0xab, 0x61, 0x51, 0xe6, 0x3c, 0x47, 0x5b, 0x49, 0x2e, - 0x2b, 0x46, 0xf9, 0x82, 0x8a, 0x6a, 0x18, 0xa7, 0x09, 0xcd, 0xf8, 0xe0, 0x10, 0xdc, 0x2f, 0x64, - 0x46, 0xd3, 0x2b, 0x92, 0x94, 0x08, 0x81, 0x9d, 0x11, 0x46, 0x03, 0xab, 0x6f, 0xed, 0xba, 0x58, - 0xd5, 0x68, 0x0b, 0x9c, 0x5b, 0x92, 0x0a, 0x1a, 0xac, 0x29, 0x50, 0x2f, 0x06, 0xdb, 0xe0, 0x8c, - 0x88, 0x98, 0xdf, 0x69, 0x4b, 0x8d, 0x55, 0xb7, 0x77, 0xa0, 0x77, 0x9a, 0x8b, 0x8c, 0xd3, 0xf2, - 0x01, 0xc2, 0x7b, 0x58, 0xff, 0x2a, 0x48, 0xc6, 0x93, 0x94, 0xa2, 0xa7, 0xb0, 0xfe, 0xc3, 0xd4, - 0x86, 0xb4, 0x5a, 0xdf, 0xdf, 0x7d, 0xa5, 0xfe, 0x65, 0x41, 0x6f, 0x2c, 0x18, 0x23, 0xe5, 0x12, - 0xbd, 0x84, 0x8d, 0x8a, 0xb0, 0x22, 0xa5, 0x51, 0x2c, 0x77, 0x54, 0x13, 0x6c, 0xec, 0x69, 0x4c, - 0x99, 0x40, 0xdb, 0x00, 0x86, 0x52, 0x09, 0x66, 0x26, 0xb9, 0x1a, 0x19, 0x0b, 0x86, 0x8e, 0xee, - 0xec, 0xdf, 0xe9, 0x77, 0x76, 0xbd, 0xfd, 0x17, 0xc3, 0xb6, 0xb3, 0x1a, 0xd6, 0x8e, 0x1b, 0x7f, - 0xf2, 0x43, 0xa7, 0x19, 0x5f, 0x16, 0xf4, 0xe6, 0x81, 0x0f, 0xfd, 0x69, 0x81, 0x7b, 0x9e, 0x54, - 0x3c, 0x9f, 0x97, 0x84, 0xfd, 0x03, 0xb3, 0x07, 0xd0, 0x9d, 0x89, 0xf8, 0x3b, 0xe5, 0xc6, 0xea, - 0xf3, 0x76, 0xab, 0x27, 0x8a, 0x83, 0x0d, 0x77, 0x30, 0x81, 0xae, 0x46, 0xd0, 0x2b, 0xf0, 0x63, - 0xc1, 0x44, 0x4a, 0x78, 0x72, 0x7b, 0xdf, 0xc5, 0x93, 0x06, 0xd7, 0x4e, 0x76, 0xc0, 0x13, 0x45, - 0x41, 0xcb, 0x68, 0x96, 0x8b, 0xec, 0xc6, 0x58, 0x01, 0x05, 0x9d, 0x48, 0x64, 0xf0, 0x67, 0x0d, - 0xba, 0xa1, 0xca, 0x18, 0x3a, 0x04, 0x27, 0x95, 0x31, 0x0a, 0x2c, 0xe5, 0x6a, 0xa7, 0xdd, 0xd5, - 0x2a, 0x69, 0x58, 0xb3, 0xd1, 0x1b, 0x70, 0xe6, 0x32, 0x46, 0x6a, 0xb8, 0xb7, 0xff, 0xac, 0x5d, - 0xa6, 0x92, 0x86, 0x35, 0x13, 0xbd, 0x85, 0x5e, 0xac, 0xa3, 0x15, 0x74, 0x94, 0x68, 0xbb, 0x5d, - 0x64, 0xf2, 0x87, 0x6b, 0xb6, 0x14, 0x56, 0x3a, 0x33, 0x81, 0xfd, 0x98, 0xd0, 0x04, 0x0b, 0xd7, - 0x6c, 0x29, 0x14, 0xfa, 0x8e, 0x03, 0xe7, 0x31, 0xa1, 0x09, 0x02, 0xae, 0xd9, 0xe8, 0x03, 0xb8, - 0x8b, 0xfa, 0xea, 0x83, 0x9e, 0x92, 0x3e, 0x70, 0x30, 0xab, 0x84, 0xe0, 0x46, 0x21, 0xc3, 0xc2, - 0x13, 0x46, 0x2b, 0x4e, 0x58, 0x11, 0xb1, 0x2a, 0xe8, 0xf6, 0xad, 0xdd, 0x0e, 0xf6, 0x56, 0x58, - 0x58, 0x0d, 0x7e, 0x5b, 0xb0, 0xa1, 0x6f, 0xe0, 0x13, 0x61, 0x49, 0xba, 0x6c, 0xfd, 0x83, 0x11, - 0xd8, 0x0b, 0x9a, 0x16, 0xe6, 0x07, 0x56, 0x35, 0x3a, 0x00, 0x5b, 0x7a, 0x54, 0x47, 0xf8, 0xff, - 0x7e, 0xbf, 0xdd, 0x95, 0x9e, 0x3c, 0x59, 0x16, 0x14, 0x2b, 0xb6, 0x0c, 0x9f, 0x7e, 0x53, 0x02, - 0xfb, 0xb1, 0xf0, 0x69, 0x1d, 0x36, 0xdc, 0xd7, 0x21, 0x40, 0x33, 0x09, 0x79, 0xd0, 0x3b, 0xbd, - 0x9c, 0x5e, 0x4c, 0xce, 0xb0, 0xff, 0x1f, 0x72, 0xc1, 0x19, 0x1d, 0x4f, 0x47, 0x67, 0xbe, 0x25, - 0xf1, 0xf1, 0x34, 0x0c, 0x8f, 0xf1, 0xb5, 0xbf, 0x26, 0x17, 0xd3, 0x8b, 0xc9, 0xf5, 0xd5, 0xd9, - 0x47, 0xbf, 0x83, 0x36, 0xc1, 0x3d, 0xff, 0x3c, 0x9e, 0x5c, 0x8e, 0xf0, 0x71, 0xe8, 0xdb, 0x27, - 0x18, 0x5a, 0x5f, 0xb2, 0x6f, 0x47, 0xf3, 0x84, 0x2f, 0xc4, 0x6c, 0x18, 0xe7, 0x6c, 0xaf, 0xe9, - 0xee, 0xe9, 0x6e, 0xc4, 0xf2, 0x1b, 0x9a, 0xee, 0xcd, 0xf3, 0x77, 0x49, 0x1e, 0x35, 0xdd, 0x48, - 0x77, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x45, 0x21, 0x7f, 0x64, 0x2b, 0x05, 0x00, 0x00, -} diff --git a/vendor/github.com/prometheus/common/expfmt/text_create.go b/vendor/github.com/prometheus/common/expfmt/text_create.go deleted file mode 100644 index 8e473d0fe..000000000 --- a/vendor/github.com/prometheus/common/expfmt/text_create.go +++ /dev/null @@ -1,468 +0,0 @@ -// Copyright 2014 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package expfmt - -import ( - "bytes" - "fmt" - "io" - "math" - "strconv" - "strings" - "sync" - - "github.com/prometheus/common/model" - - dto "github.com/prometheus/client_model/go" -) - -// enhancedWriter has all the enhanced write functions needed here. bytes.Buffer -// implements it. -type enhancedWriter interface { - io.Writer - WriteRune(r rune) (n int, err error) - WriteString(s string) (n int, err error) - WriteByte(c byte) error -} - -const ( - initialBufSize = 512 - initialNumBufSize = 24 -) - -var ( - bufPool = sync.Pool{ - New: func() interface{} { - return bytes.NewBuffer(make([]byte, 0, initialBufSize)) - }, - } - numBufPool = sync.Pool{ - New: func() interface{} { - b := make([]byte, 0, initialNumBufSize) - return &b - }, - } -) - -// MetricFamilyToText converts a MetricFamily proto message into text format and -// writes the resulting lines to 'out'. It returns the number of bytes written -// and any error encountered. The output will have the same order as the input, -// no further sorting is performed. Furthermore, this function assumes the input -// is already sanitized and does not perform any sanity checks. If the input -// contains duplicate metrics or invalid metric or label names, the conversion -// will result in invalid text format output. -// -// This method fulfills the type 'prometheus.encoder'. -func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err error) { - // Fail-fast checks. - if len(in.Metric) == 0 { - return 0, fmt.Errorf("MetricFamily has no metrics: %s", in) - } - name := in.GetName() - if name == "" { - return 0, fmt.Errorf("MetricFamily has no name: %s", in) - } - - // Try the interface upgrade. If it doesn't work, we'll use a - // bytes.Buffer from the sync.Pool and write out its content to out in a - // single go in the end. - w, ok := out.(enhancedWriter) - if !ok { - b := bufPool.Get().(*bytes.Buffer) - b.Reset() - w = b - defer func() { - bWritten, bErr := out.Write(b.Bytes()) - written = bWritten - if err == nil { - err = bErr - } - bufPool.Put(b) - }() - } - - var n int - - // Comments, first HELP, then TYPE. - if in.Help != nil { - n, err = w.WriteString("# HELP ") - written += n - if err != nil { - return - } - n, err = w.WriteString(name) - written += n - if err != nil { - return - } - err = w.WriteByte(' ') - written++ - if err != nil { - return - } - n, err = writeEscapedString(w, *in.Help, false) - written += n - if err != nil { - return - } - err = w.WriteByte('\n') - written++ - if err != nil { - return - } - } - n, err = w.WriteString("# TYPE ") - written += n - if err != nil { - return - } - n, err = w.WriteString(name) - written += n - if err != nil { - return - } - metricType := in.GetType() - switch metricType { - case dto.MetricType_COUNTER: - n, err = w.WriteString(" counter\n") - case dto.MetricType_GAUGE: - n, err = w.WriteString(" gauge\n") - case dto.MetricType_SUMMARY: - n, err = w.WriteString(" summary\n") - case dto.MetricType_UNTYPED: - n, err = w.WriteString(" untyped\n") - case dto.MetricType_HISTOGRAM: - n, err = w.WriteString(" histogram\n") - default: - return written, fmt.Errorf("unknown metric type %s", metricType.String()) - } - written += n - if err != nil { - return - } - - // Finally the samples, one line for each. - for _, metric := range in.Metric { - switch metricType { - case dto.MetricType_COUNTER: - if metric.Counter == nil { - return written, fmt.Errorf( - "expected counter in metric %s %s", name, metric, - ) - } - n, err = writeSample( - w, name, "", metric, "", 0, - metric.Counter.GetValue(), - ) - case dto.MetricType_GAUGE: - if metric.Gauge == nil { - return written, fmt.Errorf( - "expected gauge in metric %s %s", name, metric, - ) - } - n, err = writeSample( - w, name, "", metric, "", 0, - metric.Gauge.GetValue(), - ) - case dto.MetricType_UNTYPED: - if metric.Untyped == nil { - return written, fmt.Errorf( - "expected untyped in metric %s %s", name, metric, - ) - } - n, err = writeSample( - w, name, "", metric, "", 0, - metric.Untyped.GetValue(), - ) - case dto.MetricType_SUMMARY: - if metric.Summary == nil { - return written, fmt.Errorf( - "expected summary in metric %s %s", name, metric, - ) - } - for _, q := range metric.Summary.Quantile { - n, err = writeSample( - w, name, "", metric, - model.QuantileLabel, q.GetQuantile(), - q.GetValue(), - ) - written += n - if err != nil { - return - } - } - n, err = writeSample( - w, name, "_sum", metric, "", 0, - metric.Summary.GetSampleSum(), - ) - written += n - if err != nil { - return - } - n, err = writeSample( - w, name, "_count", metric, "", 0, - float64(metric.Summary.GetSampleCount()), - ) - case dto.MetricType_HISTOGRAM: - if metric.Histogram == nil { - return written, fmt.Errorf( - "expected histogram in metric %s %s", name, metric, - ) - } - infSeen := false - for _, b := range metric.Histogram.Bucket { - n, err = writeSample( - w, name, "_bucket", metric, - model.BucketLabel, b.GetUpperBound(), - float64(b.GetCumulativeCount()), - ) - written += n - if err != nil { - return - } - if math.IsInf(b.GetUpperBound(), +1) { - infSeen = true - } - } - if !infSeen { - n, err = writeSample( - w, name, "_bucket", metric, - model.BucketLabel, math.Inf(+1), - float64(metric.Histogram.GetSampleCount()), - ) - written += n - if err != nil { - return - } - } - n, err = writeSample( - w, name, "_sum", metric, "", 0, - metric.Histogram.GetSampleSum(), - ) - written += n - if err != nil { - return - } - n, err = writeSample( - w, name, "_count", metric, "", 0, - float64(metric.Histogram.GetSampleCount()), - ) - default: - return written, fmt.Errorf( - "unexpected type in metric %s %s", name, metric, - ) - } - written += n - if err != nil { - return - } - } - return -} - -// writeSample writes a single sample in text format to w, given the metric -// name, the metric proto message itself, optionally an additional label name -// with a float64 value (use empty string as label name if not required), and -// the value. The function returns the number of bytes written and any error -// encountered. -func writeSample( - w enhancedWriter, - name, suffix string, - metric *dto.Metric, - additionalLabelName string, additionalLabelValue float64, - value float64, -) (int, error) { - var written int - n, err := w.WriteString(name) - written += n - if err != nil { - return written, err - } - if suffix != "" { - n, err = w.WriteString(suffix) - written += n - if err != nil { - return written, err - } - } - n, err = writeLabelPairs( - w, metric.Label, additionalLabelName, additionalLabelValue, - ) - written += n - if err != nil { - return written, err - } - err = w.WriteByte(' ') - written++ - if err != nil { - return written, err - } - n, err = writeFloat(w, value) - written += n - if err != nil { - return written, err - } - if metric.TimestampMs != nil { - err = w.WriteByte(' ') - written++ - if err != nil { - return written, err - } - n, err = writeInt(w, *metric.TimestampMs) - written += n - if err != nil { - return written, err - } - } - err = w.WriteByte('\n') - written++ - if err != nil { - return written, err - } - return written, nil -} - -// writeLabelPairs converts a slice of LabelPair proto messages plus the -// explicitly given additional label pair into text formatted as required by the -// text format and writes it to 'w'. An empty slice in combination with an empty -// string 'additionalLabelName' results in nothing being written. Otherwise, the -// label pairs are written, escaped as required by the text format, and enclosed -// in '{...}'. The function returns the number of bytes written and any error -// encountered. -func writeLabelPairs( - w enhancedWriter, - in []*dto.LabelPair, - additionalLabelName string, additionalLabelValue float64, -) (int, error) { - if len(in) == 0 && additionalLabelName == "" { - return 0, nil - } - var ( - written int - separator byte = '{' - ) - for _, lp := range in { - err := w.WriteByte(separator) - written++ - if err != nil { - return written, err - } - n, err := w.WriteString(lp.GetName()) - written += n - if err != nil { - return written, err - } - n, err = w.WriteString(`="`) - written += n - if err != nil { - return written, err - } - n, err = writeEscapedString(w, lp.GetValue(), true) - written += n - if err != nil { - return written, err - } - err = w.WriteByte('"') - written++ - if err != nil { - return written, err - } - separator = ',' - } - if additionalLabelName != "" { - err := w.WriteByte(separator) - written++ - if err != nil { - return written, err - } - n, err := w.WriteString(additionalLabelName) - written += n - if err != nil { - return written, err - } - n, err = w.WriteString(`="`) - written += n - if err != nil { - return written, err - } - n, err = writeFloat(w, additionalLabelValue) - written += n - if err != nil { - return written, err - } - err = w.WriteByte('"') - written++ - if err != nil { - return written, err - } - } - err := w.WriteByte('}') - written++ - if err != nil { - return written, err - } - return written, nil -} - -// writeEscapedString replaces '\' by '\\', new line character by '\n', and - if -// includeDoubleQuote is true - '"' by '\"'. -var ( - escaper = strings.NewReplacer("\\", `\\`, "\n", `\n`) - quotedEscaper = strings.NewReplacer("\\", `\\`, "\n", `\n`, "\"", `\"`) -) - -func writeEscapedString(w enhancedWriter, v string, includeDoubleQuote bool) (int, error) { - if includeDoubleQuote { - return quotedEscaper.WriteString(w, v) - } else { - return escaper.WriteString(w, v) - } -} - -// writeFloat is equivalent to fmt.Fprint with a float64 argument but hardcodes -// a few common cases for increased efficiency. For non-hardcoded cases, it uses -// strconv.AppendFloat to avoid allocations, similar to writeInt. -func writeFloat(w enhancedWriter, f float64) (int, error) { - switch { - case f == 1: - return 1, w.WriteByte('1') - case f == 0: - return 1, w.WriteByte('0') - case f == -1: - return w.WriteString("-1") - case math.IsNaN(f): - return w.WriteString("NaN") - case math.IsInf(f, +1): - return w.WriteString("+Inf") - case math.IsInf(f, -1): - return w.WriteString("-Inf") - default: - bp := numBufPool.Get().(*[]byte) - *bp = strconv.AppendFloat((*bp)[:0], f, 'g', -1, 64) - written, err := w.Write(*bp) - numBufPool.Put(bp) - return written, err - } -} - -// writeInt is equivalent to fmt.Fprint with an int64 argument but uses -// strconv.AppendInt with a byte slice taken from a sync.Pool to avoid -// allocations. -func writeInt(w enhancedWriter, i int64) (int, error) { - bp := numBufPool.Get().(*[]byte) - *bp = strconv.AppendInt((*bp)[:0], i, 10) - written, err := w.Write(*bp) - numBufPool.Put(bp) - return written, err -} diff --git a/vendor/github.com/prometheus/procfs/.gitignore b/vendor/github.com/prometheus/procfs/.gitignore deleted file mode 100644 index 25e3659ab..000000000 --- a/vendor/github.com/prometheus/procfs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/fixtures/ diff --git a/vendor/github.com/prometheus/procfs/LICENSE b/vendor/github.com/prometheus/procfs/LICENSE deleted file mode 100644 index 261eeb9e9..000000000 --- a/vendor/github.com/prometheus/procfs/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/prometheus/procfs/MAINTAINERS.md b/vendor/github.com/prometheus/procfs/MAINTAINERS.md deleted file mode 100644 index 35993c41c..000000000 --- a/vendor/github.com/prometheus/procfs/MAINTAINERS.md +++ /dev/null @@ -1 +0,0 @@ -* Tobias Schmidt diff --git a/vendor/github.com/prometheus/procfs/Makefile b/vendor/github.com/prometheus/procfs/Makefile deleted file mode 100644 index 947d7d8fa..000000000 --- a/vendor/github.com/prometheus/procfs/Makefile +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2018 The Prometheus Authors -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -include Makefile.common - -%/.unpacked: %.ttar - ./ttar -C $(dir $*) -x -f $*.ttar - touch $@ - -update_fixtures: fixtures.ttar sysfs/fixtures.ttar - -%fixtures.ttar: %/fixtures - rm -v $(dir $*)fixtures/.unpacked - ./ttar -C $(dir $*) -c -f $*fixtures.ttar fixtures/ - -.PHONY: build -build: - -.PHONY: test -test: fixtures/.unpacked sysfs/fixtures/.unpacked common-test diff --git a/vendor/github.com/prometheus/procfs/Makefile.common b/vendor/github.com/prometheus/procfs/Makefile.common deleted file mode 100644 index 741579e60..000000000 --- a/vendor/github.com/prometheus/procfs/Makefile.common +++ /dev/null @@ -1,223 +0,0 @@ -# Copyright 2018 The Prometheus Authors -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# A common Makefile that includes rules to be reused in different prometheus projects. -# !!! Open PRs only against the prometheus/prometheus/Makefile.common repository! - -# Example usage : -# Create the main Makefile in the root project directory. -# include Makefile.common -# customTarget: -# @echo ">> Running customTarget" -# - -# Ensure GOBIN is not set during build so that promu is installed to the correct path -unexport GOBIN - -GO ?= go -GOFMT ?= $(GO)fmt -FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) -GOOPTS ?= - -GO_VERSION ?= $(shell $(GO) version) -GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION)) -PRE_GO_111 ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.') - -unexport GOVENDOR -ifeq (, $(PRE_GO_111)) - ifneq (,$(wildcard go.mod)) - # Enforce Go modules support just in case the directory is inside GOPATH (and for Travis CI). - GO111MODULE := on - - ifneq (,$(wildcard vendor)) - # Always use the local vendor/ directory to satisfy the dependencies. - GOOPTS := $(GOOPTS) -mod=vendor - endif - endif -else - ifneq (,$(wildcard go.mod)) - ifneq (,$(wildcard vendor)) -$(warning This repository requires Go >= 1.11 because of Go modules) -$(warning Some recipes may not work as expected as the current Go runtime is '$(GO_VERSION_NUMBER)') - endif - else - # This repository isn't using Go modules (yet). - GOVENDOR := $(FIRST_GOPATH)/bin/govendor - endif - - unexport GO111MODULE -endif -PROMU := $(FIRST_GOPATH)/bin/promu -STATICCHECK := $(FIRST_GOPATH)/bin/staticcheck -pkgs = ./... - -GO_VERSION ?= $(shell $(GO) version) -GO_BUILD_PLATFORM ?= $(subst /,-,$(lastword $(GO_VERSION))) - -PROMU_VERSION ?= 0.2.0 -PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz - -PREFIX ?= $(shell pwd) -BIN_DIR ?= $(shell pwd) -DOCKER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD)) -DOCKER_REPO ?= prom - -.PHONY: all -all: precheck style staticcheck unused build test - -# This rule is used to forward a target like "build" to "common-build". This -# allows a new "build" target to be defined in a Makefile which includes this -# one and override "common-build" without override warnings. -%: common-% ; - -.PHONY: common-style -common-style: - @echo ">> checking code style" - @fmtRes=$$($(GOFMT) -d $$(find . -path ./vendor -prune -o -name '*.go' -print)); \ - if [ -n "$${fmtRes}" ]; then \ - echo "gofmt checking failed!"; echo "$${fmtRes}"; echo; \ - echo "Please ensure you are using $$($(GO) version) for formatting code."; \ - exit 1; \ - fi - -.PHONY: common-check_license -common-check_license: - @echo ">> checking license header" - @licRes=$$(for file in $$(find . -type f -iname '*.go' ! -path './vendor/*') ; do \ - awk 'NR<=3' $$file | grep -Eq "(Copyright|generated|GENERATED)" || echo $$file; \ - done); \ - if [ -n "$${licRes}" ]; then \ - echo "license header checking failed:"; echo "$${licRes}"; \ - exit 1; \ - fi - -.PHONY: common-test-short -common-test-short: - @echo ">> running short tests" - GO111MODULE=$(GO111MODULE) $(GO) test -short $(GOOPTS) $(pkgs) - -.PHONY: common-test -common-test: - @echo ">> running all tests" - GO111MODULE=$(GO111MODULE) $(GO) test -race $(GOOPTS) $(pkgs) - -.PHONY: common-format -common-format: - @echo ">> formatting code" - GO111MODULE=$(GO111MODULE) $(GO) fmt $(GOOPTS) $(pkgs) - -.PHONY: common-vet -common-vet: - @echo ">> vetting code" - GO111MODULE=$(GO111MODULE) $(GO) vet $(GOOPTS) $(pkgs) - -.PHONY: common-staticcheck -common-staticcheck: $(STATICCHECK) - @echo ">> running staticcheck" -ifdef GO111MODULE - GO111MODULE=$(GO111MODULE) $(STATICCHECK) -ignore "$(STATICCHECK_IGNORE)" -checks "SA*" $(pkgs) -else - $(STATICCHECK) -ignore "$(STATICCHECK_IGNORE)" $(pkgs) -endif - -.PHONY: common-unused -common-unused: $(GOVENDOR) -ifdef GOVENDOR - @echo ">> running check for unused packages" - @$(GOVENDOR) list +unused | grep . && exit 1 || echo 'No unused packages' -else -ifdef GO111MODULE - @echo ">> running check for unused/missing packages in go.mod" - GO111MODULE=$(GO111MODULE) $(GO) mod tidy - @git diff --exit-code -- go.sum go.mod -ifneq (,$(wildcard vendor)) - @echo ">> running check for unused packages in vendor/" - GO111MODULE=$(GO111MODULE) $(GO) mod vendor - @git diff --exit-code -- go.sum go.mod vendor/ -endif -endif -endif - -.PHONY: common-build -common-build: promu - @echo ">> building binaries" - GO111MODULE=$(GO111MODULE) $(PROMU) build --prefix $(PREFIX) - -.PHONY: common-tarball -common-tarball: promu - @echo ">> building release tarball" - $(PROMU) tarball --prefix $(PREFIX) $(BIN_DIR) - -.PHONY: common-docker -common-docker: - docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" . - -.PHONY: common-docker-publish -common-docker-publish: - docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)" - -.PHONY: common-docker-tag-latest -common-docker-tag-latest: - docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):latest" - -.PHONY: promu -promu: $(PROMU) - -$(PROMU): - curl -s -L $(PROMU_URL) | tar -xvz -C /tmp - mkdir -v -p $(FIRST_GOPATH)/bin - cp -v /tmp/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(PROMU) - -.PHONY: proto -proto: - @echo ">> generating code from proto files" - @./scripts/genproto.sh - -.PHONY: $(STATICCHECK) -$(STATICCHECK): -ifdef GO111MODULE -# Get staticcheck from a temporary directory to avoid modifying the local go.{mod,sum}. -# See https://github.com/golang/go/issues/27643. -# For now, we are using the next branch of staticcheck because master isn't compatible yet with Go modules. - tmpModule=$$(mktemp -d 2>&1) && \ - mkdir -p $${tmpModule}/staticcheck && \ - cd "$${tmpModule}"/staticcheck && \ - GO111MODULE=on $(GO) mod init example.com/staticcheck && \ - GO111MODULE=on GOOS= GOARCH= $(GO) get -u honnef.co/go/tools/cmd/staticcheck@next && \ - rm -rf $${tmpModule}; -else - GOOS= GOARCH= GO111MODULE=off $(GO) get -u honnef.co/go/tools/cmd/staticcheck -endif - -ifdef GOVENDOR -.PHONY: $(GOVENDOR) -$(GOVENDOR): - GOOS= GOARCH= $(GO) get -u github.com/kardianos/govendor -endif - -.PHONY: precheck -precheck:: - -define PRECHECK_COMMAND_template = -precheck:: $(1)_precheck - - -PRECHECK_COMMAND_$(1) ?= $(1) $$(strip $$(PRECHECK_OPTIONS_$(1))) -.PHONY: $(1)_precheck -$(1)_precheck: - @if ! $$(PRECHECK_COMMAND_$(1)) 1>/dev/null 2>&1; then \ - echo "Execution of '$$(PRECHECK_COMMAND_$(1))' command failed. Is $(1) installed?"; \ - exit 1; \ - fi -endef diff --git a/vendor/github.com/prometheus/procfs/buddyinfo.go b/vendor/github.com/prometheus/procfs/buddyinfo.go deleted file mode 100644 index d3a826807..000000000 --- a/vendor/github.com/prometheus/procfs/buddyinfo.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "bufio" - "fmt" - "io" - "os" - "strconv" - "strings" -) - -// A BuddyInfo is the details parsed from /proc/buddyinfo. -// The data is comprised of an array of free fragments of each size. -// The sizes are 2^n*PAGE_SIZE, where n is the array index. -type BuddyInfo struct { - Node string - Zone string - Sizes []float64 -} - -// NewBuddyInfo reads the buddyinfo statistics. -func NewBuddyInfo() ([]BuddyInfo, error) { - fs, err := NewFS(DefaultMountPoint) - if err != nil { - return nil, err - } - - return fs.NewBuddyInfo() -} - -// NewBuddyInfo reads the buddyinfo statistics from the specified `proc` filesystem. -func (fs FS) NewBuddyInfo() ([]BuddyInfo, error) { - file, err := os.Open(fs.Path("buddyinfo")) - if err != nil { - return nil, err - } - defer file.Close() - - return parseBuddyInfo(file) -} - -func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { - var ( - buddyInfo = []BuddyInfo{} - scanner = bufio.NewScanner(r) - bucketCount = -1 - ) - - for scanner.Scan() { - var err error - line := scanner.Text() - parts := strings.Fields(line) - - if len(parts) < 4 { - return nil, fmt.Errorf("invalid number of fields when parsing buddyinfo") - } - - node := strings.TrimRight(parts[1], ",") - zone := strings.TrimRight(parts[3], ",") - arraySize := len(parts[4:]) - - if bucketCount == -1 { - bucketCount = arraySize - } else { - if bucketCount != arraySize { - return nil, fmt.Errorf("mismatch in number of buddyinfo buckets, previous count %d, new count %d", bucketCount, arraySize) - } - } - - sizes := make([]float64, arraySize) - for i := 0; i < arraySize; i++ { - sizes[i], err = strconv.ParseFloat(parts[i+4], 64) - if err != nil { - return nil, fmt.Errorf("invalid value in buddyinfo: %s", err) - } - } - - buddyInfo = append(buddyInfo, BuddyInfo{node, zone, sizes}) - } - - return buddyInfo, scanner.Err() -} diff --git a/vendor/github.com/prometheus/procfs/fixtures.ttar b/vendor/github.com/prometheus/procfs/fixtures.ttar deleted file mode 100644 index 13c831ef5..000000000 --- a/vendor/github.com/prometheus/procfs/fixtures.ttar +++ /dev/null @@ -1,462 +0,0 @@ -# Archive created by ttar -c -f fixtures.ttar fixtures/ -Directory: fixtures -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26231 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/cmdline -Lines: 1 -vimNULLBYTEtest.goNULLBYTE+10NULLBYTEEOF -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/comm -Lines: 1 -vim -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/cwd -SymlinkTo: /usr/bin -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/exe -SymlinkTo: /usr/bin/vim -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26231/fd -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/fd/0 -SymlinkTo: ../../symlinktargets/abc -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/fd/1 -SymlinkTo: ../../symlinktargets/def -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/fd/10 -SymlinkTo: ../../symlinktargets/xyz -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/fd/2 -SymlinkTo: ../../symlinktargets/ghi -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/fd/3 -SymlinkTo: ../../symlinktargets/uvw -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/io -Lines: 7 -rchar: 750339 -wchar: 818609 -syscr: 7405 -syscw: 5245 -read_bytes: 1024 -write_bytes: 2048 -cancelled_write_bytes: -1024 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/limits -Lines: 17 -Limit Soft Limit Hard Limit Units -Max cpu time unlimited unlimited seconds -Max file size unlimited unlimited bytes -Max data size unlimited unlimited bytes -Max stack size 8388608 unlimited bytes -Max core file size 0 unlimited bytes -Max resident set unlimited unlimited bytes -Max processes 62898 62898 processes -Max open files 2048 4096 files -Max locked memory 65536 65536 bytes -Max address space 8589934592 unlimited bytes -Max file locks unlimited unlimited locks -Max pending signals 62898 62898 signals -Max msgqueue size 819200 819200 bytes -Max nice priority 0 0 -Max realtime priority 0 0 -Max realtime timeout unlimited unlimited us -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/mountstats -Lines: 19 -device rootfs mounted on / with fstype rootfs -device sysfs mounted on /sys with fstype sysfs -device proc mounted on /proc with fstype proc -device /dev/sda1 mounted on / with fstype ext4 -device 192.168.1.1:/srv/test mounted on /mnt/nfs/test with fstype nfs4 statvers=1.1 - opts: rw,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.5,local_lock=none - age: 13968 - caps: caps=0xfff7,wtmult=512,dtsize=32768,bsize=0,namlen=255 - nfsv4: bm0=0xfdffafff,bm1=0xf9be3e,bm2=0x0,acl=0x0,pnfs=not configured - sec: flavor=1,pseudoflavor=1 - events: 52 226 0 0 1 13 398 0 0 331 0 47 0 0 77 0 0 77 0 0 0 0 0 0 0 0 0 - bytes: 1207640230 0 0 0 1210214218 0 295483 0 - RPC iostats version: 1.0 p/v: 100003/4 (nfs) - xprt: tcp 832 0 1 0 11 6428 6428 0 12154 0 24 26 5726 - per-op statistics - NULL: 0 0 0 0 0 0 0 0 - READ: 1298 1298 0 207680 1210292152 6 79386 79407 - WRITE: 0 0 0 0 0 0 0 0 - -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26231/net -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/net/dev -Lines: 4 -Inter-| Receive | Transmit - face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed - lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - eth0: 438 5 0 0 0 0 0 0 648 8 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26231/ns -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/ns/mnt -SymlinkTo: mnt:[4026531840] -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/ns/net -SymlinkTo: net:[4026531993] -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/root -SymlinkTo: / -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26231/stat -Lines: 1 -26231 (vim) R 5392 7446 5392 34835 7446 4218880 32533 309516 26 82 1677 44 158 99 20 0 1 0 82375 56274944 1981 18446744073709551615 4194304 6294284 140736914091744 140736914087944 139965136429984 0 0 12288 1870679807 0 0 0 17 0 0 0 31 0 0 8391624 8481048 16420864 140736914093252 140736914093279 140736914093279 140736914096107 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26232 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/cmdline -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/comm -Lines: 1 -ata_sff -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/cwd -SymlinkTo: /does/not/exist -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26232/fd -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/fd/0 -SymlinkTo: ../../symlinktargets/abc -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/fd/1 -SymlinkTo: ../../symlinktargets/def -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/fd/2 -SymlinkTo: ../../symlinktargets/ghi -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/fd/3 -SymlinkTo: ../../symlinktargets/uvw -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/fd/4 -SymlinkTo: ../../symlinktargets/xyz -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/limits -Lines: 17 -Limit Soft Limit Hard Limit Units -Max cpu time unlimited unlimited seconds -Max file size unlimited unlimited bytes -Max data size unlimited unlimited bytes -Max stack size 8388608 unlimited bytes -Max core file size 0 unlimited bytes -Max resident set unlimited unlimited bytes -Max processes 29436 29436 processes -Max open files 1024 4096 files -Max locked memory 65536 65536 bytes -Max address space unlimited unlimited bytes -Max file locks unlimited unlimited locks -Max pending signals 29436 29436 signals -Max msgqueue size 819200 819200 bytes -Max nice priority 0 0 -Max realtime priority 0 0 -Max realtime timeout unlimited unlimited us -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/root -SymlinkTo: /does/not/exist -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26232/stat -Lines: 1 -33 (ata_sff) S 2 0 0 0 -1 69238880 0 0 0 0 0 0 0 0 0 -20 1 0 5 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 18446744073709551615 0 0 17 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/26233 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/26233/cmdline -Lines: 1 -com.github.uiautomatorNULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTENULLBYTEEOF -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/584 -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/584/stat -Lines: 2 -1020 ((a b ) ( c d) ) R 28378 1020 28378 34842 1020 4218880 286 0 0 0 0 0 0 0 20 0 1 0 10839175 10395648 155 18446744073709551615 4194304 4238788 140736466511168 140736466511168 140609271124624 0 0 0 0 0 0 0 17 5 0 0 0 0 0 6336016 6337300 25579520 140736466515030 140736466515061 140736466515061 140736466518002 0 -#!/bin/cat /proc/self/stat -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/buddyinfo -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/buddyinfo/short -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/buddyinfo/short/buddyinfo -Lines: 3 -Node 0, zone -Node 0, zone -Node 0, zone -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/buddyinfo/sizemismatch -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/buddyinfo/sizemismatch/buddyinfo -Lines: 3 -Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 -Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 0 -Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/buddyinfo/valid -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/buddyinfo/valid/buddyinfo -Lines: 3 -Node 0, zone DMA 1 0 1 0 2 1 1 0 1 1 3 -Node 0, zone DMA32 759 572 791 475 194 45 12 0 0 0 0 -Node 0, zone Normal 4381 1093 185 1530 567 102 4 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/fs -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/fs/xfs -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/fs/xfs/stat -Lines: 23 -extent_alloc 92447 97589 92448 93751 -abt 0 0 0 0 -blk_map 1767055 188820 184891 92447 92448 2140766 0 -bmbt 0 0 0 0 -dir 185039 92447 92444 136422 -trans 706 944304 0 -ig 185045 58807 0 126238 0 33637 22 -log 2883 113448 9 17360 739 -push_ail 945014 0 134260 15483 0 3940 464 159985 0 40 -xstrat 92447 0 -rw 107739 94045 -attr 4 0 0 0 -icluster 8677 7849 135802 -vnodes 92601 0 0 0 92444 92444 92444 0 -buf 2666287 7122 2659202 3599 2 7085 0 10297 7085 -abtb2 184941 1277345 13257 13278 0 0 0 0 0 0 0 0 0 0 2746147 -abtc2 345295 2416764 172637 172658 0 0 0 0 0 0 0 0 0 0 21406023 -bmbt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -ibt2 343004 1358467 0 0 0 0 0 0 0 0 0 0 0 0 0 -fibt2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -qm 0 0 0 0 0 0 0 0 -xpc 399724544 92823103 86219234 -debug 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/mdstat -Lines: 26 -Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] -md3 : active raid6 sda1[8] sdh1[7] sdg1[6] sdf1[5] sde1[11] sdd1[3] sdc1[10] sdb1[9] - 5853468288 blocks super 1.2 level 6, 64k chunk, algorithm 2 [8/8] [UUUUUUUU] - -md127 : active raid1 sdi2[0] sdj2[1] - 312319552 blocks [2/2] [UU] - -md0 : active raid1 sdk[2](S) sdi1[0] sdj1[1] - 248896 blocks [2/2] [UU] - -md4 : inactive raid1 sda3[0] sdb3[1] - 4883648 blocks [2/2] [UU] - -md6 : active raid1 sdb2[2] sda2[0] - 195310144 blocks [2/1] [U_] - [=>...................] recovery = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec - -md8 : active raid1 sdb1[1] sda1[0] - 195310144 blocks [2/2] [UU] - [=>...................] resync = 8.5% (16775552/195310144) finish=17.0min speed=259783K/sec - -md7 : active raid6 sdb1[0] sde1[3] sdd1[2] sdc1[1] - 7813735424 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/3] [U_UU] - bitmap: 0/30 pages [0KB], 65536KB chunk - -unused devices: -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/net -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/dev -Lines: 6 -Inter-| Receive | Transmit - face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed -vethf345468: 648 8 0 0 0 0 0 0 438 5 0 0 0 0 0 0 - lo: 1664039048 1566805 0 0 0 0 0 0 1664039048 1566805 0 0 0 0 0 0 -docker0: 2568 38 0 0 0 0 0 0 438 5 0 0 0 0 0 0 - eth0: 874354587 1036395 0 0 0 0 0 0 563352563 732147 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/ip_vs -Lines: 21 -IP Virtual Server version 1.2.1 (size=4096) -Prot LocalAddress:Port Scheduler Flags - -> RemoteAddress:Port Forward Weight ActiveConn InActConn -TCP C0A80016:0CEA wlc - -> C0A85216:0CEA Tunnel 100 248 2 - -> C0A85318:0CEA Tunnel 100 248 2 - -> C0A85315:0CEA Tunnel 100 248 1 -TCP C0A80039:0CEA wlc - -> C0A85416:0CEA Tunnel 0 0 0 - -> C0A85215:0CEA Tunnel 100 1499 0 - -> C0A83215:0CEA Tunnel 100 1498 0 -TCP C0A80037:0CEA wlc - -> C0A8321A:0CEA Tunnel 0 0 0 - -> C0A83120:0CEA Tunnel 100 0 0 -TCP [2620:0000:0000:0000:0000:0000:0000:0001]:0050 sh - -> [2620:0000:0000:0000:0000:0000:0000:0002]:0050 Route 1 0 0 - -> [2620:0000:0000:0000:0000:0000:0000:0003]:0050 Route 1 0 0 - -> [2620:0000:0000:0000:0000:0000:0000:0004]:0050 Route 1 1 1 -FWM 10001000 wlc - -> C0A8321A:0CEA Route 0 0 1 - -> C0A83215:0CEA Route 0 0 2 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/ip_vs_stats -Lines: 6 - Total Incoming Outgoing Incoming Outgoing - Conns Packets Packets Bytes Bytes - 16AA370 E33656E5 0 51D8C8883AB3 0 - - Conns/s Pkts/s Pkts/s Bytes/s Bytes/s - 4 1FB3C 0 1282A8F 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/net/rpc -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/rpc/nfs -Lines: 5 -net 18628 0 18628 6 -rpc 4329785 0 4338291 -proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 -proc3 22 1 4084749 29200 94754 32580 186 47747 7981 8639 0 6356 0 6962 0 7958 0 0 241 4 4 2 39 -proc4 61 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/rpc/nfsd -Lines: 11 -rc 0 6 18622 -fh 0 0 0 0 0 -io 157286400 0 -th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -ra 32 0 0 0 0 0 0 0 0 0 0 0 -net 18628 0 18628 6 -rpc 18628 0 0 0 0 -proc2 18 2 69 0 0 4410 0 0 0 0 0 0 0 0 0 0 0 99 2 -proc3 22 2 112 0 2719 111 0 0 0 0 0 0 0 0 0 0 0 27 216 0 2 1 0 -proc4 2 2 10853 -proc4ops 72 0 0 0 1098 2 0 0 0 0 8179 5896 0 0 0 0 5900 0 0 2 0 2 0 9609 0 2 150 1272 0 0 0 1236 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/net/xfrm_stat -Lines: 28 -XfrmInError 1 -XfrmInBufferError 2 -XfrmInHdrError 4 -XfrmInNoStates 3 -XfrmInStateProtoError 40 -XfrmInStateModeError 100 -XfrmInStateSeqError 6000 -XfrmInStateExpired 4 -XfrmInStateMismatch 23451 -XfrmInStateInvalid 55555 -XfrmInTmplMismatch 51 -XfrmInNoPols 65432 -XfrmInPolBlock 100 -XfrmInPolError 10000 -XfrmOutError 1000000 -XfrmOutBundleGenError 43321 -XfrmOutBundleCheckError 555 -XfrmOutNoStates 869 -XfrmOutStateProtoError 4542 -XfrmOutStateModeError 4 -XfrmOutStateSeqError 543 -XfrmOutStateExpired 565 -XfrmOutPolBlock 43456 -XfrmOutPolDead 7656 -XfrmOutPolError 1454 -XfrmFwdHdrError 6654 -XfrmOutStateInvalid 28765 -XfrmAcquireError 24532 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/self -SymlinkTo: 26231 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/stat -Lines: 16 -cpu 301854 612 111922 8979004 3552 2 3944 0 0 0 -cpu0 44490 19 21045 1087069 220 1 3410 0 0 0 -cpu1 47869 23 16474 1110787 591 0 46 0 0 0 -cpu2 46504 36 15916 1112321 441 0 326 0 0 0 -cpu3 47054 102 15683 1113230 533 0 60 0 0 0 -cpu4 28413 25 10776 1140321 217 0 8 0 0 0 -cpu5 29271 101 11586 1136270 672 0 30 0 0 0 -cpu6 29152 36 10276 1139721 319 0 29 0 0 0 -cpu7 29098 268 10164 1139282 555 0 31 0 0 0 -intr 8885917 17 0 0 0 0 0 0 0 1 79281 0 0 0 0 0 0 0 231237 0 0 0 0 250586 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 223424 190745 13 906 1283803 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -ctxt 38014093 -btime 1418183276 -processes 26442 -procs_running 2 -procs_blocked 1 -softirq 5057579 250191 1481983 1647 211099 186066 0 1783454 622196 12499 508444 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Directory: fixtures/symlinktargets -Mode: 755 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/README -Lines: 2 -This directory contains some empty files that are the symlinks the files in the "fd" directory point to. -They are otherwise ignored by the tests -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/abc -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/def -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/ghi -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/uvw -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/symlinktargets/xyz -Lines: 0 -Mode: 644 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Path: fixtures/.unpacked -Lines: 0 -Mode: 664 -# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/github.com/prometheus/procfs/fs.go b/vendor/github.com/prometheus/procfs/fs.go deleted file mode 100644 index b6c6b2ce1..000000000 --- a/vendor/github.com/prometheus/procfs/fs.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "fmt" - "os" - "path" - - "github.com/prometheus/procfs/nfs" - "github.com/prometheus/procfs/xfs" -) - -// FS represents the pseudo-filesystem proc, which provides an interface to -// kernel data structures. -type FS string - -// DefaultMountPoint is the common mount point of the proc filesystem. -const DefaultMountPoint = "/proc" - -// NewFS returns a new FS mounted under the given mountPoint. It will error -// if the mount point can't be read. -func NewFS(mountPoint string) (FS, error) { - info, err := os.Stat(mountPoint) - if err != nil { - return "", fmt.Errorf("could not read %s: %s", mountPoint, err) - } - if !info.IsDir() { - return "", fmt.Errorf("mount point %s is not a directory", mountPoint) - } - - return FS(mountPoint), nil -} - -// Path returns the path of the given subsystem relative to the procfs root. -func (fs FS) Path(p ...string) string { - return path.Join(append([]string{string(fs)}, p...)...) -} - -// XFSStats retrieves XFS filesystem runtime statistics. -func (fs FS) XFSStats() (*xfs.Stats, error) { - f, err := os.Open(fs.Path("fs/xfs/stat")) - if err != nil { - return nil, err - } - defer f.Close() - - return xfs.ParseStats(f) -} - -// NFSClientRPCStats retrieves NFS client RPC statistics. -func (fs FS) NFSClientRPCStats() (*nfs.ClientRPCStats, error) { - f, err := os.Open(fs.Path("net/rpc/nfs")) - if err != nil { - return nil, err - } - defer f.Close() - - return nfs.ParseClientRPCStats(f) -} - -// NFSdServerRPCStats retrieves NFS daemon RPC statistics. -func (fs FS) NFSdServerRPCStats() (*nfs.ServerRPCStats, error) { - f, err := os.Open(fs.Path("net/rpc/nfsd")) - if err != nil { - return nil, err - } - defer f.Close() - - return nfs.ParseServerRPCStats(f) -} diff --git a/vendor/github.com/prometheus/procfs/go.mod b/vendor/github.com/prometheus/procfs/go.mod deleted file mode 100644 index e89ee6c90..000000000 --- a/vendor/github.com/prometheus/procfs/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/prometheus/procfs diff --git a/vendor/github.com/prometheus/procfs/internal/util/parse.go b/vendor/github.com/prometheus/procfs/internal/util/parse.go deleted file mode 100644 index 2ff228e9d..000000000 --- a/vendor/github.com/prometheus/procfs/internal/util/parse.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package util - -import ( - "io/ioutil" - "strconv" - "strings" -) - -// ParseUint32s parses a slice of strings into a slice of uint32s. -func ParseUint32s(ss []string) ([]uint32, error) { - us := make([]uint32, 0, len(ss)) - for _, s := range ss { - u, err := strconv.ParseUint(s, 10, 32) - if err != nil { - return nil, err - } - - us = append(us, uint32(u)) - } - - return us, nil -} - -// ParseUint64s parses a slice of strings into a slice of uint64s. -func ParseUint64s(ss []string) ([]uint64, error) { - us := make([]uint64, 0, len(ss)) - for _, s := range ss { - u, err := strconv.ParseUint(s, 10, 64) - if err != nil { - return nil, err - } - - us = append(us, u) - } - - return us, nil -} - -// ReadUintFromFile reads a file and attempts to parse a uint64 from it. -func ReadUintFromFile(path string) (uint64, error) { - data, err := ioutil.ReadFile(path) - if err != nil { - return 0, err - } - return strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64) -} diff --git a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go deleted file mode 100644 index df0d567b7..000000000 --- a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build !windows - -package util - -import ( - "bytes" - "os" - "syscall" -) - -// SysReadFile is a simplified ioutil.ReadFile that invokes syscall.Read directly. -// https://github.com/prometheus/node_exporter/pull/728/files -func SysReadFile(file string) (string, error) { - f, err := os.Open(file) - if err != nil { - return "", err - } - defer f.Close() - - // On some machines, hwmon drivers are broken and return EAGAIN. This causes - // Go's ioutil.ReadFile implementation to poll forever. - // - // Since we either want to read data or bail immediately, do the simplest - // possible read using syscall directly. - b := make([]byte, 128) - n, err := syscall.Read(int(f.Fd()), b) - if err != nil { - return "", err - } - - return string(bytes.TrimSpace(b[:n])), nil -} diff --git a/vendor/github.com/prometheus/procfs/net_dev.go b/vendor/github.com/prometheus/procfs/net_dev.go deleted file mode 100644 index 3f2523371..000000000 --- a/vendor/github.com/prometheus/procfs/net_dev.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "bufio" - "errors" - "os" - "sort" - "strconv" - "strings" -) - -// NetDevLine is single line parsed from /proc/net/dev or /proc/[pid]/net/dev. -type NetDevLine struct { - Name string `json:"name"` // The name of the interface. - RxBytes uint64 `json:"rx_bytes"` // Cumulative count of bytes received. - RxPackets uint64 `json:"rx_packets"` // Cumulative count of packets received. - RxErrors uint64 `json:"rx_errors"` // Cumulative count of receive errors encountered. - RxDropped uint64 `json:"rx_dropped"` // Cumulative count of packets dropped while receiving. - RxFIFO uint64 `json:"rx_fifo"` // Cumulative count of FIFO buffer errors. - RxFrame uint64 `json:"rx_frame"` // Cumulative count of packet framing errors. - RxCompressed uint64 `json:"rx_compressed"` // Cumulative count of compressed packets received by the device driver. - RxMulticast uint64 `json:"rx_multicast"` // Cumulative count of multicast frames received by the device driver. - TxBytes uint64 `json:"tx_bytes"` // Cumulative count of bytes transmitted. - TxPackets uint64 `json:"tx_packets"` // Cumulative count of packets transmitted. - TxErrors uint64 `json:"tx_errors"` // Cumulative count of transmit errors encountered. - TxDropped uint64 `json:"tx_dropped"` // Cumulative count of packets dropped while transmitting. - TxFIFO uint64 `json:"tx_fifo"` // Cumulative count of FIFO buffer errors. - TxCollisions uint64 `json:"tx_collisions"` // Cumulative count of collisions detected on the interface. - TxCarrier uint64 `json:"tx_carrier"` // Cumulative count of carrier losses detected by the device driver. - TxCompressed uint64 `json:"tx_compressed"` // Cumulative count of compressed packets transmitted by the device driver. -} - -// NetDev is parsed from /proc/net/dev or /proc/[pid]/net/dev. The map keys -// are interface names. -type NetDev map[string]NetDevLine - -// NewNetDev returns kernel/system statistics read from /proc/net/dev. -func NewNetDev() (NetDev, error) { - fs, err := NewFS(DefaultMountPoint) - if err != nil { - return nil, err - } - - return fs.NewNetDev() -} - -// NewNetDev returns kernel/system statistics read from /proc/net/dev. -func (fs FS) NewNetDev() (NetDev, error) { - return newNetDev(fs.Path("net/dev")) -} - -// NewNetDev returns kernel/system statistics read from /proc/[pid]/net/dev. -func (p Proc) NewNetDev() (NetDev, error) { - return newNetDev(p.path("net/dev")) -} - -// newNetDev creates a new NetDev from the contents of the given file. -func newNetDev(file string) (NetDev, error) { - f, err := os.Open(file) - if err != nil { - return NetDev{}, err - } - defer f.Close() - - nd := NetDev{} - s := bufio.NewScanner(f) - for n := 0; s.Scan(); n++ { - // Skip the 2 header lines. - if n < 2 { - continue - } - - line, err := nd.parseLine(s.Text()) - if err != nil { - return nd, err - } - - nd[line.Name] = *line - } - - return nd, s.Err() -} - -// parseLine parses a single line from the /proc/net/dev file. Header lines -// must be filtered prior to calling this method. -func (nd NetDev) parseLine(rawLine string) (*NetDevLine, error) { - parts := strings.SplitN(rawLine, ":", 2) - if len(parts) != 2 { - return nil, errors.New("invalid net/dev line, missing colon") - } - fields := strings.Fields(strings.TrimSpace(parts[1])) - - var err error - line := &NetDevLine{} - - // Interface Name - line.Name = strings.TrimSpace(parts[0]) - if line.Name == "" { - return nil, errors.New("invalid net/dev line, empty interface name") - } - - // RX - line.RxBytes, err = strconv.ParseUint(fields[0], 10, 64) - if err != nil { - return nil, err - } - line.RxPackets, err = strconv.ParseUint(fields[1], 10, 64) - if err != nil { - return nil, err - } - line.RxErrors, err = strconv.ParseUint(fields[2], 10, 64) - if err != nil { - return nil, err - } - line.RxDropped, err = strconv.ParseUint(fields[3], 10, 64) - if err != nil { - return nil, err - } - line.RxFIFO, err = strconv.ParseUint(fields[4], 10, 64) - if err != nil { - return nil, err - } - line.RxFrame, err = strconv.ParseUint(fields[5], 10, 64) - if err != nil { - return nil, err - } - line.RxCompressed, err = strconv.ParseUint(fields[6], 10, 64) - if err != nil { - return nil, err - } - line.RxMulticast, err = strconv.ParseUint(fields[7], 10, 64) - if err != nil { - return nil, err - } - - // TX - line.TxBytes, err = strconv.ParseUint(fields[8], 10, 64) - if err != nil { - return nil, err - } - line.TxPackets, err = strconv.ParseUint(fields[9], 10, 64) - if err != nil { - return nil, err - } - line.TxErrors, err = strconv.ParseUint(fields[10], 10, 64) - if err != nil { - return nil, err - } - line.TxDropped, err = strconv.ParseUint(fields[11], 10, 64) - if err != nil { - return nil, err - } - line.TxFIFO, err = strconv.ParseUint(fields[12], 10, 64) - if err != nil { - return nil, err - } - line.TxCollisions, err = strconv.ParseUint(fields[13], 10, 64) - if err != nil { - return nil, err - } - line.TxCarrier, err = strconv.ParseUint(fields[14], 10, 64) - if err != nil { - return nil, err - } - line.TxCompressed, err = strconv.ParseUint(fields[15], 10, 64) - if err != nil { - return nil, err - } - - return line, nil -} - -// Total aggregates the values across interfaces and returns a new NetDevLine. -// The Name field will be a sorted comma separated list of interface names. -func (nd NetDev) Total() NetDevLine { - total := NetDevLine{} - - names := make([]string, 0, len(nd)) - for _, ifc := range nd { - names = append(names, ifc.Name) - total.RxBytes += ifc.RxBytes - total.RxPackets += ifc.RxPackets - total.RxPackets += ifc.RxPackets - total.RxErrors += ifc.RxErrors - total.RxDropped += ifc.RxDropped - total.RxFIFO += ifc.RxFIFO - total.RxFrame += ifc.RxFrame - total.RxCompressed += ifc.RxCompressed - total.RxMulticast += ifc.RxMulticast - total.TxBytes += ifc.TxBytes - total.TxPackets += ifc.TxPackets - total.TxErrors += ifc.TxErrors - total.TxDropped += ifc.TxDropped - total.TxFIFO += ifc.TxFIFO - total.TxCollisions += ifc.TxCollisions - total.TxCarrier += ifc.TxCarrier - total.TxCompressed += ifc.TxCompressed - } - sort.Strings(names) - total.Name = strings.Join(names, ", ") - - return total -} diff --git a/vendor/github.com/prometheus/procfs/nfs/nfs.go b/vendor/github.com/prometheus/procfs/nfs/nfs.go deleted file mode 100644 index 651bf6819..000000000 --- a/vendor/github.com/prometheus/procfs/nfs/nfs.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package nfs implements parsing of /proc/net/rpc/nfsd. -// Fields are documented in https://www.svennd.be/nfsd-stats-explained-procnetrpcnfsd/ -package nfs - -// ReplyCache models the "rc" line. -type ReplyCache struct { - Hits uint64 - Misses uint64 - NoCache uint64 -} - -// FileHandles models the "fh" line. -type FileHandles struct { - Stale uint64 - TotalLookups uint64 - AnonLookups uint64 - DirNoCache uint64 - NoDirNoCache uint64 -} - -// InputOutput models the "io" line. -type InputOutput struct { - Read uint64 - Write uint64 -} - -// Threads models the "th" line. -type Threads struct { - Threads uint64 - FullCnt uint64 -} - -// ReadAheadCache models the "ra" line. -type ReadAheadCache struct { - CacheSize uint64 - CacheHistogram []uint64 - NotFound uint64 -} - -// Network models the "net" line. -type Network struct { - NetCount uint64 - UDPCount uint64 - TCPCount uint64 - TCPConnect uint64 -} - -// ClientRPC models the nfs "rpc" line. -type ClientRPC struct { - RPCCount uint64 - Retransmissions uint64 - AuthRefreshes uint64 -} - -// ServerRPC models the nfsd "rpc" line. -type ServerRPC struct { - RPCCount uint64 - BadCnt uint64 - BadFmt uint64 - BadAuth uint64 - BadcInt uint64 -} - -// V2Stats models the "proc2" line. -type V2Stats struct { - Null uint64 - GetAttr uint64 - SetAttr uint64 - Root uint64 - Lookup uint64 - ReadLink uint64 - Read uint64 - WrCache uint64 - Write uint64 - Create uint64 - Remove uint64 - Rename uint64 - Link uint64 - SymLink uint64 - MkDir uint64 - RmDir uint64 - ReadDir uint64 - FsStat uint64 -} - -// V3Stats models the "proc3" line. -type V3Stats struct { - Null uint64 - GetAttr uint64 - SetAttr uint64 - Lookup uint64 - Access uint64 - ReadLink uint64 - Read uint64 - Write uint64 - Create uint64 - MkDir uint64 - SymLink uint64 - MkNod uint64 - Remove uint64 - RmDir uint64 - Rename uint64 - Link uint64 - ReadDir uint64 - ReadDirPlus uint64 - FsStat uint64 - FsInfo uint64 - PathConf uint64 - Commit uint64 -} - -// ClientV4Stats models the nfs "proc4" line. -type ClientV4Stats struct { - Null uint64 - Read uint64 - Write uint64 - Commit uint64 - Open uint64 - OpenConfirm uint64 - OpenNoattr uint64 - OpenDowngrade uint64 - Close uint64 - Setattr uint64 - FsInfo uint64 - Renew uint64 - SetClientID uint64 - SetClientIDConfirm uint64 - Lock uint64 - Lockt uint64 - Locku uint64 - Access uint64 - Getattr uint64 - Lookup uint64 - LookupRoot uint64 - Remove uint64 - Rename uint64 - Link uint64 - Symlink uint64 - Create uint64 - Pathconf uint64 - StatFs uint64 - ReadLink uint64 - ReadDir uint64 - ServerCaps uint64 - DelegReturn uint64 - GetACL uint64 - SetACL uint64 - FsLocations uint64 - ReleaseLockowner uint64 - Secinfo uint64 - FsidPresent uint64 - ExchangeID uint64 - CreateSession uint64 - DestroySession uint64 - Sequence uint64 - GetLeaseTime uint64 - ReclaimComplete uint64 - LayoutGet uint64 - GetDeviceInfo uint64 - LayoutCommit uint64 - LayoutReturn uint64 - SecinfoNoName uint64 - TestStateID uint64 - FreeStateID uint64 - GetDeviceList uint64 - BindConnToSession uint64 - DestroyClientID uint64 - Seek uint64 - Allocate uint64 - DeAllocate uint64 - LayoutStats uint64 - Clone uint64 -} - -// ServerV4Stats models the nfsd "proc4" line. -type ServerV4Stats struct { - Null uint64 - Compound uint64 -} - -// V4Ops models the "proc4ops" line: NFSv4 operations -// Variable list, see: -// v4.0 https://tools.ietf.org/html/rfc3010 (38 operations) -// v4.1 https://tools.ietf.org/html/rfc5661 (58 operations) -// v4.2 https://tools.ietf.org/html/draft-ietf-nfsv4-minorversion2-41 (71 operations) -type V4Ops struct { - //Values uint64 // Variable depending on v4.x sub-version. TODO: Will this always at least include the fields in this struct? - Op0Unused uint64 - Op1Unused uint64 - Op2Future uint64 - Access uint64 - Close uint64 - Commit uint64 - Create uint64 - DelegPurge uint64 - DelegReturn uint64 - GetAttr uint64 - GetFH uint64 - Link uint64 - Lock uint64 - Lockt uint64 - Locku uint64 - Lookup uint64 - LookupRoot uint64 - Nverify uint64 - Open uint64 - OpenAttr uint64 - OpenConfirm uint64 - OpenDgrd uint64 - PutFH uint64 - PutPubFH uint64 - PutRootFH uint64 - Read uint64 - ReadDir uint64 - ReadLink uint64 - Remove uint64 - Rename uint64 - Renew uint64 - RestoreFH uint64 - SaveFH uint64 - SecInfo uint64 - SetAttr uint64 - Verify uint64 - Write uint64 - RelLockOwner uint64 -} - -// ClientRPCStats models all stats from /proc/net/rpc/nfs. -type ClientRPCStats struct { - Network Network - ClientRPC ClientRPC - V2Stats V2Stats - V3Stats V3Stats - ClientV4Stats ClientV4Stats -} - -// ServerRPCStats models all stats from /proc/net/rpc/nfsd. -type ServerRPCStats struct { - ReplyCache ReplyCache - FileHandles FileHandles - InputOutput InputOutput - Threads Threads - ReadAheadCache ReadAheadCache - Network Network - ServerRPC ServerRPC - V2Stats V2Stats - V3Stats V3Stats - ServerV4Stats ServerV4Stats - V4Ops V4Ops -} diff --git a/vendor/github.com/prometheus/procfs/nfs/parse.go b/vendor/github.com/prometheus/procfs/nfs/parse.go deleted file mode 100644 index 95a83cc5b..000000000 --- a/vendor/github.com/prometheus/procfs/nfs/parse.go +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package nfs - -import ( - "fmt" -) - -func parseReplyCache(v []uint64) (ReplyCache, error) { - if len(v) != 3 { - return ReplyCache{}, fmt.Errorf("invalid ReplyCache line %q", v) - } - - return ReplyCache{ - Hits: v[0], - Misses: v[1], - NoCache: v[2], - }, nil -} - -func parseFileHandles(v []uint64) (FileHandles, error) { - if len(v) != 5 { - return FileHandles{}, fmt.Errorf("invalid FileHandles, line %q", v) - } - - return FileHandles{ - Stale: v[0], - TotalLookups: v[1], - AnonLookups: v[2], - DirNoCache: v[3], - NoDirNoCache: v[4], - }, nil -} - -func parseInputOutput(v []uint64) (InputOutput, error) { - if len(v) != 2 { - return InputOutput{}, fmt.Errorf("invalid InputOutput line %q", v) - } - - return InputOutput{ - Read: v[0], - Write: v[1], - }, nil -} - -func parseThreads(v []uint64) (Threads, error) { - if len(v) != 2 { - return Threads{}, fmt.Errorf("invalid Threads line %q", v) - } - - return Threads{ - Threads: v[0], - FullCnt: v[1], - }, nil -} - -func parseReadAheadCache(v []uint64) (ReadAheadCache, error) { - if len(v) != 12 { - return ReadAheadCache{}, fmt.Errorf("invalid ReadAheadCache line %q", v) - } - - return ReadAheadCache{ - CacheSize: v[0], - CacheHistogram: v[1:11], - NotFound: v[11], - }, nil -} - -func parseNetwork(v []uint64) (Network, error) { - if len(v) != 4 { - return Network{}, fmt.Errorf("invalid Network line %q", v) - } - - return Network{ - NetCount: v[0], - UDPCount: v[1], - TCPCount: v[2], - TCPConnect: v[3], - }, nil -} - -func parseServerRPC(v []uint64) (ServerRPC, error) { - if len(v) != 5 { - return ServerRPC{}, fmt.Errorf("invalid RPC line %q", v) - } - - return ServerRPC{ - RPCCount: v[0], - BadCnt: v[1], - BadFmt: v[2], - BadAuth: v[3], - BadcInt: v[4], - }, nil -} - -func parseClientRPC(v []uint64) (ClientRPC, error) { - if len(v) != 3 { - return ClientRPC{}, fmt.Errorf("invalid RPC line %q", v) - } - - return ClientRPC{ - RPCCount: v[0], - Retransmissions: v[1], - AuthRefreshes: v[2], - }, nil -} - -func parseV2Stats(v []uint64) (V2Stats, error) { - values := int(v[0]) - if len(v[1:]) != values || values != 18 { - return V2Stats{}, fmt.Errorf("invalid V2Stats line %q", v) - } - - return V2Stats{ - Null: v[1], - GetAttr: v[2], - SetAttr: v[3], - Root: v[4], - Lookup: v[5], - ReadLink: v[6], - Read: v[7], - WrCache: v[8], - Write: v[9], - Create: v[10], - Remove: v[11], - Rename: v[12], - Link: v[13], - SymLink: v[14], - MkDir: v[15], - RmDir: v[16], - ReadDir: v[17], - FsStat: v[18], - }, nil -} - -func parseV3Stats(v []uint64) (V3Stats, error) { - values := int(v[0]) - if len(v[1:]) != values || values != 22 { - return V3Stats{}, fmt.Errorf("invalid V3Stats line %q", v) - } - - return V3Stats{ - Null: v[1], - GetAttr: v[2], - SetAttr: v[3], - Lookup: v[4], - Access: v[5], - ReadLink: v[6], - Read: v[7], - Write: v[8], - Create: v[9], - MkDir: v[10], - SymLink: v[11], - MkNod: v[12], - Remove: v[13], - RmDir: v[14], - Rename: v[15], - Link: v[16], - ReadDir: v[17], - ReadDirPlus: v[18], - FsStat: v[19], - FsInfo: v[20], - PathConf: v[21], - Commit: v[22], - }, nil -} - -func parseClientV4Stats(v []uint64) (ClientV4Stats, error) { - values := int(v[0]) - if len(v[1:]) != values { - return ClientV4Stats{}, fmt.Errorf("invalid ClientV4Stats line %q", v) - } - - // This function currently supports mapping 59 NFS v4 client stats. Older - // kernels may emit fewer stats, so we must detect this and pad out the - // values to match the expected slice size. - if values < 59 { - newValues := make([]uint64, 60) - copy(newValues, v) - v = newValues - } - - return ClientV4Stats{ - Null: v[1], - Read: v[2], - Write: v[3], - Commit: v[4], - Open: v[5], - OpenConfirm: v[6], - OpenNoattr: v[7], - OpenDowngrade: v[8], - Close: v[9], - Setattr: v[10], - FsInfo: v[11], - Renew: v[12], - SetClientID: v[13], - SetClientIDConfirm: v[14], - Lock: v[15], - Lockt: v[16], - Locku: v[17], - Access: v[18], - Getattr: v[19], - Lookup: v[20], - LookupRoot: v[21], - Remove: v[22], - Rename: v[23], - Link: v[24], - Symlink: v[25], - Create: v[26], - Pathconf: v[27], - StatFs: v[28], - ReadLink: v[29], - ReadDir: v[30], - ServerCaps: v[31], - DelegReturn: v[32], - GetACL: v[33], - SetACL: v[34], - FsLocations: v[35], - ReleaseLockowner: v[36], - Secinfo: v[37], - FsidPresent: v[38], - ExchangeID: v[39], - CreateSession: v[40], - DestroySession: v[41], - Sequence: v[42], - GetLeaseTime: v[43], - ReclaimComplete: v[44], - LayoutGet: v[45], - GetDeviceInfo: v[46], - LayoutCommit: v[47], - LayoutReturn: v[48], - SecinfoNoName: v[49], - TestStateID: v[50], - FreeStateID: v[51], - GetDeviceList: v[52], - BindConnToSession: v[53], - DestroyClientID: v[54], - Seek: v[55], - Allocate: v[56], - DeAllocate: v[57], - LayoutStats: v[58], - Clone: v[59], - }, nil -} - -func parseServerV4Stats(v []uint64) (ServerV4Stats, error) { - values := int(v[0]) - if len(v[1:]) != values || values != 2 { - return ServerV4Stats{}, fmt.Errorf("invalid V4Stats line %q", v) - } - - return ServerV4Stats{ - Null: v[1], - Compound: v[2], - }, nil -} - -func parseV4Ops(v []uint64) (V4Ops, error) { - values := int(v[0]) - if len(v[1:]) != values || values < 39 { - return V4Ops{}, fmt.Errorf("invalid V4Ops line %q", v) - } - - stats := V4Ops{ - Op0Unused: v[1], - Op1Unused: v[2], - Op2Future: v[3], - Access: v[4], - Close: v[5], - Commit: v[6], - Create: v[7], - DelegPurge: v[8], - DelegReturn: v[9], - GetAttr: v[10], - GetFH: v[11], - Link: v[12], - Lock: v[13], - Lockt: v[14], - Locku: v[15], - Lookup: v[16], - LookupRoot: v[17], - Nverify: v[18], - Open: v[19], - OpenAttr: v[20], - OpenConfirm: v[21], - OpenDgrd: v[22], - PutFH: v[23], - PutPubFH: v[24], - PutRootFH: v[25], - Read: v[26], - ReadDir: v[27], - ReadLink: v[28], - Remove: v[29], - Rename: v[30], - Renew: v[31], - RestoreFH: v[32], - SaveFH: v[33], - SecInfo: v[34], - SetAttr: v[35], - Verify: v[36], - Write: v[37], - RelLockOwner: v[38], - } - - return stats, nil -} diff --git a/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go b/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go deleted file mode 100644 index c0d3a5ad9..000000000 --- a/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package nfs - -import ( - "bufio" - "fmt" - "io" - "strings" - - "github.com/prometheus/procfs/internal/util" -) - -// ParseClientRPCStats returns stats read from /proc/net/rpc/nfs -func ParseClientRPCStats(r io.Reader) (*ClientRPCStats, error) { - stats := &ClientRPCStats{} - - scanner := bufio.NewScanner(r) - for scanner.Scan() { - line := scanner.Text() - parts := strings.Fields(scanner.Text()) - // require at least - if len(parts) < 2 { - return nil, fmt.Errorf("invalid NFS metric line %q", line) - } - - values, err := util.ParseUint64s(parts[1:]) - if err != nil { - return nil, fmt.Errorf("error parsing NFS metric line: %s", err) - } - - switch metricLine := parts[0]; metricLine { - case "net": - stats.Network, err = parseNetwork(values) - case "rpc": - stats.ClientRPC, err = parseClientRPC(values) - case "proc2": - stats.V2Stats, err = parseV2Stats(values) - case "proc3": - stats.V3Stats, err = parseV3Stats(values) - case "proc4": - stats.ClientV4Stats, err = parseClientV4Stats(values) - default: - return nil, fmt.Errorf("unknown NFS metric line %q", metricLine) - } - if err != nil { - return nil, fmt.Errorf("errors parsing NFS metric line: %s", err) - } - } - - if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("error scanning NFS file: %s", err) - } - - return stats, nil -} diff --git a/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go b/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go deleted file mode 100644 index 57bb4a358..000000000 --- a/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package nfs - -import ( - "bufio" - "fmt" - "io" - "strings" - - "github.com/prometheus/procfs/internal/util" -) - -// ParseServerRPCStats returns stats read from /proc/net/rpc/nfsd -func ParseServerRPCStats(r io.Reader) (*ServerRPCStats, error) { - stats := &ServerRPCStats{} - - scanner := bufio.NewScanner(r) - for scanner.Scan() { - line := scanner.Text() - parts := strings.Fields(scanner.Text()) - // require at least - if len(parts) < 2 { - return nil, fmt.Errorf("invalid NFSd metric line %q", line) - } - label := parts[0] - - var values []uint64 - var err error - if label == "th" { - if len(parts) < 3 { - return nil, fmt.Errorf("invalid NFSd th metric line %q", line) - } - values, err = util.ParseUint64s(parts[1:3]) - } else { - values, err = util.ParseUint64s(parts[1:]) - } - if err != nil { - return nil, fmt.Errorf("error parsing NFSd metric line: %s", err) - } - - switch metricLine := parts[0]; metricLine { - case "rc": - stats.ReplyCache, err = parseReplyCache(values) - case "fh": - stats.FileHandles, err = parseFileHandles(values) - case "io": - stats.InputOutput, err = parseInputOutput(values) - case "th": - stats.Threads, err = parseThreads(values) - case "ra": - stats.ReadAheadCache, err = parseReadAheadCache(values) - case "net": - stats.Network, err = parseNetwork(values) - case "rpc": - stats.ServerRPC, err = parseServerRPC(values) - case "proc2": - stats.V2Stats, err = parseV2Stats(values) - case "proc3": - stats.V3Stats, err = parseV3Stats(values) - case "proc4": - stats.ServerV4Stats, err = parseServerV4Stats(values) - case "proc4ops": - stats.V4Ops, err = parseV4Ops(values) - default: - return nil, fmt.Errorf("unknown NFSd metric line %q", metricLine) - } - if err != nil { - return nil, fmt.Errorf("errors parsing NFSd metric line: %s", err) - } - } - - if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("error scanning NFSd file: %s", err) - } - - return stats, nil -} diff --git a/vendor/github.com/prometheus/procfs/proc_ns.go b/vendor/github.com/prometheus/procfs/proc_ns.go deleted file mode 100644 index d06c26eba..000000000 --- a/vendor/github.com/prometheus/procfs/proc_ns.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "fmt" - "os" - "strconv" - "strings" -) - -// Namespace represents a single namespace of a process. -type Namespace struct { - Type string // Namespace type. - Inode uint32 // Inode number of the namespace. If two processes are in the same namespace their inodes will match. -} - -// Namespaces contains all of the namespaces that the process is contained in. -type Namespaces map[string]Namespace - -// NewNamespaces reads from /proc/[pid/ns/* to get the namespaces of which the -// process is a member. -func (p Proc) NewNamespaces() (Namespaces, error) { - d, err := os.Open(p.path("ns")) - if err != nil { - return nil, err - } - defer d.Close() - - names, err := d.Readdirnames(-1) - if err != nil { - return nil, fmt.Errorf("failed to read contents of ns dir: %v", err) - } - - ns := make(Namespaces, len(names)) - for _, name := range names { - target, err := os.Readlink(p.path("ns", name)) - if err != nil { - return nil, err - } - - fields := strings.SplitN(target, ":", 2) - if len(fields) != 2 { - return nil, fmt.Errorf("failed to parse namespace type and inode from '%v'", target) - } - - typ := fields[0] - inode, err := strconv.ParseUint(strings.Trim(fields[1], "[]"), 10, 32) - if err != nil { - return nil, fmt.Errorf("failed to parse inode from '%v': %v", fields[1], err) - } - - ns[name] = Namespace{typ, uint32(inode)} - } - - return ns, nil -} diff --git a/vendor/github.com/prometheus/procfs/stat.go b/vendor/github.com/prometheus/procfs/stat.go deleted file mode 100644 index 61eb6b0e3..000000000 --- a/vendor/github.com/prometheus/procfs/stat.go +++ /dev/null @@ -1,232 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "bufio" - "fmt" - "io" - "os" - "strconv" - "strings" -) - -// CPUStat shows how much time the cpu spend in various stages. -type CPUStat struct { - User float64 - Nice float64 - System float64 - Idle float64 - Iowait float64 - IRQ float64 - SoftIRQ float64 - Steal float64 - Guest float64 - GuestNice float64 -} - -// SoftIRQStat represent the softirq statistics as exported in the procfs stat file. -// A nice introduction can be found at https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html -// It is possible to get per-cpu stats by reading /proc/softirqs -type SoftIRQStat struct { - Hi uint64 - Timer uint64 - NetTx uint64 - NetRx uint64 - Block uint64 - BlockIoPoll uint64 - Tasklet uint64 - Sched uint64 - Hrtimer uint64 - Rcu uint64 -} - -// Stat represents kernel/system statistics. -type Stat struct { - // Boot time in seconds since the Epoch. - BootTime uint64 - // Summed up cpu statistics. - CPUTotal CPUStat - // Per-CPU statistics. - CPU []CPUStat - // Number of times interrupts were handled, which contains numbered and unnumbered IRQs. - IRQTotal uint64 - // Number of times a numbered IRQ was triggered. - IRQ []uint64 - // Number of times a context switch happened. - ContextSwitches uint64 - // Number of times a process was created. - ProcessCreated uint64 - // Number of processes currently running. - ProcessesRunning uint64 - // Number of processes currently blocked (waiting for IO). - ProcessesBlocked uint64 - // Number of times a softirq was scheduled. - SoftIRQTotal uint64 - // Detailed softirq statistics. - SoftIRQ SoftIRQStat -} - -// NewStat returns kernel/system statistics read from /proc/stat. -func NewStat() (Stat, error) { - fs, err := NewFS(DefaultMountPoint) - if err != nil { - return Stat{}, err - } - - return fs.NewStat() -} - -// Parse a cpu statistics line and returns the CPUStat struct plus the cpu id (or -1 for the overall sum). -func parseCPUStat(line string) (CPUStat, int64, error) { - cpuStat := CPUStat{} - var cpu string - - count, err := fmt.Sscanf(line, "%s %f %f %f %f %f %f %f %f %f %f", - &cpu, - &cpuStat.User, &cpuStat.Nice, &cpuStat.System, &cpuStat.Idle, - &cpuStat.Iowait, &cpuStat.IRQ, &cpuStat.SoftIRQ, &cpuStat.Steal, - &cpuStat.Guest, &cpuStat.GuestNice) - - if err != nil && err != io.EOF { - return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): %s", line, err) - } - if count == 0 { - return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): 0 elements parsed", line) - } - - cpuStat.User /= userHZ - cpuStat.Nice /= userHZ - cpuStat.System /= userHZ - cpuStat.Idle /= userHZ - cpuStat.Iowait /= userHZ - cpuStat.IRQ /= userHZ - cpuStat.SoftIRQ /= userHZ - cpuStat.Steal /= userHZ - cpuStat.Guest /= userHZ - cpuStat.GuestNice /= userHZ - - if cpu == "cpu" { - return cpuStat, -1, nil - } - - cpuID, err := strconv.ParseInt(cpu[3:], 10, 64) - if err != nil { - return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu/cpuid): %s", line, err) - } - - return cpuStat, cpuID, nil -} - -// Parse a softirq line. -func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) { - softIRQStat := SoftIRQStat{} - var total uint64 - var prefix string - - _, err := fmt.Sscanf(line, "%s %d %d %d %d %d %d %d %d %d %d %d", - &prefix, &total, - &softIRQStat.Hi, &softIRQStat.Timer, &softIRQStat.NetTx, &softIRQStat.NetRx, - &softIRQStat.Block, &softIRQStat.BlockIoPoll, - &softIRQStat.Tasklet, &softIRQStat.Sched, - &softIRQStat.Hrtimer, &softIRQStat.Rcu) - - if err != nil { - return SoftIRQStat{}, 0, fmt.Errorf("couldn't parse %s (softirq): %s", line, err) - } - - return softIRQStat, total, nil -} - -// NewStat returns an information about current kernel/system statistics. -func (fs FS) NewStat() (Stat, error) { - // See https://www.kernel.org/doc/Documentation/filesystems/proc.txt - - f, err := os.Open(fs.Path("stat")) - if err != nil { - return Stat{}, err - } - defer f.Close() - - stat := Stat{} - - scanner := bufio.NewScanner(f) - for scanner.Scan() { - line := scanner.Text() - parts := strings.Fields(scanner.Text()) - // require at least - if len(parts) < 2 { - continue - } - switch { - case parts[0] == "btime": - if stat.BootTime, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (btime): %s", parts[1], err) - } - case parts[0] == "intr": - if stat.IRQTotal, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (intr): %s", parts[1], err) - } - numberedIRQs := parts[2:] - stat.IRQ = make([]uint64, len(numberedIRQs)) - for i, count := range numberedIRQs { - if stat.IRQ[i], err = strconv.ParseUint(count, 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (intr%d): %s", count, i, err) - } - } - case parts[0] == "ctxt": - if stat.ContextSwitches, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (ctxt): %s", parts[1], err) - } - case parts[0] == "processes": - if stat.ProcessCreated, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (processes): %s", parts[1], err) - } - case parts[0] == "procs_running": - if stat.ProcessesRunning, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (procs_running): %s", parts[1], err) - } - case parts[0] == "procs_blocked": - if stat.ProcessesBlocked, err = strconv.ParseUint(parts[1], 10, 64); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s (procs_blocked): %s", parts[1], err) - } - case parts[0] == "softirq": - softIRQStats, total, err := parseSoftIRQStat(line) - if err != nil { - return Stat{}, err - } - stat.SoftIRQTotal = total - stat.SoftIRQ = softIRQStats - case strings.HasPrefix(parts[0], "cpu"): - cpuStat, cpuID, err := parseCPUStat(line) - if err != nil { - return Stat{}, err - } - if cpuID == -1 { - stat.CPUTotal = cpuStat - } else { - for int64(len(stat.CPU)) <= cpuID { - stat.CPU = append(stat.CPU, CPUStat{}) - } - stat.CPU[cpuID] = cpuStat - } - } - } - - if err := scanner.Err(); err != nil { - return Stat{}, fmt.Errorf("couldn't parse %s: %s", f.Name(), err) - } - - return stat, nil -} diff --git a/vendor/github.com/prometheus/procfs/ttar b/vendor/github.com/prometheus/procfs/ttar deleted file mode 100644 index b0171a12b..000000000 --- a/vendor/github.com/prometheus/procfs/ttar +++ /dev/null @@ -1,389 +0,0 @@ -#!/usr/bin/env bash - -# Purpose: plain text tar format -# Limitations: - only suitable for text files, directories, and symlinks -# - stores only filename, content, and mode -# - not designed for untrusted input -# -# Note: must work with bash version 3.2 (macOS) - -# Copyright 2017 Roger Luethi -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -o errexit -o nounset - -# Sanitize environment (for instance, standard sorting of glob matches) -export LC_ALL=C - -path="" -CMD="" -ARG_STRING="$*" - -#------------------------------------------------------------------------------ -# Not all sed implementations can work on null bytes. In order to make ttar -# work out of the box on macOS, use Python as a stream editor. - -USE_PYTHON=0 - -PYTHON_CREATE_FILTER=$(cat << 'PCF' -#!/usr/bin/env python - -import re -import sys - -for line in sys.stdin: - line = re.sub(r'EOF', r'\EOF', line) - line = re.sub(r'NULLBYTE', r'\NULLBYTE', line) - line = re.sub('\x00', r'NULLBYTE', line) - sys.stdout.write(line) -PCF -) - -PYTHON_EXTRACT_FILTER=$(cat << 'PEF' -#!/usr/bin/env python - -import re -import sys - -for line in sys.stdin: - line = re.sub(r'(?/dev/null; then - echo "ERROR Python not found. Aborting." - exit 2 - fi - USE_PYTHON=1 - fi -} - -#------------------------------------------------------------------------------ - -function usage { - bname=$(basename "$0") - cat << USAGE -Usage: $bname [-C ] -c -f (create archive) - $bname -t -f (list archive contents) - $bname [-C ] -x -f (extract archive) - -Options: - -C (change directory) - -v (verbose) - -Example: Change to sysfs directory, create ttar file from fixtures directory - $bname -C sysfs -c -f sysfs/fixtures.ttar fixtures/ -USAGE -exit "$1" -} - -function vecho { - if [ "${VERBOSE:-}" == "yes" ]; then - echo >&7 "$@" - fi -} - -function set_cmd { - if [ -n "$CMD" ]; then - echo "ERROR: more than one command given" - echo - usage 2 - fi - CMD=$1 -} - -unset VERBOSE - -while getopts :cf:htxvC: opt; do - case $opt in - c) - set_cmd "create" - ;; - f) - ARCHIVE=$OPTARG - ;; - h) - usage 0 - ;; - t) - set_cmd "list" - ;; - x) - set_cmd "extract" - ;; - v) - VERBOSE=yes - exec 7>&1 - ;; - C) - CDIR=$OPTARG - ;; - *) - echo >&2 "ERROR: invalid option -$OPTARG" - echo - usage 1 - ;; - esac -done - -# Remove processed options from arguments -shift $(( OPTIND - 1 )); - -if [ "${CMD:-}" == "" ]; then - echo >&2 "ERROR: no command given" - echo - usage 1 -elif [ "${ARCHIVE:-}" == "" ]; then - echo >&2 "ERROR: no archive name given" - echo - usage 1 -fi - -function list { - local path="" - local size=0 - local line_no=0 - local ttar_file=$1 - if [ -n "${2:-}" ]; then - echo >&2 "ERROR: too many arguments." - echo - usage 1 - fi - if [ ! -e "$ttar_file" ]; then - echo >&2 "ERROR: file not found ($ttar_file)" - echo - usage 1 - fi - while read -r line; do - line_no=$(( line_no + 1 )) - if [ $size -gt 0 ]; then - size=$(( size - 1 )) - continue - fi - if [[ $line =~ ^Path:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - elif [[ $line =~ ^Lines:\ (.*)$ ]]; then - size=${BASH_REMATCH[1]} - echo "$path" - elif [[ $line =~ ^Directory:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - echo "$path/" - elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then - echo "$path -> ${BASH_REMATCH[1]}" - fi - done < "$ttar_file" -} - -function extract { - local path="" - local size=0 - local line_no=0 - local ttar_file=$1 - if [ -n "${2:-}" ]; then - echo >&2 "ERROR: too many arguments." - echo - usage 1 - fi - if [ ! -e "$ttar_file" ]; then - echo >&2 "ERROR: file not found ($ttar_file)" - echo - usage 1 - fi - while IFS= read -r line; do - line_no=$(( line_no + 1 )) - local eof_without_newline - if [ "$size" -gt 0 ]; then - if [[ "$line" =~ [^\\]EOF ]]; then - # An EOF not preceeded by a backslash indicates that the line - # does not end with a newline - eof_without_newline=1 - else - eof_without_newline=0 - fi - # Replace NULLBYTE with null byte if at beginning of line - # Replace NULLBYTE with null byte unless preceeded by backslash - # Remove one backslash in front of NULLBYTE (if any) - # Remove EOF unless preceeded by backslash - # Remove one backslash in front of EOF - if [ $USE_PYTHON -eq 1 ]; then - echo -n "$line" | python -c "$PYTHON_EXTRACT_FILTER" >> "$path" - else - # The repeated pattern makes up for sed's lack of negative - # lookbehind assertions (for consecutive null bytes). - echo -n "$line" | \ - sed -e 's/^NULLBYTE/\x0/g; - s/\([^\\]\)NULLBYTE/\1\x0/g; - s/\([^\\]\)NULLBYTE/\1\x0/g; - s/\\NULLBYTE/NULLBYTE/g; - s/\([^\\]\)EOF/\1/g; - s/\\EOF/EOF/g; - ' >> "$path" - fi - if [[ "$eof_without_newline" -eq 0 ]]; then - echo >> "$path" - fi - size=$(( size - 1 )) - continue - fi - if [[ $line =~ ^Path:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - if [ -e "$path" ] || [ -L "$path" ]; then - rm "$path" - fi - elif [[ $line =~ ^Lines:\ (.*)$ ]]; then - size=${BASH_REMATCH[1]} - # Create file even if it is zero-length. - touch "$path" - vecho " $path" - elif [[ $line =~ ^Mode:\ (.*)$ ]]; then - mode=${BASH_REMATCH[1]} - chmod "$mode" "$path" - vecho "$mode" - elif [[ $line =~ ^Directory:\ (.*)$ ]]; then - path=${BASH_REMATCH[1]} - mkdir -p "$path" - vecho " $path/" - elif [[ $line =~ ^SymlinkTo:\ (.*)$ ]]; then - ln -s "${BASH_REMATCH[1]}" "$path" - vecho " $path -> ${BASH_REMATCH[1]}" - elif [[ $line =~ ^# ]]; then - # Ignore comments between files - continue - else - echo >&2 "ERROR: Unknown keyword on line $line_no: $line" - exit 1 - fi - done < "$ttar_file" -} - -function div { - echo "# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" \ - "- - - - - -" -} - -function get_mode { - local mfile=$1 - if [ -z "${STAT_OPTION:-}" ]; then - if stat -c '%a' "$mfile" >/dev/null 2>&1; then - # GNU stat - STAT_OPTION='-c' - STAT_FORMAT='%a' - else - # BSD stat - STAT_OPTION='-f' - # Octal output, user/group/other (omit file type, sticky bit) - STAT_FORMAT='%OLp' - fi - fi - stat "${STAT_OPTION}" "${STAT_FORMAT}" "$mfile" -} - -function _create { - shopt -s nullglob - local mode - local eof_without_newline - while (( "$#" )); do - file=$1 - if [ -L "$file" ]; then - echo "Path: $file" - symlinkTo=$(readlink "$file") - echo "SymlinkTo: $symlinkTo" - vecho " $file -> $symlinkTo" - div - elif [ -d "$file" ]; then - # Strip trailing slash (if there is one) - file=${file%/} - echo "Directory: $file" - mode=$(get_mode "$file") - echo "Mode: $mode" - vecho "$mode $file/" - div - # Find all files and dirs, including hidden/dot files - for x in "$file/"{*,.[^.]*}; do - _create "$x" - done - elif [ -f "$file" ]; then - echo "Path: $file" - lines=$(wc -l "$file"|awk '{print $1}') - eof_without_newline=0 - if [[ "$(wc -c "$file"|awk '{print $1}')" -gt 0 ]] && \ - [[ "$(tail -c 1 "$file" | wc -l)" -eq 0 ]]; then - eof_without_newline=1 - lines=$((lines+1)) - fi - echo "Lines: $lines" - # Add backslash in front of EOF - # Add backslash in front of NULLBYTE - # Replace null byte with NULLBYTE - if [ $USE_PYTHON -eq 1 ]; then - < "$file" python -c "$PYTHON_CREATE_FILTER" - else - < "$file" \ - sed 's/EOF/\\EOF/g; - s/NULLBYTE/\\NULLBYTE/g; - s/\x0/NULLBYTE/g; - ' - fi - if [[ "$eof_without_newline" -eq 1 ]]; then - # Finish line with EOF to indicate that the original line did - # not end with a linefeed - echo "EOF" - fi - mode=$(get_mode "$file") - echo "Mode: $mode" - vecho "$mode $file" - div - else - echo >&2 "ERROR: file not found ($file in $(pwd))" - exit 2 - fi - shift - done -} - -function create { - ttar_file=$1 - shift - if [ -z "${1:-}" ]; then - echo >&2 "ERROR: missing arguments." - echo - usage 1 - fi - if [ -e "$ttar_file" ]; then - rm "$ttar_file" - fi - exec > "$ttar_file" - echo "# Archive created by ttar $ARG_STRING" - _create "$@" -} - -test_environment - -if [ -n "${CDIR:-}" ]; then - if [[ "$ARCHIVE" != /* ]]; then - # Relative path: preserve the archive's location before changing - # directory - ARCHIVE="$(pwd)/$ARCHIVE" - fi - cd "$CDIR" -fi - -"$CMD" "$ARCHIVE" "$@" diff --git a/vendor/github.com/prometheus/procfs/xfrm.go b/vendor/github.com/prometheus/procfs/xfrm.go deleted file mode 100644 index 8f1508f0f..000000000 --- a/vendor/github.com/prometheus/procfs/xfrm.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2017 Prometheus Team -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package procfs - -import ( - "bufio" - "fmt" - "os" - "strconv" - "strings" -) - -// XfrmStat models the contents of /proc/net/xfrm_stat. -type XfrmStat struct { - // All errors which are not matched by other - XfrmInError int - // No buffer is left - XfrmInBufferError int - // Header Error - XfrmInHdrError int - // No state found - // i.e. either inbound SPI, address, or IPSEC protocol at SA is wrong - XfrmInNoStates int - // Transformation protocol specific error - // e.g. SA Key is wrong - XfrmInStateProtoError int - // Transformation mode specific error - XfrmInStateModeError int - // Sequence error - // e.g. sequence number is out of window - XfrmInStateSeqError int - // State is expired - XfrmInStateExpired int - // State has mismatch option - // e.g. UDP encapsulation type is mismatched - XfrmInStateMismatch int - // State is invalid - XfrmInStateInvalid int - // No matching template for states - // e.g. Inbound SAs are correct but SP rule is wrong - XfrmInTmplMismatch int - // No policy is found for states - // e.g. Inbound SAs are correct but no SP is found - XfrmInNoPols int - // Policy discards - XfrmInPolBlock int - // Policy error - XfrmInPolError int - // All errors which are not matched by others - XfrmOutError int - // Bundle generation error - XfrmOutBundleGenError int - // Bundle check error - XfrmOutBundleCheckError int - // No state was found - XfrmOutNoStates int - // Transformation protocol specific error - XfrmOutStateProtoError int - // Transportation mode specific error - XfrmOutStateModeError int - // Sequence error - // i.e sequence number overflow - XfrmOutStateSeqError int - // State is expired - XfrmOutStateExpired int - // Policy discads - XfrmOutPolBlock int - // Policy is dead - XfrmOutPolDead int - // Policy Error - XfrmOutPolError int - XfrmFwdHdrError int - XfrmOutStateInvalid int - XfrmAcquireError int -} - -// NewXfrmStat reads the xfrm_stat statistics. -func NewXfrmStat() (XfrmStat, error) { - fs, err := NewFS(DefaultMountPoint) - if err != nil { - return XfrmStat{}, err - } - - return fs.NewXfrmStat() -} - -// NewXfrmStat reads the xfrm_stat statistics from the 'proc' filesystem. -func (fs FS) NewXfrmStat() (XfrmStat, error) { - file, err := os.Open(fs.Path("net/xfrm_stat")) - if err != nil { - return XfrmStat{}, err - } - defer file.Close() - - var ( - x = XfrmStat{} - s = bufio.NewScanner(file) - ) - - for s.Scan() { - fields := strings.Fields(s.Text()) - - if len(fields) != 2 { - return XfrmStat{}, fmt.Errorf( - "couldn't parse %s line %s", file.Name(), s.Text()) - } - - name := fields[0] - value, err := strconv.Atoi(fields[1]) - if err != nil { - return XfrmStat{}, err - } - - switch name { - case "XfrmInError": - x.XfrmInError = value - case "XfrmInBufferError": - x.XfrmInBufferError = value - case "XfrmInHdrError": - x.XfrmInHdrError = value - case "XfrmInNoStates": - x.XfrmInNoStates = value - case "XfrmInStateProtoError": - x.XfrmInStateProtoError = value - case "XfrmInStateModeError": - x.XfrmInStateModeError = value - case "XfrmInStateSeqError": - x.XfrmInStateSeqError = value - case "XfrmInStateExpired": - x.XfrmInStateExpired = value - case "XfrmInStateInvalid": - x.XfrmInStateInvalid = value - case "XfrmInTmplMismatch": - x.XfrmInTmplMismatch = value - case "XfrmInNoPols": - x.XfrmInNoPols = value - case "XfrmInPolBlock": - x.XfrmInPolBlock = value - case "XfrmInPolError": - x.XfrmInPolError = value - case "XfrmOutError": - x.XfrmOutError = value - case "XfrmInStateMismatch": - x.XfrmInStateMismatch = value - case "XfrmOutBundleGenError": - x.XfrmOutBundleGenError = value - case "XfrmOutBundleCheckError": - x.XfrmOutBundleCheckError = value - case "XfrmOutNoStates": - x.XfrmOutNoStates = value - case "XfrmOutStateProtoError": - x.XfrmOutStateProtoError = value - case "XfrmOutStateModeError": - x.XfrmOutStateModeError = value - case "XfrmOutStateSeqError": - x.XfrmOutStateSeqError = value - case "XfrmOutStateExpired": - x.XfrmOutStateExpired = value - case "XfrmOutPolBlock": - x.XfrmOutPolBlock = value - case "XfrmOutPolDead": - x.XfrmOutPolDead = value - case "XfrmOutPolError": - x.XfrmOutPolError = value - case "XfrmFwdHdrError": - x.XfrmFwdHdrError = value - case "XfrmOutStateInvalid": - x.XfrmOutStateInvalid = value - case "XfrmAcquireError": - x.XfrmAcquireError = value - } - - } - - return x, s.Err() -} diff --git a/vendor/github.com/prometheus/procfs/xfs/parse.go b/vendor/github.com/prometheus/procfs/xfs/parse.go deleted file mode 100644 index 2bc0ef342..000000000 --- a/vendor/github.com/prometheus/procfs/xfs/parse.go +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package xfs - -import ( - "bufio" - "fmt" - "io" - "strings" - - "github.com/prometheus/procfs/internal/util" -) - -// ParseStats parses a Stats from an input io.Reader, using the format -// found in /proc/fs/xfs/stat. -func ParseStats(r io.Reader) (*Stats, error) { - const ( - // Fields parsed into stats structures. - fieldExtentAlloc = "extent_alloc" - fieldAbt = "abt" - fieldBlkMap = "blk_map" - fieldBmbt = "bmbt" - fieldDir = "dir" - fieldTrans = "trans" - fieldIg = "ig" - fieldLog = "log" - fieldRw = "rw" - fieldAttr = "attr" - fieldIcluster = "icluster" - fieldVnodes = "vnodes" - fieldBuf = "buf" - fieldXpc = "xpc" - - // Unimplemented at this time due to lack of documentation. - fieldPushAil = "push_ail" - fieldXstrat = "xstrat" - fieldAbtb2 = "abtb2" - fieldAbtc2 = "abtc2" - fieldBmbt2 = "bmbt2" - fieldIbt2 = "ibt2" - fieldFibt2 = "fibt2" - fieldQm = "qm" - fieldDebug = "debug" - ) - - var xfss Stats - - s := bufio.NewScanner(r) - for s.Scan() { - // Expect at least a string label and a single integer value, ex: - // - abt 0 - // - rw 1 2 - ss := strings.Fields(string(s.Bytes())) - if len(ss) < 2 { - continue - } - label := ss[0] - - // Extended precision counters are uint64 values. - if label == fieldXpc { - us, err := util.ParseUint64s(ss[1:]) - if err != nil { - return nil, err - } - - xfss.ExtendedPrecision, err = extendedPrecisionStats(us) - if err != nil { - return nil, err - } - - continue - } - - // All other counters are uint32 values. - us, err := util.ParseUint32s(ss[1:]) - if err != nil { - return nil, err - } - - switch label { - case fieldExtentAlloc: - xfss.ExtentAllocation, err = extentAllocationStats(us) - case fieldAbt: - xfss.AllocationBTree, err = btreeStats(us) - case fieldBlkMap: - xfss.BlockMapping, err = blockMappingStats(us) - case fieldBmbt: - xfss.BlockMapBTree, err = btreeStats(us) - case fieldDir: - xfss.DirectoryOperation, err = directoryOperationStats(us) - case fieldTrans: - xfss.Transaction, err = transactionStats(us) - case fieldIg: - xfss.InodeOperation, err = inodeOperationStats(us) - case fieldLog: - xfss.LogOperation, err = logOperationStats(us) - case fieldRw: - xfss.ReadWrite, err = readWriteStats(us) - case fieldAttr: - xfss.AttributeOperation, err = attributeOperationStats(us) - case fieldIcluster: - xfss.InodeClustering, err = inodeClusteringStats(us) - case fieldVnodes: - xfss.Vnode, err = vnodeStats(us) - case fieldBuf: - xfss.Buffer, err = bufferStats(us) - } - if err != nil { - return nil, err - } - } - - return &xfss, s.Err() -} - -// extentAllocationStats builds an ExtentAllocationStats from a slice of uint32s. -func extentAllocationStats(us []uint32) (ExtentAllocationStats, error) { - if l := len(us); l != 4 { - return ExtentAllocationStats{}, fmt.Errorf("incorrect number of values for XFS extent allocation stats: %d", l) - } - - return ExtentAllocationStats{ - ExtentsAllocated: us[0], - BlocksAllocated: us[1], - ExtentsFreed: us[2], - BlocksFreed: us[3], - }, nil -} - -// btreeStats builds a BTreeStats from a slice of uint32s. -func btreeStats(us []uint32) (BTreeStats, error) { - if l := len(us); l != 4 { - return BTreeStats{}, fmt.Errorf("incorrect number of values for XFS btree stats: %d", l) - } - - return BTreeStats{ - Lookups: us[0], - Compares: us[1], - RecordsInserted: us[2], - RecordsDeleted: us[3], - }, nil -} - -// BlockMappingStat builds a BlockMappingStats from a slice of uint32s. -func blockMappingStats(us []uint32) (BlockMappingStats, error) { - if l := len(us); l != 7 { - return BlockMappingStats{}, fmt.Errorf("incorrect number of values for XFS block mapping stats: %d", l) - } - - return BlockMappingStats{ - Reads: us[0], - Writes: us[1], - Unmaps: us[2], - ExtentListInsertions: us[3], - ExtentListDeletions: us[4], - ExtentListLookups: us[5], - ExtentListCompares: us[6], - }, nil -} - -// DirectoryOperationStats builds a DirectoryOperationStats from a slice of uint32s. -func directoryOperationStats(us []uint32) (DirectoryOperationStats, error) { - if l := len(us); l != 4 { - return DirectoryOperationStats{}, fmt.Errorf("incorrect number of values for XFS directory operation stats: %d", l) - } - - return DirectoryOperationStats{ - Lookups: us[0], - Creates: us[1], - Removes: us[2], - Getdents: us[3], - }, nil -} - -// TransactionStats builds a TransactionStats from a slice of uint32s. -func transactionStats(us []uint32) (TransactionStats, error) { - if l := len(us); l != 3 { - return TransactionStats{}, fmt.Errorf("incorrect number of values for XFS transaction stats: %d", l) - } - - return TransactionStats{ - Sync: us[0], - Async: us[1], - Empty: us[2], - }, nil -} - -// InodeOperationStats builds an InodeOperationStats from a slice of uint32s. -func inodeOperationStats(us []uint32) (InodeOperationStats, error) { - if l := len(us); l != 7 { - return InodeOperationStats{}, fmt.Errorf("incorrect number of values for XFS inode operation stats: %d", l) - } - - return InodeOperationStats{ - Attempts: us[0], - Found: us[1], - Recycle: us[2], - Missed: us[3], - Duplicate: us[4], - Reclaims: us[5], - AttributeChange: us[6], - }, nil -} - -// LogOperationStats builds a LogOperationStats from a slice of uint32s. -func logOperationStats(us []uint32) (LogOperationStats, error) { - if l := len(us); l != 5 { - return LogOperationStats{}, fmt.Errorf("incorrect number of values for XFS log operation stats: %d", l) - } - - return LogOperationStats{ - Writes: us[0], - Blocks: us[1], - NoInternalBuffers: us[2], - Force: us[3], - ForceSleep: us[4], - }, nil -} - -// ReadWriteStats builds a ReadWriteStats from a slice of uint32s. -func readWriteStats(us []uint32) (ReadWriteStats, error) { - if l := len(us); l != 2 { - return ReadWriteStats{}, fmt.Errorf("incorrect number of values for XFS read write stats: %d", l) - } - - return ReadWriteStats{ - Read: us[0], - Write: us[1], - }, nil -} - -// AttributeOperationStats builds an AttributeOperationStats from a slice of uint32s. -func attributeOperationStats(us []uint32) (AttributeOperationStats, error) { - if l := len(us); l != 4 { - return AttributeOperationStats{}, fmt.Errorf("incorrect number of values for XFS attribute operation stats: %d", l) - } - - return AttributeOperationStats{ - Get: us[0], - Set: us[1], - Remove: us[2], - List: us[3], - }, nil -} - -// InodeClusteringStats builds an InodeClusteringStats from a slice of uint32s. -func inodeClusteringStats(us []uint32) (InodeClusteringStats, error) { - if l := len(us); l != 3 { - return InodeClusteringStats{}, fmt.Errorf("incorrect number of values for XFS inode clustering stats: %d", l) - } - - return InodeClusteringStats{ - Iflush: us[0], - Flush: us[1], - FlushInode: us[2], - }, nil -} - -// VnodeStats builds a VnodeStats from a slice of uint32s. -func vnodeStats(us []uint32) (VnodeStats, error) { - // The attribute "Free" appears to not be available on older XFS - // stats versions. Therefore, 7 or 8 elements may appear in - // this slice. - l := len(us) - if l != 7 && l != 8 { - return VnodeStats{}, fmt.Errorf("incorrect number of values for XFS vnode stats: %d", l) - } - - s := VnodeStats{ - Active: us[0], - Allocate: us[1], - Get: us[2], - Hold: us[3], - Release: us[4], - Reclaim: us[5], - Remove: us[6], - } - - // Skip adding free, unless it is present. The zero value will - // be used in place of an actual count. - if l == 7 { - return s, nil - } - - s.Free = us[7] - return s, nil -} - -// BufferStats builds a BufferStats from a slice of uint32s. -func bufferStats(us []uint32) (BufferStats, error) { - if l := len(us); l != 9 { - return BufferStats{}, fmt.Errorf("incorrect number of values for XFS buffer stats: %d", l) - } - - return BufferStats{ - Get: us[0], - Create: us[1], - GetLocked: us[2], - GetLockedWaited: us[3], - BusyLocked: us[4], - MissLocked: us[5], - PageRetries: us[6], - PageFound: us[7], - GetRead: us[8], - }, nil -} - -// ExtendedPrecisionStats builds an ExtendedPrecisionStats from a slice of uint32s. -func extendedPrecisionStats(us []uint64) (ExtendedPrecisionStats, error) { - if l := len(us); l != 3 { - return ExtendedPrecisionStats{}, fmt.Errorf("incorrect number of values for XFS extended precision stats: %d", l) - } - - return ExtendedPrecisionStats{ - FlushBytes: us[0], - WriteBytes: us[1], - ReadBytes: us[2], - }, nil -} diff --git a/vendor/github.com/prometheus/procfs/xfs/xfs.go b/vendor/github.com/prometheus/procfs/xfs/xfs.go deleted file mode 100644 index d86794b7c..000000000 --- a/vendor/github.com/prometheus/procfs/xfs/xfs.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2017 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package xfs provides access to statistics exposed by the XFS filesystem. -package xfs - -// Stats contains XFS filesystem runtime statistics, parsed from -// /proc/fs/xfs/stat. -// -// The names and meanings of each statistic were taken from -// http://xfs.org/index.php/Runtime_Stats and xfs_stats.h in the Linux -// kernel source. Most counters are uint32s (same data types used in -// xfs_stats.h), but some of the "extended precision stats" are uint64s. -type Stats struct { - // The name of the filesystem used to source these statistics. - // If empty, this indicates aggregated statistics for all XFS - // filesystems on the host. - Name string - - ExtentAllocation ExtentAllocationStats - AllocationBTree BTreeStats - BlockMapping BlockMappingStats - BlockMapBTree BTreeStats - DirectoryOperation DirectoryOperationStats - Transaction TransactionStats - InodeOperation InodeOperationStats - LogOperation LogOperationStats - ReadWrite ReadWriteStats - AttributeOperation AttributeOperationStats - InodeClustering InodeClusteringStats - Vnode VnodeStats - Buffer BufferStats - ExtendedPrecision ExtendedPrecisionStats -} - -// ExtentAllocationStats contains statistics regarding XFS extent allocations. -type ExtentAllocationStats struct { - ExtentsAllocated uint32 - BlocksAllocated uint32 - ExtentsFreed uint32 - BlocksFreed uint32 -} - -// BTreeStats contains statistics regarding an XFS internal B-tree. -type BTreeStats struct { - Lookups uint32 - Compares uint32 - RecordsInserted uint32 - RecordsDeleted uint32 -} - -// BlockMappingStats contains statistics regarding XFS block maps. -type BlockMappingStats struct { - Reads uint32 - Writes uint32 - Unmaps uint32 - ExtentListInsertions uint32 - ExtentListDeletions uint32 - ExtentListLookups uint32 - ExtentListCompares uint32 -} - -// DirectoryOperationStats contains statistics regarding XFS directory entries. -type DirectoryOperationStats struct { - Lookups uint32 - Creates uint32 - Removes uint32 - Getdents uint32 -} - -// TransactionStats contains statistics regarding XFS metadata transactions. -type TransactionStats struct { - Sync uint32 - Async uint32 - Empty uint32 -} - -// InodeOperationStats contains statistics regarding XFS inode operations. -type InodeOperationStats struct { - Attempts uint32 - Found uint32 - Recycle uint32 - Missed uint32 - Duplicate uint32 - Reclaims uint32 - AttributeChange uint32 -} - -// LogOperationStats contains statistics regarding the XFS log buffer. -type LogOperationStats struct { - Writes uint32 - Blocks uint32 - NoInternalBuffers uint32 - Force uint32 - ForceSleep uint32 -} - -// ReadWriteStats contains statistics regarding the number of read and write -// system calls for XFS filesystems. -type ReadWriteStats struct { - Read uint32 - Write uint32 -} - -// AttributeOperationStats contains statistics regarding manipulation of -// XFS extended file attributes. -type AttributeOperationStats struct { - Get uint32 - Set uint32 - Remove uint32 - List uint32 -} - -// InodeClusteringStats contains statistics regarding XFS inode clustering -// operations. -type InodeClusteringStats struct { - Iflush uint32 - Flush uint32 - FlushInode uint32 -} - -// VnodeStats contains statistics regarding XFS vnode operations. -type VnodeStats struct { - Active uint32 - Allocate uint32 - Get uint32 - Hold uint32 - Release uint32 - Reclaim uint32 - Remove uint32 - Free uint32 -} - -// BufferStats contains statistics regarding XFS read/write I/O buffers. -type BufferStats struct { - Get uint32 - Create uint32 - GetLocked uint32 - GetLockedWaited uint32 - BusyLocked uint32 - MissLocked uint32 - PageRetries uint32 - PageFound uint32 - GetRead uint32 -} - -// ExtendedPrecisionStats contains high precision counters used to track the -// total number of bytes read, written, or flushed, during XFS operations. -type ExtendedPrecisionStats struct { - FlushBytes uint64 - WriteBytes uint64 - ReadBytes uint64 -} diff --git a/vendor/github.com/uber-go/tally/.gitignore b/vendor/github.com/uber-go/tally/.gitignore new file mode 100644 index 000000000..897c298dd --- /dev/null +++ b/vendor/github.com/uber-go/tally/.gitignore @@ -0,0 +1,33 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test +vendor +bin + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof +*.pprof +*.out +*.log + +.DS_Store +node_modules/ +.idea/ diff --git a/vendor/github.com/uber-go/tally/.travis.yml b/vendor/github.com/uber-go/tally/.travis.yml new file mode 100644 index 000000000..1b1e8c16c --- /dev/null +++ b/vendor/github.com/uber-go/tally/.travis.yml @@ -0,0 +1,21 @@ +language: go +sudo: false +go: + - 1.13.x + - 1.14.x + - tip +env: + global: + - GO15VENDOREXPERIMENT=1 +cache: + directories: + - vendor +install: + - npm i uber-licence + - make dependencies +script: + - make test + - make lint +after_success: + - make coveralls + diff --git a/vendor/github.com/uber-go/tally/LICENSE b/vendor/github.com/uber-go/tally/LICENSE new file mode 100644 index 000000000..a8fc85148 --- /dev/null +++ b/vendor/github.com/uber-go/tally/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/uber-go/tally/Makefile b/vendor/github.com/uber-go/tally/Makefile new file mode 100644 index 000000000..6b268caf5 --- /dev/null +++ b/vendor/github.com/uber-go/tally/Makefile @@ -0,0 +1,61 @@ +export GO15VENDOREXPERIMENT=1 + +BENCH_FLAGS ?= -cpuprofile=cpu.pprof -memprofile=mem.pprof -benchmem +PKGS ?= $(shell glide novendor) +PKG_FILES ?= *.go example/*.go m3 +LINT_IGNORE = m3/thrift\|thirdparty +LICENSE_IGNORE = thirdparty + +.PHONY: all +all: lint test + +.PHONY: dependencies +dependencies: + @echo "Installing Glide and locked dependencies..." + glide --version || go get -u -f github.com/Masterminds/glide + glide install + @echo "Installing test dependencies..." + go install ./vendor/github.com/axw/gocov/gocov + go install ./vendor/github.com/mattn/goveralls + @echo "Installing golint..." + go install ./vendor/github.com/golang/lint/golint + +.PHONY: lint +lint: + @rm -rf lint.log + @echo "Checking formatting..." + @gofmt -d -s $(PKG_FILES) 2>&1 | grep -v '$(LINT_IGNORE)' | tee lint.log + @echo "Installing test dependencies for vet..." + @go test -i $(PKGS) + @echo "Checking lint..." + @$(foreach dir,$(PKGS),golint $(dir) 2>&1 | grep -v '$(LINT_IGNORE)' | tee -a lint.log;) + @echo "Checking for unresolved FIXMEs..." + @git grep -i fixme | grep -v -e vendor -e Makefile | grep -v '$(LINT_IGNORE)' | tee -a lint.log + @echo "Checking for license headers..." + @./check_license.sh | grep -v '$(LICENSE_IGNORE)' | tee -a lint.log + @[ ! -s lint.log ] + +.PHONY: test +test: + go test -race -v $(PKGS) + +.PHONY: examples +examples: + mkdir -p ./bin + go build -o ./bin/print_example ./example/ + go build -o ./bin/m3_example ./m3/example/ + go build -o ./bin/prometheus_example ./prometheus/example/ + go build -o ./bin/statsd_example ./statsd/example/ + +.PHONY: cover +cover: + go test -cover -coverprofile cover.out -race -v $(PKGS) + +.PHONY: coveralls +coveralls: + goveralls -service=travis-ci || echo "Coveralls failed" + +.PHONY: bench +BENCH ?= . +bench: + @$(foreach pkg,$(PKGS),go test -bench=$(BENCH) -run="^$$" $(BENCH_FLAGS) $(pkg);) diff --git a/vendor/github.com/uber-go/tally/README.md b/vendor/github.com/uber-go/tally/README.md new file mode 100644 index 000000000..d36254fe6 --- /dev/null +++ b/vendor/github.com/uber-go/tally/README.md @@ -0,0 +1,212 @@ +# :heavy_check_mark: tally [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] + +Fast, buffered, hierarchical stats collection in Go. + +## Installation +`go get -u github.com/uber-go/tally` + +## Abstract + +Tally provides a common interface for emitting metrics, while letting you not worry about the velocity of metrics emission. + +By default it buffers counters, gauges and histograms at a specified interval but does not buffer timer values. This is primarily so timer values can have all their values sampled if desired and if not they can be sampled as summaries or histograms independently by a reporter. + +## Structure + +- Scope: Keeps track of metrics, and their common metadata. +- Metrics: Counters, Gauges, Timers and Histograms. +- Reporter: Implemented by you. Accepts aggregated values from the scope. Forwards the aggregated values to your metrics ingestion pipeline. + - The reporters already available listed alphabetically are: + - `github.com/uber-go/tally/m3`: Report m3 metrics, timers are not sampled and forwarded directly. + - `github.com/uber-go/tally/multi`: Report to multiple reporters, you can multi-write metrics to other reporters simply. + - `github.com/uber-go/tally/prometheus`: Report prometheus metrics, timers by default are made summaries with an option to make them histograms instead. + - `github.com/uber-go/tally/statsd`: Report statsd metrics, no support for tags. + +### Basics + + - Scopes created with tally provide race-safe registration and use of all metric types `Counter`, `Gauge`, `Timer`, `Histogram`. + - `NewRootScope(...)` returns a `Scope` and `io.Closer`, the second return value is used to stop the scope's goroutine reporting values from the scope to it's reporter. This is to reduce the footprint of `Scope` from the public API for those implementing it themselves to use in Go packages that take a tally `Scope`. + +### Acquire a Scope ### +```go +reporter = NewMyStatsReporter() // Implement as you will +tags := map[string]string{ + "dc": "east-1", + "type": "master", +} +reportEvery := time.Second + +scope := tally.NewRootScope(tally.ScopeOptions{ + Tags: tags, + Reporter: reporter, +}, reportEvery) +``` + +### Get/Create a metric, use it ### +```go +// Get a counter, increment a counter +reqCounter := scope.Counter("requests") // cache me +reqCounter.Inc(1) + +queueGauge := scope.Gauge("queue_length") // cache me +queueGauge.Update(42) +``` + +### Report your metrics ### +Use the inbuilt statsd reporter: + +```go +import ( + "io" + "github.com/cactus/go-statsd-client/statsd" + "github.com/uber-go/tally" + tallystatsd "github.com/uber-go/tally/statsd" + // ... +) + +func newScope() (tally.Scope, io.Closer) { + statter, _ := statsd.NewBufferedClient("127.0.0.1:8125", + "stats", 100*time.Millisecond, 1440) + + reporter := tallystatsd.NewReporter(statter, tallystatsd.Options{ + SampleRate: 1.0, + }) + + scope, closer := tally.NewRootScope(tally.ScopeOptions{ + Prefix: "my-service", + Tags: map[string]string{}, + Reporter: r, + }, time.Second) + + return scope, closer +} +``` + +Implement your own reporter using the `StatsReporter` interface: + +```go + +// BaseStatsReporter implements the shared reporter methods. +type BaseStatsReporter interface { + Capabilities() Capabilities + Flush() +} + +// StatsReporter is a backend for Scopes to report metrics to. +type StatsReporter interface { + BaseStatsReporter + + // ReportCounter reports a counter value + ReportCounter( + name string, + tags map[string]string, + value int64, + ) + + // ReportGauge reports a gauge value + ReportGauge( + name string, + tags map[string]string, + value float64, + ) + + // ReportTimer reports a timer value + ReportTimer( + name string, + tags map[string]string, + interval time.Duration, + ) + + // ReportHistogramValueSamples reports histogram samples for a bucket + ReportHistogramValueSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound float64, + samples int64, + ) + + // ReportHistogramDurationSamples reports histogram samples for a bucket + ReportHistogramDurationSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound time.Duration, + samples int64, + ) +} +``` + +Or implement your own metrics implementation that matches the tally `Scope` interface to use different buffering semantics: + +```go +type Scope interface { + // Counter returns the Counter object corresponding to the name. + Counter(name string) Counter + + // Gauge returns the Gauge object corresponding to the name. + Gauge(name string) Gauge + + // Timer returns the Timer object corresponding to the name. + Timer(name string) Timer + + // Histogram returns the Histogram object corresponding to the name. + // To use default value and duration buckets configured for the scope + // simply pass tally.DefaultBuckets or nil. + // You can use tally.ValueBuckets{x, y, ...} for value buckets. + // You can use tally.DurationBuckets{x, y, ...} for duration buckets. + // You can use tally.MustMakeLinearValueBuckets(start, width, count) for linear values. + // You can use tally.MustMakeLinearDurationBuckets(start, width, count) for linear durations. + // You can use tally.MustMakeExponentialValueBuckets(start, factor, count) for exponential values. + // You can use tally.MustMakeExponentialDurationBuckets(start, factor, count) for exponential durations. + Histogram(name string, buckets Buckets) Histogram + + // Tagged returns a new child scope with the given tags and current tags. + Tagged(tags map[string]string) Scope + + // SubScope returns a new child scope appending a further name prefix. + SubScope(name string) Scope + + // Capabilities returns a description of metrics reporting capabilities. + Capabilities() Capabilities +} + +// Capabilities is a description of metrics reporting capabilities. +type Capabilities interface { + // Reporting returns whether the reporter has the ability to actively report. + Reporting() bool + + // Tagging returns whether the reporter has the capability for tagged metrics. + Tagging() bool +} +``` + +## Performance + +This stuff needs to be fast. With that in mind, we avoid locks and unnecessary memory allocations. + +``` +BenchmarkCounterInc-8 200000000 7.68 ns/op +BenchmarkReportCounterNoData-8 300000000 4.88 ns/op +BenchmarkReportCounterWithData-8 100000000 21.6 ns/op +BenchmarkGaugeSet-8 100000000 16.0 ns/op +BenchmarkReportGaugeNoData-8 100000000 10.4 ns/op +BenchmarkReportGaugeWithData-8 50000000 27.6 ns/op +BenchmarkTimerInterval-8 50000000 37.7 ns/op +BenchmarkTimerReport-8 300000000 5.69 ns/op +``` + +
+ +Released under the [MIT License](LICENSE). + +[doc-img]: https://godoc.org/github.com/uber-go/tally?status.svg +[doc]: https://godoc.org/github.com/uber-go/tally +[ci-img]: https://travis-ci.org/uber-go/tally.svg?branch=master +[ci]: https://travis-ci.org/uber-go/tally +[cov-img]: https://coveralls.io/repos/github/uber-go/tally/badge.svg?branch=master +[cov]: https://coveralls.io/github/uber-go/tally?branch=master +[glide.lock]: https://github.com/uber-go/tally/blob/master/glide.lock +[v1]: https://github.com/uber-go/tally/milestones diff --git a/vendor/github.com/uber-go/tally/check_license.sh b/vendor/github.com/uber-go/tally/check_license.sh new file mode 100644 index 000000000..f3b668230 --- /dev/null +++ b/vendor/github.com/uber-go/tally/check_license.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +./node_modules/.bin/uber-licence --version || npm i uber-licence@latest +./node_modules/.bin/uber-licence --dry --file "*.go" diff --git a/vendor/github.com/uber-go/tally/glide.lock b/vendor/github.com/uber-go/tally/glide.lock new file mode 100644 index 000000000..bb90fb08c --- /dev/null +++ b/vendor/github.com/uber-go/tally/glide.lock @@ -0,0 +1,74 @@ +hash: 6c5a37d4f995175d7ab310d09b5866057c683536b0ae3d8f478f87943aa03be4 +updated: 2019-11-07T15:02:21.080076-05:00 +imports: +- name: github.com/beorn7/perks + version: 3a771d992973f24aa725d07868b467d1ddfceafb + subpackages: + - quantile +- name: github.com/cactus/go-statsd-client + version: 138b925ccdf617776955904ba7759fce64406cec + subpackages: + - statsd +- name: github.com/golang/protobuf + version: 14aad3d5ea4c323bcd7a2137e735da24a76e814c + subpackages: + - proto +- name: github.com/m3db/prometheus_client_golang + version: 8ae269d24972b8695572fa6b2e3718b5ea82d6b4 + subpackages: + - prometheus + - prometheus/promhttp +- name: github.com/m3db/prometheus_client_model + version: d3fff8420252ef63bffb96f689d1a85096c97321 + subpackages: + - go +- name: github.com/m3db/prometheus_common + version: d550673fc477123acb69017380567e8fafc765fc + subpackages: + - expfmt + - internal/bitbucket.org/ww/goautoneg + - model +- name: github.com/m3db/prometheus_procfs + version: 1878d9fbb537119d24b21ca07effd591627cd160 +- name: github.com/matttproud/golang_protobuf_extensions + version: c12348ce28de40eed0136aa2b644d0ee0650e56c + subpackages: + - pbutil +- name: github.com/pkg/errors + version: ba968bfe8b2f7e042a574c888954fccecfa385b4 +- name: go.uber.org/atomic + version: 9dc4df04d0d1c39369750a9f6c32c39560672089 +- name: gopkg.in/validator.v2 + version: 135c24b11c19e52befcae2ec3fca5d9b78c4e98e +- name: gopkg.in/yaml.v2 + version: 5420a8b6744d3b0345ab293f6fcba19c978f1183 +testImports: +- name: github.com/axw/gocov + version: 54b98cfcac0c63fb3f9bd8e7ad241b724d4e985b + subpackages: + - gocov +- name: github.com/davecgh/go-spew + version: 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d + subpackages: + - spew +- name: github.com/golang/lint + version: c7bacac2b21ca01afa1dee0acf64df3ce047c28f + subpackages: + - golint +- name: github.com/mattn/goveralls + version: f4d273b02ce1b4e48acf3662b717aa987bfc4118 +- name: github.com/pborman/uuid + version: c55201b036063326c5b1b89ccfe45a184973d073 +- name: github.com/pmezard/go-difflib + version: d8ed2627bdf02c080bf22230dbb337003b7aba2d + subpackages: + - difflib +- name: github.com/stretchr/testify + version: d77da356e56a7428ad25149ca77381849a6a5232 + subpackages: + - assert + - require +- name: golang.org/x/tools + version: 3fe2afc9e626f32e91aff6eddb78b14743446865 + subpackages: + - cover diff --git a/vendor/github.com/uber-go/tally/glide.yaml b/vendor/github.com/uber-go/tally/glide.yaml new file mode 100644 index 000000000..8dd97e92e --- /dev/null +++ b/vendor/github.com/uber-go/tally/glide.yaml @@ -0,0 +1,44 @@ +package: github.com/uber-go/tally +import: +- package: github.com/cactus/go-statsd-client + version: ~3.1.0 + subpackages: + - statsd +- package: github.com/m3db/prometheus_client_golang + version: ^0.8.1 + subpackages: + - prometheus +- package: github.com/m3db/prometheus_client_model + version: ^0.1.0 +- package: github.com/m3db/prometheus_common + version: ^0.1.0 +- package: github.com/m3db/prometheus_procfs + version: ^0.8.1 +- package: go.uber.org/atomic + version: ^1 +- package: github.com/pkg/errors + version: ^0.8.1 +testImport: +- package: github.com/axw/gocov + version: 54b98cfcac0c63fb3f9bd8e7ad241b724d4e985b + subpackages: + - gocov +- package: github.com/mattn/goveralls + version: f4d273b02ce1b4e48acf3662b717aa987bfc4118 +- package: golang.org/x/tools + version: 3fe2afc9e626f32e91aff6eddb78b14743446865 + subpackages: + - cover +- package: github.com/golang/lint + version: c7bacac2b21ca01afa1dee0acf64df3ce047c28f + subpackages: + - golint +- package: github.com/pborman/uuid + version: c55201b036063326c5b1b89ccfe45a184973d073 +- package: github.com/stretchr/testify + version: d77da356e56a7428ad25149ca77381849a6a5232 + subpackages: + - assert + - require +- package: gopkg.in/validator.v2 +- package: gopkg.in/yaml.v2 diff --git a/vendor/github.com/uber-go/tally/histogram.go b/vendor/github.com/uber-go/tally/histogram.go new file mode 100644 index 000000000..fe1d68002 --- /dev/null +++ b/vendor/github.com/uber-go/tally/histogram.go @@ -0,0 +1,318 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "errors" + "fmt" + "math" + "sort" + "time" +) + +var ( + // DefaultBuckets can be passed to specify to default buckets. + DefaultBuckets Buckets + + errBucketsCountNeedsGreaterThanZero = errors.New("n needs to be > 0") + errBucketsStartNeedsGreaterThanZero = errors.New("start needs to be > 0") + errBucketsFactorNeedsGreaterThanOne = errors.New("factor needs to be > 1") +) + +// ValueBuckets is a set of float64 values that implements Buckets. +type ValueBuckets []float64 + +// Implements sort.Interface +func (v ValueBuckets) Len() int { + return len(v) +} + +// Implements sort.Interface +func (v ValueBuckets) Swap(i, j int) { + v[i], v[j] = v[j], v[i] +} + +// Implements sort.Interface +func (v ValueBuckets) Less(i, j int) bool { + return v[i] < v[j] +} + +func (v ValueBuckets) String() string { + values := make([]string, len(v)) + for i := range values { + values[i] = fmt.Sprintf("%f", v[i]) + } + return fmt.Sprint(values) +} + +// AsValues implements Buckets. +func (v ValueBuckets) AsValues() []float64 { + return []float64(v) +} + +// AsDurations implements Buckets and returns time.Duration +// representations of the float64 values divided by time.Second. +func (v ValueBuckets) AsDurations() []time.Duration { + values := make([]time.Duration, len(v)) + for i := range values { + values[i] = time.Duration(v[i] * float64(time.Second)) + } + return values +} + +// DurationBuckets is a set of time.Duration values that implements Buckets. +type DurationBuckets []time.Duration + +// Implements sort.Interface +func (v DurationBuckets) Len() int { + return len(v) +} + +// Implements sort.Interface +func (v DurationBuckets) Swap(i, j int) { + v[i], v[j] = v[j], v[i] +} + +// Implements sort.Interface +func (v DurationBuckets) Less(i, j int) bool { + return v[i] < v[j] +} + +func (v DurationBuckets) String() string { + values := make([]string, len(v)) + for i := range values { + values[i] = v[i].String() + } + return fmt.Sprintf("%v", values) +} + +// AsValues implements Buckets and returns float64 +// representations of the time.Duration values divided by time.Second. +func (v DurationBuckets) AsValues() []float64 { + values := make([]float64, len(v)) + for i := range values { + values[i] = float64(v[i]) / float64(time.Second) + } + return values +} + +// AsDurations implements Buckets. +func (v DurationBuckets) AsDurations() []time.Duration { + return []time.Duration(v) +} + +// BucketPairs creates a set of bucket pairs from a set +// of buckets describing the lower and upper bounds for +// each derived bucket. +func BucketPairs(buckets Buckets) []BucketPair { + if buckets == nil || buckets.Len() < 1 { + return []BucketPair{ + + bucketPair{ + lowerBoundValue: -math.MaxFloat64, + upperBoundValue: math.MaxFloat64, + lowerBoundDuration: time.Duration(math.MinInt64), + upperBoundDuration: time.Duration(math.MaxInt64), + }, + } + } + + var ( + asValueBuckets = copyAndSortValues(buckets.AsValues()) + asDurationBuckets = copyAndSortDurations(buckets.AsDurations()) + pairs = make([]BucketPair, 0, buckets.Len()+2) + ) + + pairs = append(pairs, bucketPair{ + lowerBoundValue: -math.MaxFloat64, + upperBoundValue: asValueBuckets[0], + lowerBoundDuration: time.Duration(math.MinInt64), + upperBoundDuration: asDurationBuckets[0], + }) + + prevValueBucket, prevDurationBucket := + asValueBuckets[0], asDurationBuckets[0] + + for i := 1; i < buckets.Len(); i++ { + pairs = append(pairs, bucketPair{ + lowerBoundValue: prevValueBucket, + upperBoundValue: asValueBuckets[i], + lowerBoundDuration: prevDurationBucket, + upperBoundDuration: asDurationBuckets[i], + }) + prevValueBucket, prevDurationBucket = + asValueBuckets[i], asDurationBuckets[i] + } + + pairs = append(pairs, bucketPair{ + lowerBoundValue: prevValueBucket, + upperBoundValue: math.MaxFloat64, + lowerBoundDuration: prevDurationBucket, + upperBoundDuration: time.Duration(math.MaxInt64), + }) + + return pairs +} + +func copyAndSortValues(values []float64) []float64 { + valuesCopy := make([]float64, len(values)) + for i := range values { + valuesCopy[i] = values[i] + } + sort.Sort(ValueBuckets(valuesCopy)) + return valuesCopy +} + +func copyAndSortDurations(durations []time.Duration) []time.Duration { + durationsCopy := make([]time.Duration, len(durations)) + for i := range durations { + durationsCopy[i] = durations[i] + } + sort.Sort(DurationBuckets(durationsCopy)) + return durationsCopy +} + +type bucketPair struct { + lowerBoundValue float64 + upperBoundValue float64 + lowerBoundDuration time.Duration + upperBoundDuration time.Duration +} + +func (p bucketPair) LowerBoundValue() float64 { + return p.lowerBoundValue +} + +func (p bucketPair) UpperBoundValue() float64 { + return p.upperBoundValue +} + +func (p bucketPair) LowerBoundDuration() time.Duration { + return p.lowerBoundDuration +} + +func (p bucketPair) UpperBoundDuration() time.Duration { + return p.upperBoundDuration +} + +// LinearValueBuckets creates a set of linear value buckets. +func LinearValueBuckets(start, width float64, n int) (ValueBuckets, error) { + if n <= 0 { + return nil, errBucketsCountNeedsGreaterThanZero + } + buckets := make([]float64, n) + for i := range buckets { + buckets[i] = start + (float64(i) * width) + } + return ValueBuckets(buckets), nil +} + +// MustMakeLinearValueBuckets creates a set of linear value buckets +// or panics. +func MustMakeLinearValueBuckets(start, width float64, n int) ValueBuckets { + buckets, err := LinearValueBuckets(start, width, n) + if err != nil { + panic(err) + } + return buckets +} + +// LinearDurationBuckets creates a set of linear duration buckets. +func LinearDurationBuckets(start, width time.Duration, n int) (DurationBuckets, error) { + if n <= 0 { + return nil, errBucketsCountNeedsGreaterThanZero + } + buckets := make([]time.Duration, n) + for i := range buckets { + buckets[i] = start + (time.Duration(i) * width) + } + return DurationBuckets(buckets), nil +} + +// MustMakeLinearDurationBuckets creates a set of linear duration buckets. +// or panics. +func MustMakeLinearDurationBuckets(start, width time.Duration, n int) DurationBuckets { + buckets, err := LinearDurationBuckets(start, width, n) + if err != nil { + panic(err) + } + return buckets +} + +// ExponentialValueBuckets creates a set of exponential value buckets. +func ExponentialValueBuckets(start, factor float64, n int) (ValueBuckets, error) { + if n <= 0 { + return nil, errBucketsCountNeedsGreaterThanZero + } + if start <= 0 { + return nil, errBucketsStartNeedsGreaterThanZero + } + if factor <= 1 { + return nil, errBucketsFactorNeedsGreaterThanOne + } + buckets := make([]float64, n) + curr := start + for i := range buckets { + buckets[i] = curr + curr *= factor + } + return ValueBuckets(buckets), nil +} + +// MustMakeExponentialValueBuckets creates a set of exponential value buckets +// or panics. +func MustMakeExponentialValueBuckets(start, factor float64, n int) ValueBuckets { + buckets, err := ExponentialValueBuckets(start, factor, n) + if err != nil { + panic(err) + } + return buckets +} + +// ExponentialDurationBuckets creates a set of exponential duration buckets. +func ExponentialDurationBuckets(start time.Duration, factor float64, n int) (DurationBuckets, error) { + if n <= 0 { + return nil, errBucketsCountNeedsGreaterThanZero + } + if start <= 0 { + return nil, errBucketsStartNeedsGreaterThanZero + } + if factor <= 1 { + return nil, errBucketsFactorNeedsGreaterThanOne + } + buckets := make([]time.Duration, n) + curr := start + for i := range buckets { + buckets[i] = curr + curr = time.Duration(float64(curr) * factor) + } + return DurationBuckets(buckets), nil +} + +// MustMakeExponentialDurationBuckets creates a set of exponential value buckets +// or panics. +func MustMakeExponentialDurationBuckets(start time.Duration, factor float64, n int) DurationBuckets { + buckets, err := ExponentialDurationBuckets(start, factor, n) + if err != nil { + panic(err) + } + return buckets +} diff --git a/vendor/github.com/uber-go/tally/key_gen.go b/vendor/github.com/uber-go/tally/key_gen.go new file mode 100644 index 000000000..3ae1ae30e --- /dev/null +++ b/vendor/github.com/uber-go/tally/key_gen.go @@ -0,0 +1,134 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "bytes" + "sort" +) + +const ( + prefixSplitter = '+' + keyPairSplitter = ',' + keyNameSplitter = '=' +) + +var ( + keyGenPool = newKeyGenerationPool(1024, 1024, 32) + nilString = "" +) + +type keyGenerationPool struct { + bufferPool *ObjectPool + stringsPool *ObjectPool +} + +// KeyForStringMap generates a unique key for a map string set combination. +func KeyForStringMap( + stringMap map[string]string, +) string { + return KeyForPrefixedStringMap(nilString, stringMap) +} + +// KeyForPrefixedStringMap generates a unique key for a +// a prefix and a map string set combination. +func KeyForPrefixedStringMap( + prefix string, + stringMap map[string]string, +) string { + return keyForPrefixedStringMaps(prefix, stringMap) +} + +// keyForPrefixedStringMaps generates a unique key for a prefix and a series +// of maps containing tags. +// +// If a key occurs in multiple maps, keys on the right take precedence. +func keyForPrefixedStringMaps(prefix string, maps ...map[string]string) string { + keys := keyGenPool.stringsPool.Get().([]string) + for _, m := range maps { + for k := range m { + keys = append(keys, k) + } + } + sort.Strings(keys) + + buf := keyGenPool.bufferPool.Get().(*bytes.Buffer) + + if prefix != nilString { + buf.WriteString(prefix) + buf.WriteByte(prefixSplitter) + } + + var lastKey string // last key written to the buffer + for _, k := range keys { + if len(lastKey) > 0 { + if k == lastKey { + // Already wrote this key. + continue + } + buf.WriteByte(keyPairSplitter) + } + lastKey = k + + buf.WriteString(k) + buf.WriteByte(keyNameSplitter) + + // Find and write the value for this key. Rightmost map takes + // precedence. + for j := len(maps) - 1; j >= 0; j-- { + if v, ok := maps[j][k]; ok { + buf.WriteString(v) + break + } + } + } + + key := buf.String() + keyGenPool.release(buf, keys) + return key +} + +func newKeyGenerationPool(size, blen, slen int) *keyGenerationPool { + b := NewObjectPool(size) + b.Init(func() interface{} { + return bytes.NewBuffer(make([]byte, 0, blen)) + }) + + s := NewObjectPool(size) + s.Init(func() interface{} { + return make([]string, 0, slen) + }) + + return &keyGenerationPool{ + bufferPool: b, + stringsPool: s, + } +} + +func (s *keyGenerationPool) release(b *bytes.Buffer, strs []string) { + b.Reset() + s.bufferPool.Put(b) + + for i := range strs { + strs[i] = nilString + } + s.stringsPool.Put(strs[:0]) +} diff --git a/vendor/github.com/uber-go/tally/pool.go b/vendor/github.com/uber-go/tally/pool.go new file mode 100644 index 000000000..c4003565c --- /dev/null +++ b/vendor/github.com/uber-go/tally/pool.go @@ -0,0 +1,63 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +// ObjectPool is an minimalistic object pool to avoid +// any circular dependencies on any other object pool. +type ObjectPool struct { + values chan interface{} + alloc func() interface{} +} + +// NewObjectPool creates a new pool. +func NewObjectPool(size int) *ObjectPool { + return &ObjectPool{ + values: make(chan interface{}, size), + } +} + +// Init initializes the object pool. +func (p *ObjectPool) Init(alloc func() interface{}) { + p.alloc = alloc + + for i := 0; i < cap(p.values); i++ { + p.values <- p.alloc() + } +} + +// Get gets an object from the pool. +func (p *ObjectPool) Get() interface{} { + var v interface{} + select { + case v = <-p.values: + default: + v = p.alloc() + } + return v +} + +// Put puts an object back to the pool. +func (p *ObjectPool) Put(obj interface{}) { + select { + case p.values <- obj: + default: + } +} diff --git a/vendor/github.com/uber-go/tally/prometheus/README.md b/vendor/github.com/uber-go/tally/prometheus/README.md new file mode 100644 index 000000000..3f6fdad28 --- /dev/null +++ b/vendor/github.com/uber-go/tally/prometheus/README.md @@ -0,0 +1,118 @@ +# A buffered Prometheus reporter + +See `examples/prometheus_main.go` for an end to end example. + +## Options + +You can use a specific Prometheus registry, and you can use +either summaries or histograms for timers. + +The reporter options are: + +```go +// Options is a set of options for the tally reporter. +type Options struct { + // Registerer is the prometheus registerer to register + // metrics with. Use nil to specify the default registerer. + Registerer prom.Registerer + + // DefaultTimerType is the default type timer type to create + // when using timers. It's default value is a histogram timer type. + DefaultTimerType TimerType + + // DefaultHistogramBuckets is the default histogram buckets + // to use. Use nil to specify the default histogram buckets. + DefaultHistogramBuckets []float64 + + // DefaultSummaryObjectives is the default summary objectives + // to use. Use nil to specify the default summary objectives. + DefaultSummaryObjectives map[float64]float64 + + // OnRegisterError defines a method to call to when registering + // a metric with the registerer fails. Use nil to specify + // to panic by default when registering a metric fails. + OnRegisterError func(err error) +} +``` + +The timer types are: + +```go +// TimerType describes a type of timer +type TimerType int + +const ( + // SummaryTimerType is a timer type that reports into a summary + SummaryTimerType TimerType = iota + + // HistogramTimerType is a timer type that reports into a histogram + HistogramTimerType +) +``` + +You can also pre-register help description text ahead of using a metric +that will be named and tagged identically with `tally`. You can also +access the Prometheus HTTP handler directly. + +The returned reporter interface: + +```go +// Reporter is a Prometheus backed tally reporter. +type Reporter interface { + tally.CachedStatsReporter + + // HTTPHandler provides the Prometheus HTTP scrape handler. + HTTPHandler() http.Handler + + // RegisterCounter is a helper method to initialize a counter + // in the Prometheus backend with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + RegisterCounter( + name string, + tagKeys []string, + desc string, + ) (*prom.CounterVec, error) + + // RegisterGauge is a helper method to initialize a gauge + // in the prometheus backend with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + RegisterGauge( + name string, + tagKeys []string, + desc string, + ) (*prom.GaugeVec, error) + + // RegisterTimer is a helper method to initialize a timer + // summary or histogram vector in the prometheus backend + // with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + // You may pass opts as nil to get the default timer type + // and objectives/buckets. + // You may also pass objectives/buckets as nil in opts to + // get the default objectives/buckets for the specified + // timer type. + RegisterTimer( + name string, + tagKeys []string, + desc string, + opts *RegisterTimerOptions, + ) (TimerUnion, error) +} +``` + +The register timer options: + +```go +// RegisterTimerOptions provides options when registering a timer on demand. +// By default you can pass nil for the options to get the reporter defaults. +type RegisterTimerOptions struct { + TimerType TimerType + HistogramBuckets []float64 + SummaryObjectives map[float64]float64 +} +``` + + diff --git a/vendor/github.com/uber-go/tally/prometheus/config.go b/vendor/github.com/uber-go/tally/prometheus/config.go new file mode 100644 index 000000000..7537619c4 --- /dev/null +++ b/vendor/github.com/uber-go/tally/prometheus/config.go @@ -0,0 +1,176 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package prometheus + +import ( + "fmt" + "log" + "net" + "net/http" + "os" + "strings" + + prom "github.com/m3db/prometheus_client_golang/prometheus" +) + +// Configuration is a configuration for a Prometheus reporter. +type Configuration struct { + // HandlerPath if specified will be used instead of using the default + // HTTP handler path "/metrics". + HandlerPath string `yaml:"handlerPath"` + + // ListenNetwork if specified will be used instead of using tcp network. + // Supported networks: tcp, tcp4, tcp6 and unix. + ListenNetwork string `yaml:"listenNetwork"` + + // ListenAddress if specified will be used instead of just registering the + // handler on the default HTTP serve mux without listening. + ListenAddress string `yaml:"listenAddress"` + + // TimerType is the default Prometheus type to use for Tally timers. + TimerType string `yaml:"timerType"` + + // DefaultHistogramBuckets if specified will set the default histogram + // buckets to be used by the reporter. + DefaultHistogramBuckets []HistogramObjective `yaml:"defaultHistogramBuckets"` + + // DefaultSummaryObjectives if specified will set the default summary + // objectives to be used by the reporter. + DefaultSummaryObjectives []SummaryObjective `yaml:"defaultSummaryObjectives"` + + // OnError specifies what to do when an error either with listening + // on the specified listen address or registering a metric with the + // Prometheus. By default the registerer will panic. + OnError string `yaml:"onError"` +} + +// HistogramObjective is a Prometheus histogram bucket. +// See: https://godoc.org/github.com/prometheus/client_golang/prometheus#HistogramOpts +type HistogramObjective struct { + Upper float64 `yaml:"upper"` +} + +// SummaryObjective is a Prometheus summary objective. +// See: https://godoc.org/github.com/prometheus/client_golang/prometheus#SummaryOpts +type SummaryObjective struct { + Percentile float64 `yaml:"percentile"` + AllowedError float64 `yaml:"allowedError"` +} + +// ConfigurationOptions allows some programatic options, such as using a +// specific registry and what error callback to register. +type ConfigurationOptions struct { + // Registry if not nil will specify the specific registry to use + // for registering metrics. + Registry *prom.Registry + // OnError allows for customization of what to do when a metric + // registration error fails, the default is to panic. + OnError func(e error) +} + +// NewReporter creates a new M3 reporter from this configuration. +func (c Configuration) NewReporter( + configOpts ConfigurationOptions, +) (Reporter, error) { + var opts Options + + if configOpts.Registry != nil { + opts.Registerer = configOpts.Registry + } + + if configOpts.OnError != nil { + opts.OnRegisterError = configOpts.OnError + } else { + switch c.OnError { + case "stderr": + opts.OnRegisterError = func(err error) { + fmt.Fprintf(os.Stderr, "tally prometheus reporter error: %v\n", err) + } + case "log": + opts.OnRegisterError = func(err error) { + log.Printf("tally prometheus reporter error: %v\n", err) + } + case "none": + opts.OnRegisterError = func(err error) {} + default: + opts.OnRegisterError = func(err error) { + panic(err) + } + } + } + + switch c.TimerType { + case "summary": + opts.DefaultTimerType = SummaryTimerType + case "histogram": + opts.DefaultTimerType = HistogramTimerType + } + + if len(c.DefaultHistogramBuckets) > 0 { + var values []float64 + for _, value := range c.DefaultHistogramBuckets { + values = append(values, value.Upper) + } + opts.DefaultHistogramBuckets = values + } + + if len(c.DefaultSummaryObjectives) > 0 { + values := make(map[float64]float64) + for _, value := range c.DefaultSummaryObjectives { + values[value.Percentile] = value.AllowedError + } + opts.DefaultSummaryObjectives = values + } + + reporter := NewReporter(opts) + + path := "/metrics" + if handlerPath := strings.TrimSpace(c.HandlerPath); handlerPath != "" { + path = handlerPath + } + + if addr := strings.TrimSpace(c.ListenAddress); addr == "" { + http.Handle(path, reporter.HTTPHandler()) + } else { + mux := http.NewServeMux() + mux.Handle(path, reporter.HTTPHandler()) + go func() { + network := c.ListenNetwork + if network == "" { + network = "tcp" + } + + listener, err := net.Listen(network, addr) + if err != nil { + opts.OnRegisterError(err) + return + } + + defer listener.Close() + + if err = http.Serve(listener, mux); err != nil { + opts.OnRegisterError(err) + } + }() + } + + return reporter, nil +} diff --git a/vendor/github.com/uber-go/tally/prometheus/reporter.go b/vendor/github.com/uber-go/tally/prometheus/reporter.go new file mode 100644 index 000000000..1642decb6 --- /dev/null +++ b/vendor/github.com/uber-go/tally/prometheus/reporter.go @@ -0,0 +1,610 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package prometheus + +import ( + "net/http" + "strings" + "sync" + "time" + + prom "github.com/m3db/prometheus_client_golang/prometheus" + "github.com/m3db/prometheus_client_golang/prometheus/promhttp" + "github.com/pkg/errors" + "github.com/uber-go/tally" +) + +const ( + // DefaultSeparator is the default separator that should be used with + // a tally scope for a prometheus reporter. + DefaultSeparator = "_" +) + +var ( + errUnknownTimerType = errors.New("unknown metric timer type") + ms = float64(time.Millisecond) / float64(time.Second) +) + +// DefaultHistogramBuckets is the default histogram buckets used when +// creating a new Histogram in the prometheus registry. +// See: https://godoc.org/github.com/prometheus/client_golang/prometheus#HistogramOpts +func DefaultHistogramBuckets() []float64 { + return []float64{ + ms, + 2 * ms, + 5 * ms, + 10 * ms, + 20 * ms, + 50 * ms, + 100 * ms, + 200 * ms, + 500 * ms, + 1000 * ms, + 2000 * ms, + 5000 * ms, + 10000 * ms, + } +} + +// DefaultSummaryObjectives is the default objectives used when +// creating a new Summary in the prometheus registry. +// See: https://godoc.org/github.com/prometheus/client_golang/prometheus#SummaryOpts +func DefaultSummaryObjectives() map[float64]float64 { + return map[float64]float64{ + 0.5: 0.01, + 0.75: 0.001, + 0.95: 0.001, + 0.99: 0.001, + 0.999: 0.0001, + } +} + +// Reporter is a Prometheus backed tally reporter. +type Reporter interface { + tally.CachedStatsReporter + + // HTTPHandler provides the Prometheus HTTP scrape handler. + HTTPHandler() http.Handler + + // RegisterCounter is a helper method to initialize a counter + // in the Prometheus backend with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + RegisterCounter( + name string, + tagKeys []string, + desc string, + ) (*prom.CounterVec, error) + + // RegisterGauge is a helper method to initialize a gauge + // in the prometheus backend with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + RegisterGauge( + name string, + tagKeys []string, + desc string, + ) (*prom.GaugeVec, error) + + // RegisterTimer is a helper method to initialize a timer + // summary or histogram vector in the prometheus backend + // with a given help text. + // If not called explicitly, the Reporter will create one for + // you on first use, with a not super helpful HELP string. + // You may pass opts as nil to get the default timer type + // and objectives/buckets. + // You may also pass objectives/buckets as nil in opts to + // get the default objectives/buckets for the specified + // timer type. + RegisterTimer( + name string, + tagKeys []string, + desc string, + opts *RegisterTimerOptions, + ) (TimerUnion, error) +} + +// RegisterTimerOptions provides options when registering a timer on demand. +// By default you can pass nil for the options to get the reporter defaults. +type RegisterTimerOptions struct { + TimerType TimerType + HistogramBuckets []float64 + SummaryObjectives map[float64]float64 +} + +// TimerUnion is a representation of either a summary or a histogram +// described by the TimerType. +type TimerUnion struct { + TimerType TimerType + Histogram *prom.HistogramVec + Summary *prom.SummaryVec +} + +type metricID string + +type reporter struct { + sync.RWMutex + registerer prom.Registerer + gatherer prom.Gatherer + timerType TimerType + objectives map[float64]float64 + buckets []float64 + onRegisterError func(e error) + counters map[metricID]*prom.CounterVec + gauges map[metricID]*prom.GaugeVec + timers map[metricID]*promTimerVec + histograms map[metricID]*prom.HistogramVec +} + +type promTimerVec struct { + summary *prom.SummaryVec + histogram *prom.HistogramVec +} + +type cachedMetric struct { + counter prom.Counter + gauge prom.Gauge + reportTimer func(d time.Duration) + histogram prom.Histogram + summary prom.Summary +} + +func (m *cachedMetric) ReportCount(value int64) { + m.counter.Add(float64(value)) +} + +func (m *cachedMetric) ReportGauge(value float64) { + m.gauge.Set(value) +} + +func (m *cachedMetric) ReportTimer(interval time.Duration) { + m.reportTimer(interval) +} + +func (m *cachedMetric) reportTimerHistogram(interval time.Duration) { + m.histogram.Observe(float64(interval) / float64(time.Second)) +} + +func (m *cachedMetric) reportTimerSummary(interval time.Duration) { + m.summary.Observe(float64(interval) / float64(time.Second)) +} + +func (m *cachedMetric) ValueBucket( + bucketLowerBound, bucketUpperBound float64, +) tally.CachedHistogramBucket { + return cachedHistogramBucket{m, bucketUpperBound} +} + +func (m *cachedMetric) DurationBucket( + bucketLowerBound, bucketUpperBound time.Duration, +) tally.CachedHistogramBucket { + upperBound := float64(bucketUpperBound) / float64(time.Second) + return cachedHistogramBucket{m, upperBound} +} + +type cachedHistogramBucket struct { + metric *cachedMetric + upperBound float64 +} + +func (b cachedHistogramBucket) ReportSamples(value int64) { + for i := int64(0); i < value; i++ { + b.metric.histogram.Observe(b.upperBound) + } +} + +type noopMetric struct{} + +func (m noopMetric) ReportCount(value int64) {} +func (m noopMetric) ReportGauge(value float64) {} +func (m noopMetric) ReportTimer(interval time.Duration) {} +func (m noopMetric) ReportSamples(value int64) {} +func (m noopMetric) ValueBucket(lower, upper float64) tally.CachedHistogramBucket { + return m +} +func (m noopMetric) DurationBucket(lower, upper time.Duration) tally.CachedHistogramBucket { + return m +} + +func (r *reporter) HTTPHandler() http.Handler { + return promhttp.HandlerFor(r.gatherer, promhttp.HandlerOpts{}) +} + +// TimerType describes a type of timer +type TimerType int + +const ( + // SummaryTimerType is a timer type that reports into a summary + SummaryTimerType TimerType = iota + + // HistogramTimerType is a timer type that reports into a histogram + HistogramTimerType +) + +// Options is a set of options for the tally reporter. +type Options struct { + // Registerer is the prometheus registerer to register + // metrics with. Use nil to specify the default registerer. + Registerer prom.Registerer + + // Gatherer is the prometheus gatherer to gather + // metrics with. Use nil to specify the default gatherer. + Gatherer prom.Gatherer + + // DefaultTimerType is the default type timer type to create + // when using timers. It's default value is a summary timer type. + DefaultTimerType TimerType + + // DefaultHistogramBuckets is the default histogram buckets + // to use. Use nil to specify the default histogram buckets. + DefaultHistogramBuckets []float64 + + // DefaultSummaryObjectives is the default summary objectives + // to use. Use nil to specify the default summary objectives. + DefaultSummaryObjectives map[float64]float64 + + // OnRegisterError defines a method to call to when registering + // a metric with the registerer fails. Use nil to specify + // to panic by default when registering fails. + OnRegisterError func(err error) +} + +// NewReporter returns a new Reporter for Prometheus client backed metrics +// objectives is the objectives used when creating a new Summary histogram for Timers. See +// https://godoc.org/github.com/prometheus/client_golang/prometheus#SummaryOpts for more details. +func NewReporter(opts Options) Reporter { + if opts.Registerer == nil { + opts.Registerer = prom.DefaultRegisterer + } else { + // A specific registerer was set, check if it's a registry and if + // no gatherer was set, then use that as the gatherer + if reg, ok := opts.Registerer.(*prom.Registry); ok && opts.Gatherer == nil { + opts.Gatherer = reg + } + } + if opts.Gatherer == nil { + opts.Gatherer = prom.DefaultGatherer + } + if opts.DefaultHistogramBuckets == nil { + opts.DefaultHistogramBuckets = DefaultHistogramBuckets() + } + if opts.DefaultSummaryObjectives == nil { + opts.DefaultSummaryObjectives = DefaultSummaryObjectives() + } + if opts.OnRegisterError == nil { + opts.OnRegisterError = func(err error) { + // n.b. Because our forked Prometheus client does not actually emit + // this message as a concrete error type (it uses fmt.Errorf), + // we need to check the error message. + if strings.Contains(err.Error(), "previously registered") { + err = errors.WithMessagef( + err, + "potential tally.Scope() vs Prometheus usage contract mismatch: "+ + "if this occurs after using Scope.Tagged(), different metric "+ + "names must be used than were registered with the parent scope", + ) + } + + panic(err) + } + } + + return &reporter{ + registerer: opts.Registerer, + gatherer: opts.Gatherer, + timerType: opts.DefaultTimerType, + buckets: opts.DefaultHistogramBuckets, + objectives: opts.DefaultSummaryObjectives, + onRegisterError: opts.OnRegisterError, + counters: make(map[metricID]*prom.CounterVec), + gauges: make(map[metricID]*prom.GaugeVec), + timers: make(map[metricID]*promTimerVec), + } +} + +func (r *reporter) RegisterCounter( + name string, + tagKeys []string, + desc string, +) (*prom.CounterVec, error) { + return r.counterVec(name, tagKeys, desc) +} + +func (r *reporter) counterVec( + name string, + tagKeys []string, + desc string, +) (*prom.CounterVec, error) { + id := canonicalMetricID(name, tagKeys) + + r.Lock() + defer r.Unlock() + + if ctr, ok := r.counters[id]; ok { + return ctr, nil + } + + ctr := prom.NewCounterVec( + prom.CounterOpts{ + Name: name, + Help: desc, + }, + tagKeys, + ) + + if err := r.registerer.Register(ctr); err != nil { + return nil, err + } + + r.counters[id] = ctr + return ctr, nil +} + +// AllocateCounter implements tally.CachedStatsReporter. +func (r *reporter) AllocateCounter(name string, tags map[string]string) tally.CachedCount { + tagKeys := keysFromMap(tags) + counterVec, err := r.counterVec(name, tagKeys, name+" counter") + if err != nil { + r.onRegisterError(err) + return noopMetric{} + } + return &cachedMetric{counter: counterVec.With(tags)} +} + +func (r *reporter) RegisterGauge( + name string, + tagKeys []string, + desc string, +) (*prom.GaugeVec, error) { + return r.gaugeVec(name, tagKeys, desc) +} + +func (r *reporter) gaugeVec( + name string, + tagKeys []string, + desc string, +) (*prom.GaugeVec, error) { + id := canonicalMetricID(name, tagKeys) + + r.Lock() + defer r.Unlock() + + if g, ok := r.gauges[id]; ok { + return g, nil + } + + g := prom.NewGaugeVec( + prom.GaugeOpts{ + Name: name, + Help: desc, + }, + tagKeys, + ) + + if err := r.registerer.Register(g); err != nil { + return nil, err + } + + r.gauges[id] = g + return g, nil +} + +// AllocateGauge implements tally.CachedStatsReporter. +func (r *reporter) AllocateGauge(name string, tags map[string]string) tally.CachedGauge { + tagKeys := keysFromMap(tags) + gaugeVec, err := r.gaugeVec(name, tagKeys, name+" gauge") + if err != nil { + r.onRegisterError(err) + return noopMetric{} + } + return &cachedMetric{gauge: gaugeVec.With(tags)} +} + +func (r *reporter) RegisterTimer( + name string, + tagKeys []string, + desc string, + opts *RegisterTimerOptions, +) (TimerUnion, error) { + timerType, buckets, objectives := r.timerConfig(opts) + switch timerType { + case HistogramTimerType: + h, err := r.histogramVec(name, tagKeys, desc, buckets) + return TimerUnion{TimerType: timerType, Histogram: h}, err + case SummaryTimerType: + s, err := r.summaryVec(name, tagKeys, desc, objectives) + return TimerUnion{TimerType: timerType, Summary: s}, err + } + return TimerUnion{}, errUnknownTimerType +} + +func (r *reporter) timerConfig( + opts *RegisterTimerOptions, +) ( + timerType TimerType, + buckets []float64, + objectives map[float64]float64, +) { + timerType = r.timerType + objectives = r.objectives + buckets = r.buckets + if opts != nil { + timerType = opts.TimerType + if opts.SummaryObjectives != nil { + objectives = opts.SummaryObjectives + } + if opts.HistogramBuckets != nil { + buckets = opts.HistogramBuckets + } + } + return +} + +func (r *reporter) summaryVec( + name string, + tagKeys []string, + desc string, + objectives map[float64]float64, +) (*prom.SummaryVec, error) { + id := canonicalMetricID(name, tagKeys) + + r.Lock() + defer r.Unlock() + + if s, ok := r.timers[id]; ok { + return s.summary, nil + } + + s := prom.NewSummaryVec( + prom.SummaryOpts{ + Name: name, + Help: desc, + Objectives: objectives, + }, + tagKeys, + ) + + if err := r.registerer.Register(s); err != nil { + return nil, err + } + + r.timers[id] = &promTimerVec{summary: s} + return s, nil +} + +func (r *reporter) histogramVec( + name string, + tagKeys []string, + desc string, + buckets []float64, +) (*prom.HistogramVec, error) { + id := canonicalMetricID(name, tagKeys) + + r.Lock() + defer r.Unlock() + + if h, ok := r.timers[id]; ok { + return h.histogram, nil + } + + h := prom.NewHistogramVec( + prom.HistogramOpts{ + Name: name, + Help: desc, + Buckets: buckets, + }, + tagKeys, + ) + + if err := r.registerer.Register(h); err != nil { + return nil, err + } + + r.timers[id] = &promTimerVec{histogram: h} + return h, nil +} + +// AllocateTimer implements tally.CachedStatsReporter. +func (r *reporter) AllocateTimer(name string, tags map[string]string) tally.CachedTimer { + var ( + timer tally.CachedTimer + err error + ) + tagKeys := keysFromMap(tags) + timerType, buckets, objectives := r.timerConfig(nil) + switch timerType { + case HistogramTimerType: + var histogramVec *prom.HistogramVec + histogramVec, err = r.histogramVec(name, tagKeys, name+" histogram", buckets) + if err == nil { + t := &cachedMetric{histogram: histogramVec.With(tags)} + t.reportTimer = t.reportTimerHistogram + timer = t + } + case SummaryTimerType: + var summaryVec *prom.SummaryVec + summaryVec, err = r.summaryVec(name, tagKeys, name+" summary", objectives) + if err == nil { + t := &cachedMetric{summary: summaryVec.With(tags)} + t.reportTimer = t.reportTimerSummary + timer = t + } + default: + err = errUnknownTimerType + } + if err != nil { + r.onRegisterError(err) + return noopMetric{} + } + return timer +} + +func (r *reporter) AllocateHistogram( + name string, + tags map[string]string, + buckets tally.Buckets, +) tally.CachedHistogram { + tagKeys := keysFromMap(tags) + histogramVec, err := r.histogramVec(name, tagKeys, name+" histogram", buckets.AsValues()) + if err != nil { + r.onRegisterError(err) + return noopMetric{} + } + return &cachedMetric{histogram: histogramVec.With(tags)} +} + +func (r *reporter) Capabilities() tally.Capabilities { + return r +} + +func (r *reporter) Reporting() bool { + return true +} + +func (r *reporter) Tagging() bool { + return true +} + +// Flush does nothing for prometheus +func (r *reporter) Flush() {} + +var metricIDKeyValue = "1" + +// NOTE: this generates a canonical MetricID for a given name+label keys, +// not values. This omits label values, as we track metrics as +// Vectors in order to support on-the-fly label changes. +func canonicalMetricID(name string, tagKeys []string) metricID { + keySet := make(map[string]string, len(tagKeys)) + for _, key := range tagKeys { + keySet[key] = metricIDKeyValue + } + return metricID(tally.KeyForPrefixedStringMap(name, keySet)) +} + +func keysFromMap(m map[string]string) []string { + labelKeys := make([]string, len(m)) + i := 0 + for k := range m { + labelKeys[i] = k + i++ + } + return labelKeys +} diff --git a/vendor/github.com/uber-go/tally/prometheus/sanitize.go b/vendor/github.com/uber-go/tally/prometheus/sanitize.go new file mode 100644 index 000000000..04ef0278f --- /dev/null +++ b/vendor/github.com/uber-go/tally/prometheus/sanitize.go @@ -0,0 +1,44 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package prometheus + +import ( + "github.com/uber-go/tally" +) + +var ( + // DefaultSanitizerOpts are the options for the default Prometheus sanitizer. + DefaultSanitizerOpts = tally.SanitizeOptions{ + NameCharacters: tally.ValidCharacters{ + Ranges: tally.AlphanumericRange, + Characters: tally.UnderscoreCharacters, + }, + KeyCharacters: tally.ValidCharacters{ + Ranges: tally.AlphanumericRange, + Characters: tally.UnderscoreCharacters, + }, + ValueCharacters: tally.ValidCharacters{ + Ranges: tally.AlphanumericRange, + Characters: tally.UnderscoreCharacters, + }, + ReplacementCharacter: tally.DefaultReplacementCharacter, + } +) diff --git a/vendor/github.com/uber-go/tally/reporter.go b/vendor/github.com/uber-go/tally/reporter.go new file mode 100644 index 000000000..2333bf3db --- /dev/null +++ b/vendor/github.com/uber-go/tally/reporter.go @@ -0,0 +1,140 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import "time" + +// BaseStatsReporter implements the shared reporter methods. +type BaseStatsReporter interface { + // Capabilities returns the capabilities description of the reporter. + Capabilities() Capabilities + + // Flush asks the reporter to flush all reported values. + Flush() +} + +// StatsReporter is a backend for Scopes to report metrics to. +type StatsReporter interface { + BaseStatsReporter + + // ReportCounter reports a counter value + ReportCounter( + name string, + tags map[string]string, + value int64, + ) + + // ReportGauge reports a gauge value + ReportGauge( + name string, + tags map[string]string, + value float64, + ) + + // ReportTimer reports a timer value + ReportTimer( + name string, + tags map[string]string, + interval time.Duration, + ) + + // ReportHistogramValueSamples reports histogram samples for a bucket + ReportHistogramValueSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound float64, + samples int64, + ) + + // ReportHistogramDurationSamples reports histogram samples for a bucket + ReportHistogramDurationSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound time.Duration, + samples int64, + ) +} + +// CachedStatsReporter is a backend for Scopes that pre allocates all +// counter, gauges, timers & histograms. This is harder to implement but more performant. +type CachedStatsReporter interface { + BaseStatsReporter + + // AllocateCounter pre allocates a counter data structure with name & tags. + AllocateCounter( + name string, + tags map[string]string, + ) CachedCount + + // AllocateGauge pre allocates a gauge data structure with name & tags. + AllocateGauge( + name string, + tags map[string]string, + ) CachedGauge + + // AllocateTimer pre allocates a timer data structure with name & tags. + AllocateTimer( + name string, + tags map[string]string, + ) CachedTimer + + // AllocateHistogram pre allocates a histogram data structure with name, tags, + // value buckets and duration buckets. + AllocateHistogram( + name string, + tags map[string]string, + buckets Buckets, + ) CachedHistogram +} + +// CachedCount interface for reporting an individual counter +type CachedCount interface { + ReportCount(value int64) +} + +// CachedGauge interface for reporting an individual gauge +type CachedGauge interface { + ReportGauge(value float64) +} + +// CachedTimer interface for reporting an individual timer +type CachedTimer interface { + ReportTimer(interval time.Duration) +} + +// CachedHistogram interface for reporting histogram samples to buckets +type CachedHistogram interface { + ValueBucket( + bucketLowerBound, bucketUpperBound float64, + ) CachedHistogramBucket + DurationBucket( + bucketLowerBound, bucketUpperBound time.Duration, + ) CachedHistogramBucket +} + +// CachedHistogramBucket interface for reporting histogram samples to a specific bucket +type CachedHistogramBucket interface { + ReportSamples(value int64) +} diff --git a/vendor/github.com/uber-go/tally/sanitize.go b/vendor/github.com/uber-go/tally/sanitize.go new file mode 100644 index 000000000..33d6a212c --- /dev/null +++ b/vendor/github.com/uber-go/tally/sanitize.go @@ -0,0 +1,176 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "bytes" +) + +var ( + // DefaultReplacementCharacter is the default character used for + // replacements. + DefaultReplacementCharacter = '_' + + // AlphanumericRange is the range of alphanumeric characters. + AlphanumericRange = []SanitizeRange{ + {rune('a'), rune('z')}, + {rune('A'), rune('Z')}, + {rune('0'), rune('9')}} + + // UnderscoreCharacters is just an underscore character. + UnderscoreCharacters = []rune{ + '_'} + + // UnderscoreDashCharacters is a slice of underscore, and + // dash characters. + UnderscoreDashCharacters = []rune{ + '-', + '_'} + + // UnderscoreDashDotCharacters is a slice of underscore, + // dash, and dot characters. + UnderscoreDashDotCharacters = []rune{ + '.', + '-', + '_'} +) + +// SanitizeFn returns a sanitized version of the input string. +type SanitizeFn func(string) string + +// SanitizeRange is a range of characters (inclusive on both ends). +type SanitizeRange [2]rune + +// ValidCharacters is a collection of valid characters. +type ValidCharacters struct { + Ranges []SanitizeRange + Characters []rune +} + +// SanitizeOptions are the set of configurable options for sanitisation. +type SanitizeOptions struct { + NameCharacters ValidCharacters + KeyCharacters ValidCharacters + ValueCharacters ValidCharacters + ReplacementCharacter rune +} + +// Sanitizer sanitizes the provided input based on the function executed. +type Sanitizer interface { + // Name sanitizes the provided `name` string. + Name(n string) string + + // Key sanitizes the provided `key` string. + Key(k string) string + + // Value sanitizes the provided `value` string. + Value(v string) string +} + +// NewSanitizer returns a new sanitizer based on provided options. +func NewSanitizer(opts SanitizeOptions) Sanitizer { + return sanitizer{ + nameFn: opts.NameCharacters.sanitizeFn(opts.ReplacementCharacter), + keyFn: opts.KeyCharacters.sanitizeFn(opts.ReplacementCharacter), + valueFn: opts.ValueCharacters.sanitizeFn(opts.ReplacementCharacter), + } +} + +// NoOpSanitizeFn returns the input un-touched. +func NoOpSanitizeFn(v string) string { return v } + +// NewNoOpSanitizer returns a sanitizer which returns all inputs un-touched. +func NewNoOpSanitizer() Sanitizer { + return sanitizer{ + nameFn: NoOpSanitizeFn, + keyFn: NoOpSanitizeFn, + valueFn: NoOpSanitizeFn, + } +} + +type sanitizer struct { + nameFn SanitizeFn + keyFn SanitizeFn + valueFn SanitizeFn +} + +func (s sanitizer) Name(n string) string { + return s.nameFn(n) +} + +func (s sanitizer) Key(k string) string { + return s.keyFn(k) +} + +func (s sanitizer) Value(v string) string { + return s.valueFn(v) +} + +func (c *ValidCharacters) sanitizeFn(repChar rune) SanitizeFn { + return func(value string) string { + var buf *bytes.Buffer + for idx, ch := range value { + // first check if the provided character is valid + validCurr := false + for i := 0; !validCurr && i < len(c.Ranges); i++ { + if ch >= c.Ranges[i][0] && ch <= c.Ranges[i][1] { + validCurr = true + break + } + } + for i := 0; !validCurr && i < len(c.Characters); i++ { + if c.Characters[i] == ch { + validCurr = true + break + } + } + + // if it's valid, we can optimise allocations by avoiding copying + if validCurr { + if buf == nil { + continue // haven't deviated from string, still no need to init buffer + } + buf.WriteRune(ch) // we've deviated from string, write to buffer + continue + } + + // ie the character is invalid, and the buffer has not been initialised + // so we initialise buffer and backfill + if buf == nil { + buf = bytes.NewBuffer(make([]byte, 0, len(value))) + if idx > 0 { + buf.WriteString(value[:idx]) + } + } + + // write the replacement character + buf.WriteRune(repChar) + } + + // return input un-touched if the buffer has been not initialised + if buf == nil { + return value + } + + // otherwise, return the newly constructed buffer + return buf.String() + } +} diff --git a/vendor/github.com/uber-go/tally/scope.go b/vendor/github.com/uber-go/tally/scope.go new file mode 100644 index 000000000..66f3aa1c3 --- /dev/null +++ b/vendor/github.com/uber-go/tally/scope.go @@ -0,0 +1,747 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "io" + "sync" + "time" +) + +const ( + _defaultInitialSliceSize = 16 +) + +var ( + // NoopScope is a scope that does nothing + NoopScope, _ = NewRootScope(ScopeOptions{Reporter: NullStatsReporter}, 0) + // DefaultSeparator is the default separator used to join nested scopes + DefaultSeparator = "." + + globalNow = time.Now + + defaultScopeBuckets = DurationBuckets{ + 0 * time.Millisecond, + 10 * time.Millisecond, + 25 * time.Millisecond, + 50 * time.Millisecond, + 75 * time.Millisecond, + 100 * time.Millisecond, + 200 * time.Millisecond, + 300 * time.Millisecond, + 400 * time.Millisecond, + 500 * time.Millisecond, + 600 * time.Millisecond, + 800 * time.Millisecond, + 1 * time.Second, + 2 * time.Second, + 5 * time.Second, + } +) + +type scope struct { + separator string + prefix string + tags map[string]string + reporter StatsReporter + cachedReporter CachedStatsReporter + baseReporter BaseStatsReporter + defaultBuckets Buckets + sanitizer Sanitizer + + registry *scopeRegistry + status scopeStatus + + cm sync.RWMutex + gm sync.RWMutex + tm sync.RWMutex + hm sync.RWMutex + + counters map[string]*counter + countersSlice []*counter + gauges map[string]*gauge + gaugesSlice []*gauge + histograms map[string]*histogram + histogramsSlice []*histogram + timers map[string]*timer + // nb: deliberately skipping timersSlice as we report timers immediately, + // no buffering is involved. +} + +type scopeStatus struct { + sync.RWMutex + closed bool + quit chan struct{} +} + +// ScopeOptions is a set of options to construct a scope. +type ScopeOptions struct { + Tags map[string]string + Prefix string + Reporter StatsReporter + CachedReporter CachedStatsReporter + Separator string + DefaultBuckets Buckets + SanitizeOptions *SanitizeOptions +} + +// NewRootScope creates a new root Scope with a set of options and +// a reporting interval. +// Must provide either a StatsReporter or a CachedStatsReporter. +func NewRootScope(opts ScopeOptions, interval time.Duration) (Scope, io.Closer) { + s := newRootScope(opts, interval) + return s, s +} + +// NewTestScope creates a new Scope without a stats reporter with the +// given prefix and adds the ability to take snapshots of metrics emitted +// to it. +func NewTestScope( + prefix string, + tags map[string]string, +) TestScope { + return newRootScope(ScopeOptions{Prefix: prefix, Tags: tags}, 0) +} + +func newRootScope(opts ScopeOptions, interval time.Duration) *scope { + sanitizer := NewNoOpSanitizer() + if o := opts.SanitizeOptions; o != nil { + sanitizer = NewSanitizer(*o) + } + + if opts.Tags == nil { + opts.Tags = make(map[string]string) + } + if opts.Separator == "" { + opts.Separator = DefaultSeparator + } + + var baseReporter BaseStatsReporter + if opts.Reporter != nil { + baseReporter = opts.Reporter + } else if opts.CachedReporter != nil { + baseReporter = opts.CachedReporter + } + + if opts.DefaultBuckets == nil || opts.DefaultBuckets.Len() < 1 { + opts.DefaultBuckets = defaultScopeBuckets + } + + s := &scope{ + separator: sanitizer.Name(opts.Separator), + prefix: sanitizer.Name(opts.Prefix), + reporter: opts.Reporter, + cachedReporter: opts.CachedReporter, + baseReporter: baseReporter, + defaultBuckets: opts.DefaultBuckets, + sanitizer: sanitizer, + status: scopeStatus{ + closed: false, + quit: make(chan struct{}, 1), + }, + + counters: make(map[string]*counter), + countersSlice: make([]*counter, 0, _defaultInitialSliceSize), + gauges: make(map[string]*gauge), + gaugesSlice: make([]*gauge, 0, _defaultInitialSliceSize), + histograms: make(map[string]*histogram), + histogramsSlice: make([]*histogram, 0, _defaultInitialSliceSize), + timers: make(map[string]*timer), + } + + // NB(r): Take a copy of the tags on creation + // so that it cannot be modified after set. + s.tags = s.copyAndSanitizeMap(opts.Tags) + + // Register the root scope + s.registry = newScopeRegistry(s) + + if interval > 0 { + go s.reportLoop(interval) + } + + return s +} + +// report dumps all aggregated stats into the reporter. Should be called automatically by the root scope periodically. +func (s *scope) report(r StatsReporter) { + s.cm.RLock() + for name, counter := range s.counters { + counter.report(s.fullyQualifiedName(name), s.tags, r) + } + s.cm.RUnlock() + + s.gm.RLock() + for name, gauge := range s.gauges { + gauge.report(s.fullyQualifiedName(name), s.tags, r) + } + s.gm.RUnlock() + + // we do nothing for timers here because timers report directly to ths StatsReporter without buffering + + s.hm.RLock() + for name, histogram := range s.histograms { + histogram.report(s.fullyQualifiedName(name), s.tags, r) + } + s.hm.RUnlock() +} + +func (s *scope) cachedReport() { + s.cm.RLock() + for _, counter := range s.countersSlice { + counter.cachedReport() + } + s.cm.RUnlock() + + s.gm.RLock() + for _, gauge := range s.gaugesSlice { + gauge.cachedReport() + } + s.gm.RUnlock() + + // we do nothing for timers here because timers report directly to ths StatsReporter without buffering + + s.hm.RLock() + for _, histogram := range s.histogramsSlice { + histogram.cachedReport() + } + s.hm.RUnlock() +} + +// reportLoop is used by the root scope for periodic reporting +func (s *scope) reportLoop(interval time.Duration) { + ticker := time.NewTicker(interval) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + s.reportLoopRun() + case <-s.status.quit: + return + } + } +} + +func (s *scope) reportLoopRun() { + // Need to hold a status lock to ensure not to report + // and flush after a close + s.status.RLock() + defer s.status.RUnlock() + + if s.status.closed { + return + } + + s.reportRegistryWithLock() +} + +// reports current registry with scope status lock held +func (s *scope) reportRegistryWithLock() { + if s.reporter != nil { + s.registry.Report(s.reporter) + s.reporter.Flush() + } else if s.cachedReporter != nil { + s.registry.CachedReport() + s.cachedReporter.Flush() + } +} + +func (s *scope) Counter(name string) Counter { + name = s.sanitizer.Name(name) + if c, ok := s.counter(name); ok { + return c + } + + s.cm.Lock() + defer s.cm.Unlock() + + if c, ok := s.counters[name]; ok { + return c + } + + var cachedCounter CachedCount + if s.cachedReporter != nil { + cachedCounter = s.cachedReporter.AllocateCounter( + s.fullyQualifiedName(name), + s.tags, + ) + } + + c := newCounter(cachedCounter) + s.counters[name] = c + s.countersSlice = append(s.countersSlice, c) + + return c +} + +func (s *scope) counter(sanitizedName string) (Counter, bool) { + s.cm.RLock() + defer s.cm.RUnlock() + + c, ok := s.counters[sanitizedName] + return c, ok +} + +func (s *scope) Gauge(name string) Gauge { + name = s.sanitizer.Name(name) + if g, ok := s.gauge(name); ok { + return g + } + + s.gm.Lock() + defer s.gm.Unlock() + + if g, ok := s.gauges[name]; ok { + return g + } + + var cachedGauge CachedGauge + if s.cachedReporter != nil { + cachedGauge = s.cachedReporter.AllocateGauge( + s.fullyQualifiedName(name), s.tags, + ) + } + + g := newGauge(cachedGauge) + s.gauges[name] = g + s.gaugesSlice = append(s.gaugesSlice, g) + + return g +} + +func (s *scope) gauge(name string) (Gauge, bool) { + s.gm.RLock() + defer s.gm.RUnlock() + + g, ok := s.gauges[name] + return g, ok +} + +func (s *scope) Timer(name string) Timer { + name = s.sanitizer.Name(name) + if t, ok := s.timer(name); ok { + return t + } + + s.tm.Lock() + defer s.tm.Unlock() + + if t, ok := s.timers[name]; ok { + return t + } + + var cachedTimer CachedTimer + if s.cachedReporter != nil { + cachedTimer = s.cachedReporter.AllocateTimer( + s.fullyQualifiedName(name), s.tags, + ) + } + + t := newTimer( + s.fullyQualifiedName(name), s.tags, s.reporter, cachedTimer, + ) + s.timers[name] = t + + return t +} + +func (s *scope) timer(sanitizedName string) (Timer, bool) { + s.tm.RLock() + defer s.tm.RUnlock() + + t, ok := s.timers[sanitizedName] + return t, ok +} + +func (s *scope) Histogram(name string, b Buckets) Histogram { + name = s.sanitizer.Name(name) + if h, ok := s.histogram(name); ok { + return h + } + + if b == nil { + b = s.defaultBuckets + } + + s.hm.Lock() + defer s.hm.Unlock() + + if h, ok := s.histograms[name]; ok { + return h + } + + var cachedHistogram CachedHistogram + if s.cachedReporter != nil { + cachedHistogram = s.cachedReporter.AllocateHistogram( + s.fullyQualifiedName(name), s.tags, b, + ) + } + + h := newHistogram( + s.fullyQualifiedName(name), s.tags, s.reporter, b, cachedHistogram, + ) + s.histograms[name] = h + s.histogramsSlice = append(s.histogramsSlice, h) + + return h +} + +func (s *scope) histogram(sanitizedName string) (Histogram, bool) { + s.hm.RLock() + defer s.hm.RUnlock() + + h, ok := s.histograms[sanitizedName] + return h, ok +} + +func (s *scope) Tagged(tags map[string]string) Scope { + tags = s.copyAndSanitizeMap(tags) + return s.subscope(s.prefix, tags) +} + +func (s *scope) SubScope(prefix string) Scope { + prefix = s.sanitizer.Name(prefix) + return s.subscope(s.fullyQualifiedName(prefix), nil) +} + +func (s *scope) subscope(prefix string, tags map[string]string) Scope { + return s.registry.Subscope(s, prefix, tags) +} + +func (s *scope) Capabilities() Capabilities { + if s.baseReporter == nil { + return capabilitiesNone + } + return s.baseReporter.Capabilities() +} + +func (s *scope) Snapshot() Snapshot { + snap := newSnapshot() + + s.registry.ForEachScope(func(ss *scope) { + // NB(r): tags are immutable, no lock required to read. + tags := make(map[string]string, len(s.tags)) + for k, v := range ss.tags { + tags[k] = v + } + + ss.cm.RLock() + for key, c := range ss.counters { + name := ss.fullyQualifiedName(key) + id := KeyForPrefixedStringMap(name, tags) + snap.counters[id] = &counterSnapshot{ + name: name, + tags: tags, + value: c.snapshot(), + } + } + ss.cm.RUnlock() + ss.gm.RLock() + for key, g := range ss.gauges { + name := ss.fullyQualifiedName(key) + id := KeyForPrefixedStringMap(name, tags) + snap.gauges[id] = &gaugeSnapshot{ + name: name, + tags: tags, + value: g.snapshot(), + } + } + ss.gm.RUnlock() + ss.tm.RLock() + for key, t := range ss.timers { + name := ss.fullyQualifiedName(key) + id := KeyForPrefixedStringMap(name, tags) + snap.timers[id] = &timerSnapshot{ + name: name, + tags: tags, + values: t.snapshot(), + } + } + ss.tm.RUnlock() + ss.hm.RLock() + for key, h := range ss.histograms { + name := ss.fullyQualifiedName(key) + id := KeyForPrefixedStringMap(name, tags) + snap.histograms[id] = &histogramSnapshot{ + name: name, + tags: tags, + values: h.snapshotValues(), + durations: h.snapshotDurations(), + } + } + ss.hm.RUnlock() + }) + + return snap +} + +func (s *scope) Close() error { + s.status.Lock() + defer s.status.Unlock() + + // don't wait to close more than once (panic on double close of + // s.status.quit) + if s.status.closed { + return nil + } + + s.status.closed = true + close(s.status.quit) + s.reportRegistryWithLock() + + if closer, ok := s.baseReporter.(io.Closer); ok { + return closer.Close() + } + return nil +} + +// NB(prateek): We assume concatenation of sanitized inputs is +// sanitized. If that stops being true, then we need to sanitize the +// output of this function. +func (s *scope) fullyQualifiedName(name string) string { + if len(s.prefix) == 0 { + return name + } + // NB: we don't need to sanitize the output of this function as we + // sanitize all the the inputs (prefix, separator, name); and the + // output we're creating is a concatenation of the sanitized inputs. + // If we change the concatenation to involve other inputs or characters, + // we'll need to sanitize them too. + return s.prefix + s.separator + name +} + +func (s *scope) copyAndSanitizeMap(tags map[string]string) map[string]string { + result := make(map[string]string, len(tags)) + for k, v := range tags { + k = s.sanitizer.Key(k) + v = s.sanitizer.Value(v) + result[k] = v + } + return result +} + +// TestScope is a metrics collector that has no reporting, ensuring that +// all emitted values have a given prefix or set of tags +type TestScope interface { + Scope + + // Snapshot returns a copy of all values since the last report execution, + // this is an expensive operation and should only be use for testing purposes + Snapshot() Snapshot +} + +// Snapshot is a snapshot of values since last report execution +type Snapshot interface { + // Counters returns a snapshot of all counter summations since last report execution + Counters() map[string]CounterSnapshot + + // Gauges returns a snapshot of gauge last values since last report execution + Gauges() map[string]GaugeSnapshot + + // Timers returns a snapshot of timer values since last report execution + Timers() map[string]TimerSnapshot + + // Histograms returns a snapshot of histogram samples since last report execution + Histograms() map[string]HistogramSnapshot +} + +// CounterSnapshot is a snapshot of a counter +type CounterSnapshot interface { + // Name returns the name + Name() string + + // Tags returns the tags + Tags() map[string]string + + // Value returns the value + Value() int64 +} + +// GaugeSnapshot is a snapshot of a gauge +type GaugeSnapshot interface { + // Name returns the name + Name() string + + // Tags returns the tags + Tags() map[string]string + + // Value returns the value + Value() float64 +} + +// TimerSnapshot is a snapshot of a timer +type TimerSnapshot interface { + // Name returns the name + Name() string + + // Tags returns the tags + Tags() map[string]string + + // Values returns the values + Values() []time.Duration +} + +// HistogramSnapshot is a snapshot of a histogram +type HistogramSnapshot interface { + // Name returns the name + Name() string + + // Tags returns the tags + Tags() map[string]string + + // Values returns the sample values by upper bound for a valueHistogram + Values() map[float64]int64 + + // Durations returns the sample values by upper bound for a durationHistogram + Durations() map[time.Duration]int64 +} + +// mergeRightTags merges 2 sets of tags with the tags from tagsRight overriding values from tagsLeft +func mergeRightTags(tagsLeft, tagsRight map[string]string) map[string]string { + if tagsLeft == nil && tagsRight == nil { + return nil + } + if len(tagsRight) == 0 { + return tagsLeft + } + if len(tagsLeft) == 0 { + return tagsRight + } + + result := make(map[string]string, len(tagsLeft)+len(tagsRight)) + for k, v := range tagsLeft { + result[k] = v + } + for k, v := range tagsRight { + result[k] = v + } + return result +} + +type snapshot struct { + counters map[string]CounterSnapshot + gauges map[string]GaugeSnapshot + timers map[string]TimerSnapshot + histograms map[string]HistogramSnapshot +} + +func newSnapshot() *snapshot { + return &snapshot{ + counters: make(map[string]CounterSnapshot), + gauges: make(map[string]GaugeSnapshot), + timers: make(map[string]TimerSnapshot), + histograms: make(map[string]HistogramSnapshot), + } +} + +func (s *snapshot) Counters() map[string]CounterSnapshot { + return s.counters +} + +func (s *snapshot) Gauges() map[string]GaugeSnapshot { + return s.gauges +} + +func (s *snapshot) Timers() map[string]TimerSnapshot { + return s.timers +} + +func (s *snapshot) Histograms() map[string]HistogramSnapshot { + return s.histograms +} + +type counterSnapshot struct { + name string + tags map[string]string + value int64 +} + +func (s *counterSnapshot) Name() string { + return s.name +} + +func (s *counterSnapshot) Tags() map[string]string { + return s.tags +} + +func (s *counterSnapshot) Value() int64 { + return s.value +} + +type gaugeSnapshot struct { + name string + tags map[string]string + value float64 +} + +func (s *gaugeSnapshot) Name() string { + return s.name +} + +func (s *gaugeSnapshot) Tags() map[string]string { + return s.tags +} + +func (s *gaugeSnapshot) Value() float64 { + return s.value +} + +type timerSnapshot struct { + name string + tags map[string]string + values []time.Duration +} + +func (s *timerSnapshot) Name() string { + return s.name +} + +func (s *timerSnapshot) Tags() map[string]string { + return s.tags +} + +func (s *timerSnapshot) Values() []time.Duration { + return s.values +} + +type histogramSnapshot struct { + name string + tags map[string]string + values map[float64]int64 + durations map[time.Duration]int64 +} + +func (s *histogramSnapshot) Name() string { + return s.name +} + +func (s *histogramSnapshot) Tags() map[string]string { + return s.tags +} + +func (s *histogramSnapshot) Values() map[float64]int64 { + return s.values +} + +func (s *histogramSnapshot) Durations() map[time.Duration]int64 { + return s.durations +} diff --git a/vendor/github.com/uber-go/tally/scope_registry.go b/vendor/github.com/uber-go/tally/scope_registry.go new file mode 100644 index 000000000..6ed5eb4fd --- /dev/null +++ b/vendor/github.com/uber-go/tally/scope_registry.go @@ -0,0 +1,113 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import "sync" + +var scopeRegistryKey = keyForPrefixedStringMaps + +type scopeRegistry struct { + mu sync.RWMutex + subscopes map[string]*scope +} + +func newScopeRegistry(root *scope) *scopeRegistry { + r := &scopeRegistry{ + subscopes: make(map[string]*scope), + } + r.subscopes[scopeRegistryKey(root.prefix, root.tags)] = root + return r +} + +func (r *scopeRegistry) Report(reporter StatsReporter) { + r.mu.RLock() + defer r.mu.RUnlock() + + for _, s := range r.subscopes { + s.report(reporter) + } +} + +func (r *scopeRegistry) CachedReport() { + r.mu.RLock() + defer r.mu.RUnlock() + + for _, s := range r.subscopes { + s.cachedReport() + } +} + +func (r *scopeRegistry) ForEachScope(f func(*scope)) { + r.mu.RLock() + defer r.mu.RUnlock() + + for _, s := range r.subscopes { + f(s) + } +} + +func (r *scopeRegistry) Subscope(parent *scope, prefix string, tags map[string]string) *scope { + key := scopeRegistryKey(prefix, parent.tags, tags) + + r.mu.RLock() + if s, ok := r.lockedLookup(key); ok { + r.mu.RUnlock() + return s + } + r.mu.RUnlock() + + r.mu.Lock() + defer r.mu.Unlock() + + if s, ok := r.lockedLookup(key); ok { + return s + } + + allTags := mergeRightTags(parent.tags, tags) + subscope := &scope{ + separator: parent.separator, + prefix: prefix, + // NB(prateek): don't need to copy the tags here, + // we assume the map provided is immutable. + tags: allTags, + reporter: parent.reporter, + cachedReporter: parent.cachedReporter, + baseReporter: parent.baseReporter, + defaultBuckets: parent.defaultBuckets, + sanitizer: parent.sanitizer, + registry: parent.registry, + + counters: make(map[string]*counter), + countersSlice: make([]*counter, 0, _defaultInitialSliceSize), + gauges: make(map[string]*gauge), + gaugesSlice: make([]*gauge, 0, _defaultInitialSliceSize), + histograms: make(map[string]*histogram), + histogramsSlice: make([]*histogram, 0, _defaultInitialSliceSize), + timers: make(map[string]*timer), + } + r.subscopes[key] = subscope + return subscope +} + +func (r *scopeRegistry) lockedLookup(key string) (*scope, bool) { + ss, ok := r.subscopes[key] + return ss, ok +} diff --git a/vendor/github.com/uber-go/tally/stats.go b/vendor/github.com/uber-go/tally/stats.go new file mode 100644 index 000000000..01809c5ef --- /dev/null +++ b/vendor/github.com/uber-go/tally/stats.go @@ -0,0 +1,475 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "math" + "sort" + "sync" + "sync/atomic" + "time" +) + +var ( + capabilitiesNone = &capabilities{ + reporting: false, + tagging: false, + } + capabilitiesReportingNoTagging = &capabilities{ + reporting: true, + tagging: false, + } + capabilitiesReportingTagging = &capabilities{ + reporting: true, + tagging: true, + } +) + +type capabilities struct { + reporting bool + tagging bool +} + +func (c *capabilities) Reporting() bool { + return c.reporting +} + +func (c *capabilities) Tagging() bool { + return c.tagging +} + +type counter struct { + prev int64 + curr int64 + cachedCount CachedCount +} + +func newCounter(cachedCount CachedCount) *counter { + return &counter{cachedCount: cachedCount} +} + +func (c *counter) Inc(v int64) { + atomic.AddInt64(&c.curr, v) +} + +func (c *counter) value() int64 { + curr := atomic.LoadInt64(&c.curr) + + prev := atomic.LoadInt64(&c.prev) + if prev == curr { + return 0 + } + atomic.StoreInt64(&c.prev, curr) + return curr - prev +} + +func (c *counter) report(name string, tags map[string]string, r StatsReporter) { + delta := c.value() + if delta == 0 { + return + } + + r.ReportCounter(name, tags, delta) +} + +func (c *counter) cachedReport() { + delta := c.value() + if delta == 0 { + return + } + + c.cachedCount.ReportCount(delta) +} + +func (c *counter) snapshot() int64 { + return atomic.LoadInt64(&c.curr) - atomic.LoadInt64(&c.prev) +} + +type gauge struct { + updated uint64 + curr uint64 + cachedGauge CachedGauge +} + +func newGauge(cachedGauge CachedGauge) *gauge { + return &gauge{cachedGauge: cachedGauge} +} + +func (g *gauge) Update(v float64) { + atomic.StoreUint64(&g.curr, math.Float64bits(v)) + atomic.StoreUint64(&g.updated, 1) +} + +func (g *gauge) value() float64 { + return math.Float64frombits(atomic.LoadUint64(&g.curr)) +} + +func (g *gauge) report(name string, tags map[string]string, r StatsReporter) { + if atomic.SwapUint64(&g.updated, 0) == 1 { + r.ReportGauge(name, tags, g.value()) + } +} + +func (g *gauge) cachedReport() { + if atomic.SwapUint64(&g.updated, 0) == 1 { + g.cachedGauge.ReportGauge(g.value()) + } +} + +func (g *gauge) snapshot() float64 { + return math.Float64frombits(atomic.LoadUint64(&g.curr)) +} + +// NB(jra3): timers are a little special because they do no aggregate any data +// at the timer level. The reporter buffers may timer entries and periodically +// flushes. +type timer struct { + name string + tags map[string]string + reporter StatsReporter + cachedTimer CachedTimer + unreported timerValues +} + +type timerValues struct { + sync.RWMutex + values []time.Duration +} + +func newTimer( + name string, + tags map[string]string, + r StatsReporter, + cachedTimer CachedTimer, +) *timer { + t := &timer{ + name: name, + tags: tags, + reporter: r, + cachedTimer: cachedTimer, + } + if r == nil { + t.reporter = &timerNoReporterSink{timer: t} + } + return t +} + +func (t *timer) Record(interval time.Duration) { + if t.cachedTimer != nil { + t.cachedTimer.ReportTimer(interval) + } else { + t.reporter.ReportTimer(t.name, t.tags, interval) + } +} + +func (t *timer) Start() Stopwatch { + return NewStopwatch(globalNow(), t) +} + +func (t *timer) RecordStopwatch(stopwatchStart time.Time) { + d := globalNow().Sub(stopwatchStart) + t.Record(d) +} + +func (t *timer) snapshot() []time.Duration { + t.unreported.RLock() + snap := make([]time.Duration, len(t.unreported.values)) + for i := range t.unreported.values { + snap[i] = t.unreported.values[i] + } + t.unreported.RUnlock() + return snap +} + +type timerNoReporterSink struct { + sync.RWMutex + timer *timer +} + +func (r *timerNoReporterSink) ReportCounter( + name string, + tags map[string]string, + value int64, +) { +} + +func (r *timerNoReporterSink) ReportGauge( + name string, + tags map[string]string, + value float64, +) { +} + +func (r *timerNoReporterSink) ReportTimer( + name string, + tags map[string]string, + interval time.Duration, +) { + r.timer.unreported.Lock() + r.timer.unreported.values = append(r.timer.unreported.values, interval) + r.timer.unreported.Unlock() +} + +func (r *timerNoReporterSink) ReportHistogramValueSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound float64, + samples int64, +) { +} + +func (r *timerNoReporterSink) ReportHistogramDurationSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound time.Duration, + samples int64, +) { +} + +func (r *timerNoReporterSink) Capabilities() Capabilities { + return capabilitiesReportingTagging +} + +func (r *timerNoReporterSink) Flush() { +} + +type histogram struct { + htype histogramType + name string + tags map[string]string + reporter StatsReporter + specification Buckets + buckets []histogramBucket + lookupByValue []float64 + lookupByDuration []int +} + +type histogramType int + +const ( + valueHistogramType histogramType = iota + durationHistogramType +) + +func newHistogram( + name string, + tags map[string]string, + reporter StatsReporter, + buckets Buckets, + cachedHistogram CachedHistogram, +) *histogram { + htype := valueHistogramType + if _, ok := buckets.(DurationBuckets); ok { + htype = durationHistogramType + } + + pairs := BucketPairs(buckets) + + h := &histogram{ + htype: htype, + name: name, + tags: tags, + reporter: reporter, + specification: buckets, + buckets: make([]histogramBucket, 0, len(pairs)), + lookupByValue: make([]float64, 0, len(pairs)), + lookupByDuration: make([]int, 0, len(pairs)), + } + + for _, pair := range pairs { + h.addBucket(newHistogramBucket(h, + pair.LowerBoundValue(), pair.UpperBoundValue(), + pair.LowerBoundDuration(), pair.UpperBoundDuration(), + cachedHistogram)) + } + + return h +} + +func (h *histogram) addBucket(b histogramBucket) { + h.buckets = append(h.buckets, b) + h.lookupByValue = append(h.lookupByValue, b.valueUpperBound) + h.lookupByDuration = append(h.lookupByDuration, int(b.durationUpperBound)) +} + +func (h *histogram) report(name string, tags map[string]string, r StatsReporter) { + for i := range h.buckets { + samples := h.buckets[i].samples.value() + if samples == 0 { + continue + } + switch h.htype { + case valueHistogramType: + r.ReportHistogramValueSamples(name, tags, h.specification, + h.buckets[i].valueLowerBound, h.buckets[i].valueUpperBound, + samples) + case durationHistogramType: + r.ReportHistogramDurationSamples(name, tags, h.specification, + h.buckets[i].durationLowerBound, h.buckets[i].durationUpperBound, + samples) + } + } +} + +func (h *histogram) cachedReport() { + for i := range h.buckets { + samples := h.buckets[i].samples.value() + if samples == 0 { + continue + } + switch h.htype { + case valueHistogramType: + h.buckets[i].cachedValueBucket.ReportSamples(samples) + case durationHistogramType: + h.buckets[i].cachedDurationBucket.ReportSamples(samples) + } + } +} + +func (h *histogram) RecordValue(value float64) { + // Find the highest inclusive of the bucket upper bound + // and emit directly to it. Since we use BucketPairs to derive + // buckets there will always be an inclusive bucket as + // we always have a math.MaxFloat64 bucket. + idx := sort.SearchFloat64s(h.lookupByValue, value) + h.buckets[idx].samples.Inc(1) +} + +func (h *histogram) RecordDuration(value time.Duration) { + // Find the highest inclusive of the bucket upper bound + // and emit directly to it. Since we use BucketPairs to derive + // buckets there will always be an inclusive bucket as + // we always have a math.MaxInt64 bucket. + idx := sort.SearchInts(h.lookupByDuration, int(value)) + h.buckets[idx].samples.Inc(1) +} + +func (h *histogram) Start() Stopwatch { + return NewStopwatch(globalNow(), h) +} + +func (h *histogram) RecordStopwatch(stopwatchStart time.Time) { + d := globalNow().Sub(stopwatchStart) + h.RecordDuration(d) +} + +func (h *histogram) snapshotValues() map[float64]int64 { + if h.htype == durationHistogramType { + return nil + } + + vals := make(map[float64]int64, len(h.buckets)) + for i := range h.buckets { + vals[h.buckets[i].valueUpperBound] = h.buckets[i].samples.value() + } + + return vals +} + +func (h *histogram) snapshotDurations() map[time.Duration]int64 { + if h.htype == valueHistogramType { + return nil + } + + durations := make(map[time.Duration]int64, len(h.buckets)) + for i := range h.buckets { + durations[h.buckets[i].durationUpperBound] = h.buckets[i].samples.value() + } + + return durations +} + +type histogramBucket struct { + h *histogram + samples *counter + valueLowerBound float64 + valueUpperBound float64 + durationLowerBound time.Duration + durationUpperBound time.Duration + cachedValueBucket CachedHistogramBucket + cachedDurationBucket CachedHistogramBucket +} + +func newHistogramBucket( + h *histogram, + valueLowerBound, + valueUpperBound float64, + durationLowerBound, + durationUpperBound time.Duration, + cachedHistogram CachedHistogram, +) histogramBucket { + bucket := histogramBucket{ + samples: newCounter(nil), + valueLowerBound: valueLowerBound, + valueUpperBound: valueUpperBound, + durationLowerBound: durationLowerBound, + durationUpperBound: durationUpperBound, + } + if cachedHistogram != nil { + bucket.cachedValueBucket = cachedHistogram.ValueBucket( + bucket.valueLowerBound, bucket.valueUpperBound, + ) + bucket.cachedDurationBucket = cachedHistogram.DurationBucket( + bucket.durationLowerBound, bucket.durationUpperBound, + ) + } + return bucket +} + +// NullStatsReporter is an implementation of StatsReporter than simply does nothing. +var NullStatsReporter StatsReporter = nullStatsReporter{} + +func (r nullStatsReporter) ReportCounter(name string, tags map[string]string, value int64) { +} +func (r nullStatsReporter) ReportGauge(name string, tags map[string]string, value float64) { +} +func (r nullStatsReporter) ReportTimer(name string, tags map[string]string, interval time.Duration) { +} +func (r nullStatsReporter) ReportHistogramValueSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound float64, + samples int64, +) { +} + +func (r nullStatsReporter) ReportHistogramDurationSamples( + name string, + tags map[string]string, + buckets Buckets, + bucketLowerBound, + bucketUpperBound time.Duration, + samples int64, +) { +} +func (r nullStatsReporter) Capabilities() Capabilities { + return capabilitiesNone +} +func (r nullStatsReporter) Flush() { +} + +type nullStatsReporter struct{} diff --git a/vendor/github.com/uber-go/tally/types.go b/vendor/github.com/uber-go/tally/types.go new file mode 100644 index 000000000..76d3749e2 --- /dev/null +++ b/vendor/github.com/uber-go/tally/types.go @@ -0,0 +1,157 @@ +// Copyright (c) 2020 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package tally + +import ( + "fmt" + "sort" + "time" +) + +// Scope is a namespace wrapper around a stats reporter, ensuring that +// all emitted values have a given prefix or set of tags. +// +// IMPORTANT: When using Prometheus reporters, users must take care to +// not create metrics from both parent scopes and subscopes +// that have the same metric name but different tag keys, +// as metric allocation will panic. +type Scope interface { + // Counter returns the Counter object corresponding to the name. + Counter(name string) Counter + + // Gauge returns the Gauge object corresponding to the name. + Gauge(name string) Gauge + + // Timer returns the Timer object corresponding to the name. + Timer(name string) Timer + + // Histogram returns the Histogram object corresponding to the name. + // To use default value and duration buckets configured for the scope + // simply pass tally.DefaultBuckets or nil. + // You can use tally.ValueBuckets{x, y, ...} for value buckets. + // You can use tally.DurationBuckets{x, y, ...} for duration buckets. + // You can use tally.MustMakeLinearValueBuckets(start, width, count) for linear values. + // You can use tally.MustMakeLinearDurationBuckets(start, width, count) for linear durations. + // You can use tally.MustMakeExponentialValueBuckets(start, factor, count) for exponential values. + // You can use tally.MustMakeExponentialDurationBuckets(start, factor, count) for exponential durations. + Histogram(name string, buckets Buckets) Histogram + + // Tagged returns a new child scope with the given tags and current tags. + Tagged(tags map[string]string) Scope + + // SubScope returns a new child scope appending a further name prefix. + SubScope(name string) Scope + + // Capabilities returns a description of metrics reporting capabilities. + Capabilities() Capabilities +} + +// Counter is the interface for emitting counter type metrics. +type Counter interface { + // Inc increments the counter by a delta. + Inc(delta int64) +} + +// Gauge is the interface for emitting gauge metrics. +type Gauge interface { + // Update sets the gauges absolute value. + Update(value float64) +} + +// Timer is the interface for emitting timer metrics. +type Timer interface { + // Record a specific duration directly. + Record(value time.Duration) + + // Start gives you back a specific point in time to report via Stop. + Start() Stopwatch +} + +// Histogram is the interface for emitting histogram metrics +type Histogram interface { + // RecordValue records a specific value directly. + // Will use the configured value buckets for the histogram. + RecordValue(value float64) + + // RecordDuration records a specific duration directly. + // Will use the configured duration buckets for the histogram. + RecordDuration(value time.Duration) + + // Start gives you a specific point in time to then record a duration. + // Will use the configured duration buckets for the histogram. + Start() Stopwatch +} + +// Stopwatch is a helper for simpler tracking of elapsed time, use the +// Stop() method to report time elapsed since its created back to the +// timer or histogram. +type Stopwatch struct { + start time.Time + recorder StopwatchRecorder +} + +// NewStopwatch creates a new immutable stopwatch for recording the start +// time to a stopwatch reporter. +func NewStopwatch(start time.Time, r StopwatchRecorder) Stopwatch { + return Stopwatch{start: start, recorder: r} +} + +// Stop reports time elapsed since the stopwatch start to the recorder. +func (sw Stopwatch) Stop() { + sw.recorder.RecordStopwatch(sw.start) +} + +// StopwatchRecorder is a recorder that is called when a stopwatch is +// stopped with Stop(). +type StopwatchRecorder interface { + RecordStopwatch(stopwatchStart time.Time) +} + +// Buckets is an interface that can represent a set of buckets +// either as float64s or as durations. +type Buckets interface { + fmt.Stringer + sort.Interface + + // AsValues returns a representation of the buckets as float64s + AsValues() []float64 + + // AsDurations returns a representation of the buckets as time.Durations + AsDurations() []time.Duration +} + +// BucketPair describes the lower and upper bounds +// for a derived bucket from a buckets set. +type BucketPair interface { + LowerBoundValue() float64 + UpperBoundValue() float64 + LowerBoundDuration() time.Duration + UpperBoundDuration() time.Duration +} + +// Capabilities is a description of metrics reporting capabilities. +type Capabilities interface { + // Reporting returns whether the reporter has the ability to actively report. + Reporting() bool + + // Tagging returns whether the reporter has the capability for tagged metrics. + Tagging() bool +} diff --git a/vendor/go.opencensus.io/.gitignore b/vendor/go.opencensus.io/.gitignore deleted file mode 100644 index 74a6db472..000000000 --- a/vendor/go.opencensus.io/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -/.idea/ - -# go.opencensus.io/exporter/aws -/exporter/aws/ - -# Exclude vendor, use dep ensure after checkout: -/vendor/github.com/ -/vendor/golang.org/ -/vendor/google.golang.org/ diff --git a/vendor/go.opencensus.io/.travis.yml b/vendor/go.opencensus.io/.travis.yml deleted file mode 100644 index bd6b66ee8..000000000 --- a/vendor/go.opencensus.io/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -language: go - -go_import_path: go.opencensus.io - -go: - - 1.11.x - -env: - global: - GO111MODULE=on - -before_script: - - make install-tools - -script: - - make travis-ci - - go run internal/check/version.go # TODO move this to makefile diff --git a/vendor/go.opencensus.io/AUTHORS b/vendor/go.opencensus.io/AUTHORS deleted file mode 100644 index e491a9e7f..000000000 --- a/vendor/go.opencensus.io/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Google Inc. diff --git a/vendor/go.opencensus.io/CONTRIBUTING.md b/vendor/go.opencensus.io/CONTRIBUTING.md deleted file mode 100644 index 1ba3962c8..000000000 --- a/vendor/go.opencensus.io/CONTRIBUTING.md +++ /dev/null @@ -1,63 +0,0 @@ -# How to contribute - -We'd love to accept your patches and contributions to this project. There are -just a few small guidelines you need to follow. - -## Contributor License Agreement - -Contributions to this project must be accompanied by a Contributor License -Agreement. You (or your employer) retain the copyright to your contribution, -this simply gives us permission to use and redistribute your contributions as -part of the project. Head over to to see -your current agreements on file or to sign a new one. - -You generally only need to submit a CLA once, so if you've already submitted one -(even if it was for a different project), you probably don't need to do it -again. - -## Code reviews - -All submissions, including submissions by project members, require review. We -use GitHub pull requests for this purpose. Consult [GitHub Help] for more -information on using pull requests. - -[GitHub Help]: https://help.github.com/articles/about-pull-requests/ - -## Instructions - -Fork the repo, checkout the upstream repo to your GOPATH by: - -``` -$ go get -d go.opencensus.io -``` - -Add your fork as an origin: - -``` -cd $(go env GOPATH)/src/go.opencensus.io -git remote add fork git@github.com:YOUR_GITHUB_USERNAME/opencensus-go.git -``` - -Run tests: - -``` -$ make install-tools # Only first time. -$ make -``` - -Checkout a new branch, make modifications and push the branch to your fork: - -``` -$ git checkout -b feature -# edit files -$ git commit -$ git push fork feature -``` - -Open a pull request against the main opencensus-go repo. - -## General Notes -This project uses Appveyor and Travis for CI. - -The dependencies are managed with `go mod` if you work with the sources under your -`$GOPATH` you need to set the environment variable `GO111MODULE=on`. \ No newline at end of file diff --git a/vendor/go.opencensus.io/LICENSE b/vendor/go.opencensus.io/LICENSE deleted file mode 100644 index 7a4a3ea24..000000000 --- a/vendor/go.opencensus.io/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/vendor/go.opencensus.io/Makefile b/vendor/go.opencensus.io/Makefile deleted file mode 100644 index 457866cb1..000000000 --- a/vendor/go.opencensus.io/Makefile +++ /dev/null @@ -1,96 +0,0 @@ -# TODO: Fix this on windows. -ALL_SRC := $(shell find . -name '*.go' \ - -not -path './vendor/*' \ - -not -path '*/gen-go/*' \ - -type f | sort) -ALL_PKGS := $(shell go list $(sort $(dir $(ALL_SRC)))) - -GOTEST_OPT?=-v -race -timeout 30s -GOTEST_OPT_WITH_COVERAGE = $(GOTEST_OPT) -coverprofile=coverage.txt -covermode=atomic -GOTEST=go test -GOFMT=gofmt -GOLINT=golint -GOVET=go vet -EMBEDMD=embedmd -# TODO decide if we need to change these names. -TRACE_ID_LINT_EXCEPTION="type name will be used as trace.TraceID by other packages" -TRACE_OPTION_LINT_EXCEPTION="type name will be used as trace.TraceOptions by other packages" -README_FILES := $(shell find . -name '*README.md' | sort | tr '\n' ' ') - -.DEFAULT_GOAL := fmt-lint-vet-embedmd-test - -.PHONY: fmt-lint-vet-embedmd-test -fmt-lint-vet-embedmd-test: fmt lint vet embedmd test - -# TODO enable test-with-coverage in tavis -.PHONY: travis-ci -travis-ci: fmt lint vet embedmd test test-386 - -all-pkgs: - @echo $(ALL_PKGS) | tr ' ' '\n' | sort - -all-srcs: - @echo $(ALL_SRC) | tr ' ' '\n' | sort - -.PHONY: test -test: - $(GOTEST) $(GOTEST_OPT) $(ALL_PKGS) - -.PHONY: test-386 -test-386: - GOARCH=386 $(GOTEST) -v -timeout 30s $(ALL_PKGS) - -.PHONY: test-with-coverage -test-with-coverage: - $(GOTEST) $(GOTEST_OPT_WITH_COVERAGE) $(ALL_PKGS) - -.PHONY: fmt -fmt: - @FMTOUT=`$(GOFMT) -s -l $(ALL_SRC) 2>&1`; \ - if [ "$$FMTOUT" ]; then \ - echo "$(GOFMT) FAILED => gofmt the following files:\n"; \ - echo "$$FMTOUT\n"; \ - exit 1; \ - else \ - echo "Fmt finished successfully"; \ - fi - -.PHONY: lint -lint: - @LINTOUT=`$(GOLINT) $(ALL_PKGS) | grep -v $(TRACE_ID_LINT_EXCEPTION) | grep -v $(TRACE_OPTION_LINT_EXCEPTION) 2>&1`; \ - if [ "$$LINTOUT" ]; then \ - echo "$(GOLINT) FAILED => clean the following lint errors:\n"; \ - echo "$$LINTOUT\n"; \ - exit 1; \ - else \ - echo "Lint finished successfully"; \ - fi - -.PHONY: vet -vet: - # TODO: Understand why go vet downloads "github.com/google/go-cmp v0.2.0" - @VETOUT=`$(GOVET) ./... | grep -v "go: downloading" 2>&1`; \ - if [ "$$VETOUT" ]; then \ - echo "$(GOVET) FAILED => go vet the following files:\n"; \ - echo "$$VETOUT\n"; \ - exit 1; \ - else \ - echo "Vet finished successfully"; \ - fi - -.PHONY: embedmd -embedmd: - @EMBEDMDOUT=`$(EMBEDMD) -d $(README_FILES) 2>&1`; \ - if [ "$$EMBEDMDOUT" ]; then \ - echo "$(EMBEDMD) FAILED => embedmd the following files:\n"; \ - echo "$$EMBEDMDOUT\n"; \ - exit 1; \ - else \ - echo "Embedmd finished successfully"; \ - fi - -.PHONY: install-tools -install-tools: - go get -u golang.org/x/tools/cmd/cover - go get -u golang.org/x/lint/golint - go get -u github.com/rakyll/embedmd diff --git a/vendor/go.opencensus.io/README.md b/vendor/go.opencensus.io/README.md deleted file mode 100644 index 1d7e83711..000000000 --- a/vendor/go.opencensus.io/README.md +++ /dev/null @@ -1,267 +0,0 @@ -# OpenCensus Libraries for Go - -[![Build Status][travis-image]][travis-url] -[![Windows Build Status][appveyor-image]][appveyor-url] -[![GoDoc][godoc-image]][godoc-url] -[![Gitter chat][gitter-image]][gitter-url] - -OpenCensus Go is a Go implementation of OpenCensus, a toolkit for -collecting application performance and behavior monitoring data. -Currently it consists of three major components: tags, stats and tracing. - -#### OpenCensus and OpenTracing have merged to form OpenTelemetry, which serves as the next major version of OpenCensus and OpenTracing. OpenTelemetry will offer backwards compatibility with existing OpenCensus integrations, and we will continue to make security patches to existing OpenCensus libraries for two years. Read more about the merger [here](https://medium.com/opentracing/a-roadmap-to-convergence-b074e5815289). - -## Installation - -``` -$ go get -u go.opencensus.io -``` - -The API of this project is still evolving, see: [Deprecation Policy](#deprecation-policy). -The use of vendoring or a dependency management tool is recommended. - -## Prerequisites - -OpenCensus Go libraries require Go 1.8 or later. - -## Getting Started - -The easiest way to get started using OpenCensus in your application is to use an existing -integration with your RPC framework: - -* [net/http](https://godoc.org/go.opencensus.io/plugin/ochttp) -* [gRPC](https://godoc.org/go.opencensus.io/plugin/ocgrpc) -* [database/sql](https://godoc.org/github.com/opencensus-integrations/ocsql) -* [Go kit](https://godoc.org/github.com/go-kit/kit/tracing/opencensus) -* [Groupcache](https://godoc.org/github.com/orijtech/groupcache) -* [Caddy webserver](https://godoc.org/github.com/orijtech/caddy) -* [MongoDB](https://godoc.org/github.com/orijtech/mongo-go-driver) -* [Redis gomodule/redigo](https://godoc.org/github.com/orijtech/redigo) -* [Redis goredis/redis](https://godoc.org/github.com/orijtech/redis) -* [Memcache](https://godoc.org/github.com/orijtech/gomemcache) - -If you're using a framework not listed here, you could either implement your own middleware for your -framework or use [custom stats](#stats) and [spans](#spans) directly in your application. - -## Exporters - -OpenCensus can export instrumentation data to various backends. -OpenCensus has exporter implementations for the following, users -can implement their own exporters by implementing the exporter interfaces -([stats](https://godoc.org/go.opencensus.io/stats/view#Exporter), -[trace](https://godoc.org/go.opencensus.io/trace#Exporter)): - -* [Prometheus][exporter-prom] for stats -* [OpenZipkin][exporter-zipkin] for traces -* [Stackdriver][exporter-stackdriver] Monitoring for stats and Trace for traces -* [Jaeger][exporter-jaeger] for traces -* [AWS X-Ray][exporter-xray] for traces -* [Datadog][exporter-datadog] for stats and traces -* [Graphite][exporter-graphite] for stats -* [Honeycomb][exporter-honeycomb] for traces -* [New Relic][exporter-newrelic] for stats and traces - -## Overview - -![OpenCensus Overview](https://i.imgur.com/cf4ElHE.jpg) - -In a microservices environment, a user request may go through -multiple services until there is a response. OpenCensus allows -you to instrument your services and collect diagnostics data all -through your services end-to-end. - -## Tags - -Tags represent propagated key-value pairs. They are propagated using `context.Context` -in the same process or can be encoded to be transmitted on the wire. Usually, this will -be handled by an integration plugin, e.g. `ocgrpc.ServerHandler` and `ocgrpc.ClientHandler` -for gRPC. - -Package `tag` allows adding or modifying tags in the current context. - -[embedmd]:# (internal/readme/tags.go new) -```go -ctx, err := tag.New(ctx, - tag.Insert(osKey, "macOS-10.12.5"), - tag.Upsert(userIDKey, "cde36753ed"), -) -if err != nil { - log.Fatal(err) -} -``` - -## Stats - -OpenCensus is a low-overhead framework even if instrumentation is always enabled. -In order to be so, it is optimized to make recording of data points fast -and separate from the data aggregation. - -OpenCensus stats collection happens in two stages: - -* Definition of measures and recording of data points -* Definition of views and aggregation of the recorded data - -### Recording - -Measurements are data points associated with a measure. -Recording implicitly tags the set of Measurements with the tags from the -provided context: - -[embedmd]:# (internal/readme/stats.go record) -```go -stats.Record(ctx, videoSize.M(102478)) -``` - -### Views - -Views are how Measures are aggregated. You can think of them as queries over the -set of recorded data points (measurements). - -Views have two parts: the tags to group by and the aggregation type used. - -Currently three types of aggregations are supported: -* CountAggregation is used to count the number of times a sample was recorded. -* DistributionAggregation is used to provide a histogram of the values of the samples. -* SumAggregation is used to sum up all sample values. - -[embedmd]:# (internal/readme/stats.go aggs) -```go -distAgg := view.Distribution(1<<32, 2<<32, 3<<32) -countAgg := view.Count() -sumAgg := view.Sum() -``` - -Here we create a view with the DistributionAggregation over our measure. - -[embedmd]:# (internal/readme/stats.go view) -```go -if err := view.Register(&view.View{ - Name: "example.com/video_size_distribution", - Description: "distribution of processed video size over time", - Measure: videoSize, - Aggregation: view.Distribution(1<<32, 2<<32, 3<<32), -}); err != nil { - log.Fatalf("Failed to register view: %v", err) -} -``` - -Register begins collecting data for the view. Registered views' data will be -exported via the registered exporters. - -## Traces - -A distributed trace tracks the progression of a single user request as -it is handled by the services and processes that make up an application. -Each step is called a span in the trace. Spans include metadata about the step, -including especially the time spent in the step, called the span’s latency. - -Below you see a trace and several spans underneath it. - -![Traces and spans](https://i.imgur.com/7hZwRVj.png) - -### Spans - -Span is the unit step in a trace. Each span has a name, latency, status and -additional metadata. - -Below we are starting a span for a cache read and ending it -when we are done: - -[embedmd]:# (internal/readme/trace.go startend) -```go -ctx, span := trace.StartSpan(ctx, "cache.Get") -defer span.End() - -// Do work to get from cache. -``` - -### Propagation - -Spans can have parents or can be root spans if they don't have any parents. -The current span is propagated in-process and across the network to allow associating -new child spans with the parent. - -In the same process, `context.Context` is used to propagate spans. -`trace.StartSpan` creates a new span as a root if the current context -doesn't contain a span. Or, it creates a child of the span that is -already in current context. The returned context can be used to keep -propagating the newly created span in the current context. - -[embedmd]:# (internal/readme/trace.go startend) -```go -ctx, span := trace.StartSpan(ctx, "cache.Get") -defer span.End() - -// Do work to get from cache. -``` - -Across the network, OpenCensus provides different propagation -methods for different protocols. - -* gRPC integrations use the OpenCensus' [binary propagation format](https://godoc.org/go.opencensus.io/trace/propagation). -* HTTP integrations use Zipkin's [B3](https://github.com/openzipkin/b3-propagation) - by default but can be configured to use a custom propagation method by setting another - [propagation.HTTPFormat](https://godoc.org/go.opencensus.io/trace/propagation#HTTPFormat). - -## Execution Tracer - -With Go 1.11, OpenCensus Go will support integration with the Go execution tracer. -See [Debugging Latency in Go](https://medium.com/observability/debugging-latency-in-go-1-11-9f97a7910d68) -for an example of their mutual use. - -## Profiles - -OpenCensus tags can be applied as profiler labels -for users who are on Go 1.9 and above. - -[embedmd]:# (internal/readme/tags.go profiler) -```go -ctx, err = tag.New(ctx, - tag.Insert(osKey, "macOS-10.12.5"), - tag.Insert(userIDKey, "fff0989878"), -) -if err != nil { - log.Fatal(err) -} -tag.Do(ctx, func(ctx context.Context) { - // Do work. - // When profiling is on, samples will be - // recorded with the key/values from the tag map. -}) -``` - -A screenshot of the CPU profile from the program above: - -![CPU profile](https://i.imgur.com/jBKjlkw.png) - -## Deprecation Policy - -Before version 1.0.0, the following deprecation policy will be observed: - -No backwards-incompatible changes will be made except for the removal of symbols that have -been marked as *Deprecated* for at least one minor release (e.g. 0.9.0 to 0.10.0). A release -removing the *Deprecated* functionality will be made no sooner than 28 days after the first -release in which the functionality was marked *Deprecated*. - -[travis-image]: https://travis-ci.org/census-instrumentation/opencensus-go.svg?branch=master -[travis-url]: https://travis-ci.org/census-instrumentation/opencensus-go -[appveyor-image]: https://ci.appveyor.com/api/projects/status/vgtt29ps1783ig38?svg=true -[appveyor-url]: https://ci.appveyor.com/project/opencensusgoteam/opencensus-go/branch/master -[godoc-image]: https://godoc.org/go.opencensus.io?status.svg -[godoc-url]: https://godoc.org/go.opencensus.io -[gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg -[gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge - - -[new-ex]: https://godoc.org/go.opencensus.io/tag#example-NewMap -[new-replace-ex]: https://godoc.org/go.opencensus.io/tag#example-NewMap--Replace - -[exporter-prom]: https://godoc.org/contrib.go.opencensus.io/exporter/prometheus -[exporter-stackdriver]: https://godoc.org/contrib.go.opencensus.io/exporter/stackdriver -[exporter-zipkin]: https://godoc.org/contrib.go.opencensus.io/exporter/zipkin -[exporter-jaeger]: https://godoc.org/contrib.go.opencensus.io/exporter/jaeger -[exporter-xray]: https://github.com/census-ecosystem/opencensus-go-exporter-aws -[exporter-datadog]: https://github.com/DataDog/opencensus-go-exporter-datadog -[exporter-graphite]: https://github.com/census-ecosystem/opencensus-go-exporter-graphite -[exporter-honeycomb]: https://github.com/honeycombio/opencensus-exporter -[exporter-newrelic]: https://github.com/newrelic/newrelic-opencensus-exporter-go diff --git a/vendor/go.opencensus.io/appveyor.yml b/vendor/go.opencensus.io/appveyor.yml deleted file mode 100644 index d08f0edaf..000000000 --- a/vendor/go.opencensus.io/appveyor.yml +++ /dev/null @@ -1,24 +0,0 @@ -version: "{build}" - -platform: x64 - -clone_folder: c:\gopath\src\go.opencensus.io - -environment: - GOPATH: 'c:\gopath' - GO111MODULE: 'on' - CGO_ENABLED: '0' # See: https://github.com/appveyor/ci/issues/2613 - -stack: go 1.11 - -before_test: - - go version - - go env - -build: false -deploy: false - -test_script: - - cd %APPVEYOR_BUILD_FOLDER% - - go build -v .\... - - go test -v .\... # No -race because cgo is disabled diff --git a/vendor/go.opencensus.io/go.mod b/vendor/go.opencensus.io/go.mod deleted file mode 100644 index c867df5f5..000000000 --- a/vendor/go.opencensus.io/go.mod +++ /dev/null @@ -1,15 +0,0 @@ -module go.opencensus.io - -require ( - github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 - github.com/golang/protobuf v1.3.1 - github.com/google/go-cmp v0.3.0 - github.com/stretchr/testify v1.4.0 - golang.org/x/net v0.0.0-20190620200207-3b0461eec859 - golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd // indirect - golang.org/x/text v0.3.2 // indirect - google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb // indirect - google.golang.org/grpc v1.20.1 -) - -go 1.13 diff --git a/vendor/go.opencensus.io/go.sum b/vendor/go.opencensus.io/go.sum deleted file mode 100644 index 01c02972c..000000000 --- a/vendor/go.opencensus.io/go.sum +++ /dev/null @@ -1,74 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd h1:r7DufRZuZbWB7j439YfAzP8RPDa9unLkpwQKUYbIMPI= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= -google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/go.opencensus.io/internal/internal.go b/vendor/go.opencensus.io/internal/internal.go deleted file mode 100644 index 81dc7183e..000000000 --- a/vendor/go.opencensus.io/internal/internal.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package internal // import "go.opencensus.io/internal" - -import ( - "fmt" - "time" - - opencensus "go.opencensus.io" -) - -// UserAgent is the user agent to be added to the outgoing -// requests from the exporters. -var UserAgent = fmt.Sprintf("opencensus-go/%s", opencensus.Version()) - -// MonotonicEndTime returns the end time at present -// but offset from start, monotonically. -// -// The monotonic clock is used in subtractions hence -// the duration since start added back to start gives -// end as a monotonic time. -// See https://golang.org/pkg/time/#hdr-Monotonic_Clocks -func MonotonicEndTime(start time.Time) time.Time { - return start.Add(time.Since(start)) -} diff --git a/vendor/go.opencensus.io/internal/sanitize.go b/vendor/go.opencensus.io/internal/sanitize.go deleted file mode 100644 index de8ccf236..000000000 --- a/vendor/go.opencensus.io/internal/sanitize.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package internal - -import ( - "strings" - "unicode" -) - -const labelKeySizeLimit = 100 - -// Sanitize returns a string that is trunacated to 100 characters if it's too -// long, and replaces non-alphanumeric characters to underscores. -func Sanitize(s string) string { - if len(s) == 0 { - return s - } - if len(s) > labelKeySizeLimit { - s = s[:labelKeySizeLimit] - } - s = strings.Map(sanitizeRune, s) - if unicode.IsDigit(rune(s[0])) { - s = "key_" + s - } - if s[0] == '_' { - s = "key" + s - } - return s -} - -// converts anything that is not a letter or digit to an underscore -func sanitizeRune(r rune) rune { - if unicode.IsLetter(r) || unicode.IsDigit(r) { - return r - } - // Everything else turns into an underscore - return '_' -} diff --git a/vendor/go.opencensus.io/internal/tagencoding/tagencoding.go b/vendor/go.opencensus.io/internal/tagencoding/tagencoding.go deleted file mode 100644 index 41b2c3fc0..000000000 --- a/vendor/go.opencensus.io/internal/tagencoding/tagencoding.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -// Package tagencoding contains the tag encoding -// used interally by the stats collector. -package tagencoding // import "go.opencensus.io/internal/tagencoding" - -// Values represent the encoded buffer for the values. -type Values struct { - Buffer []byte - WriteIndex int - ReadIndex int -} - -func (vb *Values) growIfRequired(expected int) { - if len(vb.Buffer)-vb.WriteIndex < expected { - tmp := make([]byte, 2*(len(vb.Buffer)+1)+expected) - copy(tmp, vb.Buffer) - vb.Buffer = tmp - } -} - -// WriteValue is the helper method to encode Values from map[Key][]byte. -func (vb *Values) WriteValue(v []byte) { - length := len(v) & 0xff - vb.growIfRequired(1 + length) - - // writing length of v - vb.Buffer[vb.WriteIndex] = byte(length) - vb.WriteIndex++ - - if length == 0 { - // No value was encoded for this key - return - } - - // writing v - copy(vb.Buffer[vb.WriteIndex:], v[:length]) - vb.WriteIndex += length -} - -// ReadValue is the helper method to decode Values to a map[Key][]byte. -func (vb *Values) ReadValue() []byte { - // read length of v - length := int(vb.Buffer[vb.ReadIndex]) - vb.ReadIndex++ - if length == 0 { - // No value was encoded for this key - return nil - } - - // read value of v - v := make([]byte, length) - endIdx := vb.ReadIndex + length - copy(v, vb.Buffer[vb.ReadIndex:endIdx]) - vb.ReadIndex = endIdx - return v -} - -// Bytes returns a reference to already written bytes in the Buffer. -func (vb *Values) Bytes() []byte { - return vb.Buffer[:vb.WriteIndex] -} diff --git a/vendor/go.opencensus.io/internal/traceinternals.go b/vendor/go.opencensus.io/internal/traceinternals.go deleted file mode 100644 index 073af7b47..000000000 --- a/vendor/go.opencensus.io/internal/traceinternals.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package internal - -import ( - "time" -) - -// Trace allows internal access to some trace functionality. -// TODO(#412): remove this -var Trace interface{} - -// LocalSpanStoreEnabled true if the local span store is enabled. -var LocalSpanStoreEnabled bool - -// BucketConfiguration stores the number of samples to store for span buckets -// for successful and failed spans for a particular span name. -type BucketConfiguration struct { - Name string - MaxRequestsSucceeded int - MaxRequestsErrors int -} - -// PerMethodSummary is a summary of the spans stored for a single span name. -type PerMethodSummary struct { - Active int - LatencyBuckets []LatencyBucketSummary - ErrorBuckets []ErrorBucketSummary -} - -// LatencyBucketSummary is a summary of a latency bucket. -type LatencyBucketSummary struct { - MinLatency, MaxLatency time.Duration - Size int -} - -// ErrorBucketSummary is a summary of an error bucket. -type ErrorBucketSummary struct { - ErrorCode int32 - Size int -} diff --git a/vendor/go.opencensus.io/metric/metricdata/doc.go b/vendor/go.opencensus.io/metric/metricdata/doc.go deleted file mode 100644 index 52a7b3bf8..000000000 --- a/vendor/go.opencensus.io/metric/metricdata/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package metricdata contains the metrics data model. -// -// This is an EXPERIMENTAL package, and may change in arbitrary ways without -// notice. -package metricdata // import "go.opencensus.io/metric/metricdata" diff --git a/vendor/go.opencensus.io/metric/metricdata/exemplar.go b/vendor/go.opencensus.io/metric/metricdata/exemplar.go deleted file mode 100644 index 12695ce2d..000000000 --- a/vendor/go.opencensus.io/metric/metricdata/exemplar.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metricdata - -import ( - "time" -) - -// Exemplars keys. -const ( - AttachmentKeySpanContext = "SpanContext" -) - -// Exemplar is an example data point associated with each bucket of a -// distribution type aggregation. -// -// Their purpose is to provide an example of the kind of thing -// (request, RPC, trace span, etc.) that resulted in that measurement. -type Exemplar struct { - Value float64 // the value that was recorded - Timestamp time.Time // the time the value was recorded - Attachments Attachments // attachments (if any) -} - -// Attachments is a map of extra values associated with a recorded data point. -type Attachments map[string]interface{} diff --git a/vendor/go.opencensus.io/metric/metricdata/label.go b/vendor/go.opencensus.io/metric/metricdata/label.go deleted file mode 100644 index aadae41e6..000000000 --- a/vendor/go.opencensus.io/metric/metricdata/label.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metricdata - -// LabelKey represents key of a label. It has optional -// description attribute. -type LabelKey struct { - Key string - Description string -} - -// LabelValue represents the value of a label. -// The zero value represents a missing label value, which may be treated -// differently to an empty string value by some back ends. -type LabelValue struct { - Value string // string value of the label - Present bool // flag that indicated whether a value is present or not -} - -// NewLabelValue creates a new non-nil LabelValue that represents the given string. -func NewLabelValue(val string) LabelValue { - return LabelValue{Value: val, Present: true} -} diff --git a/vendor/go.opencensus.io/metric/metricdata/metric.go b/vendor/go.opencensus.io/metric/metricdata/metric.go deleted file mode 100644 index 8293712c7..000000000 --- a/vendor/go.opencensus.io/metric/metricdata/metric.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metricdata - -import ( - "time" - - "go.opencensus.io/resource" -) - -// Descriptor holds metadata about a metric. -type Descriptor struct { - Name string // full name of the metric - Description string // human-readable description - Unit Unit // units for the measure - Type Type // type of measure - LabelKeys []LabelKey // label keys -} - -// Metric represents a quantity measured against a resource with different -// label value combinations. -type Metric struct { - Descriptor Descriptor // metric descriptor - Resource *resource.Resource // resource against which this was measured - TimeSeries []*TimeSeries // one time series for each combination of label values -} - -// TimeSeries is a sequence of points associated with a combination of label -// values. -type TimeSeries struct { - LabelValues []LabelValue // label values, same order as keys in the metric descriptor - Points []Point // points sequence - StartTime time.Time // time we started recording this time series -} diff --git a/vendor/go.opencensus.io/metric/metricdata/point.go b/vendor/go.opencensus.io/metric/metricdata/point.go deleted file mode 100644 index 7fe057b19..000000000 --- a/vendor/go.opencensus.io/metric/metricdata/point.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metricdata - -import ( - "time" -) - -// Point is a single data point of a time series. -type Point struct { - // Time is the point in time that this point represents in a time series. - Time time.Time - // Value is the value of this point. Prefer using ReadValue to switching on - // the value type, since new value types might be added. - Value interface{} -} - -//go:generate stringer -type ValueType - -// NewFloat64Point creates a new Point holding a float64 value. -func NewFloat64Point(t time.Time, val float64) Point { - return Point{ - Value: val, - Time: t, - } -} - -// NewInt64Point creates a new Point holding an int64 value. -func NewInt64Point(t time.Time, val int64) Point { - return Point{ - Value: val, - Time: t, - } -} - -// NewDistributionPoint creates a new Point holding a Distribution value. -func NewDistributionPoint(t time.Time, val *Distribution) Point { - return Point{ - Value: val, - Time: t, - } -} - -// NewSummaryPoint creates a new Point holding a Summary value. -func NewSummaryPoint(t time.Time, val *Summary) Point { - return Point{ - Value: val, - Time: t, - } -} - -// ValueVisitor allows reading the value of a point. -type ValueVisitor interface { - VisitFloat64Value(float64) - VisitInt64Value(int64) - VisitDistributionValue(*Distribution) - VisitSummaryValue(*Summary) -} - -// ReadValue accepts a ValueVisitor and calls the appropriate method with the -// value of this point. -// Consumers of Point should use this in preference to switching on the type -// of the value directly, since new value types may be added. -func (p Point) ReadValue(vv ValueVisitor) { - switch v := p.Value.(type) { - case int64: - vv.VisitInt64Value(v) - case float64: - vv.VisitFloat64Value(v) - case *Distribution: - vv.VisitDistributionValue(v) - case *Summary: - vv.VisitSummaryValue(v) - default: - panic("unexpected value type") - } -} - -// Distribution contains summary statistics for a population of values. It -// optionally contains a histogram representing the distribution of those -// values across a set of buckets. -type Distribution struct { - // Count is the number of values in the population. Must be non-negative. This value - // must equal the sum of the values in bucket_counts if a histogram is - // provided. - Count int64 - // Sum is the sum of the values in the population. If count is zero then this field - // must be zero. - Sum float64 - // SumOfSquaredDeviation is the sum of squared deviations from the mean of the values in the - // population. For values x_i this is: - // - // Sum[i=1..n]((x_i - mean)^2) - // - // Knuth, "The Art of Computer Programming", Vol. 2, page 323, 3rd edition - // describes Welford's method for accumulating this sum in one pass. - // - // If count is zero then this field must be zero. - SumOfSquaredDeviation float64 - // BucketOptions describes the bounds of the histogram buckets in this - // distribution. - // - // A Distribution may optionally contain a histogram of the values in the - // population. - // - // If nil, there is no associated histogram. - BucketOptions *BucketOptions - // Bucket If the distribution does not have a histogram, then omit this field. - // If there is a histogram, then the sum of the values in the Bucket counts - // must equal the value in the count field of the distribution. - Buckets []Bucket -} - -// BucketOptions describes the bounds of the histogram buckets in this -// distribution. -type BucketOptions struct { - // Bounds specifies a set of bucket upper bounds. - // This defines len(bounds) + 1 (= N) buckets. The boundaries for bucket - // index i are: - // - // [0, Bounds[i]) for i == 0 - // [Bounds[i-1], Bounds[i]) for 0 < i < N-1 - // [Bounds[i-1], +infinity) for i == N-1 - Bounds []float64 -} - -// Bucket represents a single bucket (value range) in a distribution. -type Bucket struct { - // Count is the number of values in each bucket of the histogram, as described in - // bucket_bounds. - Count int64 - // Exemplar associated with this bucket (if any). - Exemplar *Exemplar -} - -// Summary is a representation of percentiles. -type Summary struct { - // Count is the cumulative count (if available). - Count int64 - // Sum is the cumulative sum of values (if available). - Sum float64 - // HasCountAndSum is true if Count and Sum are available. - HasCountAndSum bool - // Snapshot represents percentiles calculated over an arbitrary time window. - // The values in this struct can be reset at arbitrary unknown times, with - // the requirement that all of them are reset at the same time. - Snapshot Snapshot -} - -// Snapshot represents percentiles over an arbitrary time. -// The values in this struct can be reset at arbitrary unknown times, with -// the requirement that all of them are reset at the same time. -type Snapshot struct { - // Count is the number of values in the snapshot. Optional since some systems don't - // expose this. Set to 0 if not available. - Count int64 - // Sum is the sum of values in the snapshot. Optional since some systems don't - // expose this. If count is 0 then this field must be zero. - Sum float64 - // Percentiles is a map from percentile (range (0-100.0]) to the value of - // the percentile. - Percentiles map[float64]float64 -} - -//go:generate stringer -type Type - -// Type is the overall type of metric, including its value type and whether it -// represents a cumulative total (since the start time) or if it represents a -// gauge value. -type Type int - -// Metric types. -const ( - TypeGaugeInt64 Type = iota - TypeGaugeFloat64 - TypeGaugeDistribution - TypeCumulativeInt64 - TypeCumulativeFloat64 - TypeCumulativeDistribution - TypeSummary -) diff --git a/vendor/go.opencensus.io/metric/metricdata/type_string.go b/vendor/go.opencensus.io/metric/metricdata/type_string.go deleted file mode 100644 index c3f8ec27b..000000000 --- a/vendor/go.opencensus.io/metric/metricdata/type_string.go +++ /dev/null @@ -1,16 +0,0 @@ -// Code generated by "stringer -type Type"; DO NOT EDIT. - -package metricdata - -import "strconv" - -const _Type_name = "TypeGaugeInt64TypeGaugeFloat64TypeGaugeDistributionTypeCumulativeInt64TypeCumulativeFloat64TypeCumulativeDistributionTypeSummary" - -var _Type_index = [...]uint8{0, 14, 30, 51, 70, 91, 117, 128} - -func (i Type) String() string { - if i < 0 || i >= Type(len(_Type_index)-1) { - return "Type(" + strconv.FormatInt(int64(i), 10) + ")" - } - return _Type_name[_Type_index[i]:_Type_index[i+1]] -} diff --git a/vendor/go.opencensus.io/metric/metricdata/unit.go b/vendor/go.opencensus.io/metric/metricdata/unit.go deleted file mode 100644 index b483a1371..000000000 --- a/vendor/go.opencensus.io/metric/metricdata/unit.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metricdata - -// Unit is a string encoded according to the case-sensitive abbreviations from the -// Unified Code for Units of Measure: http://unitsofmeasure.org/ucum.html -type Unit string - -// Predefined units. To record against a unit not represented here, create your -// own Unit type constant from a string. -const ( - UnitDimensionless Unit = "1" - UnitBytes Unit = "By" - UnitMilliseconds Unit = "ms" -) diff --git a/vendor/go.opencensus.io/metric/metricexport/doc.go b/vendor/go.opencensus.io/metric/metricexport/doc.go deleted file mode 100644 index df632a792..000000000 --- a/vendor/go.opencensus.io/metric/metricexport/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package metricexport contains support for exporting metric data. -// -// This is an EXPERIMENTAL package, and may change in arbitrary ways without -// notice. -package metricexport // import "go.opencensus.io/metric/metricexport" diff --git a/vendor/go.opencensus.io/metric/metricexport/export.go b/vendor/go.opencensus.io/metric/metricexport/export.go deleted file mode 100644 index 23f4a864a..000000000 --- a/vendor/go.opencensus.io/metric/metricexport/export.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metricexport - -import ( - "context" - - "go.opencensus.io/metric/metricdata" -) - -// Exporter is an interface that exporters implement to export the metric data. -type Exporter interface { - ExportMetrics(ctx context.Context, data []*metricdata.Metric) error -} diff --git a/vendor/go.opencensus.io/metric/metricexport/reader.go b/vendor/go.opencensus.io/metric/metricexport/reader.go deleted file mode 100644 index b920bacd8..000000000 --- a/vendor/go.opencensus.io/metric/metricexport/reader.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package metricexport - -import ( - "context" - "fmt" - "sync" - "time" - - "go.opencensus.io/metric/metricdata" - "go.opencensus.io/metric/metricproducer" - "go.opencensus.io/trace" -) - -var ( - defaultSampler = trace.ProbabilitySampler(0.0001) - errReportingIntervalTooLow = fmt.Errorf("reporting interval less than %d", minimumReportingDuration) - errAlreadyStarted = fmt.Errorf("already started") - errIntervalReaderNil = fmt.Errorf("interval reader is nil") - errExporterNil = fmt.Errorf("exporter is nil") - errReaderNil = fmt.Errorf("reader is nil") -) - -const ( - defaultReportingDuration = 60 * time.Second - minimumReportingDuration = 1 * time.Second - defaultSpanName = "ExportMetrics" -) - -// ReaderOptions contains options pertaining to metrics reader. -type ReaderOptions struct { - // SpanName is the name used for span created to export metrics. - SpanName string -} - -// Reader reads metrics from all producers registered -// with producer manager and exports those metrics using provided -// exporter. -type Reader struct { - sampler trace.Sampler - - spanName string -} - -// IntervalReader periodically reads metrics from all producers registered -// with producer manager and exports those metrics using provided -// exporter. Call Reader.Stop() to stop the reader. -type IntervalReader struct { - // ReportingInterval it the time duration between two consecutive - // metrics reporting. defaultReportingDuration is used if it is not set. - // It cannot be set lower than minimumReportingDuration. - ReportingInterval time.Duration - - exporter Exporter - timer *time.Ticker - quit, done chan bool - mu sync.RWMutex - reader *Reader -} - -// ReaderOption apply changes to ReaderOptions. -type ReaderOption func(*ReaderOptions) - -// WithSpanName makes new reader to use given span name when exporting metrics. -func WithSpanName(spanName string) ReaderOption { - return func(o *ReaderOptions) { - o.SpanName = spanName - } -} - -// NewReader returns a reader configured with specified options. -func NewReader(o ...ReaderOption) *Reader { - var opts ReaderOptions - for _, op := range o { - op(&opts) - } - reader := &Reader{defaultSampler, defaultSpanName} - if opts.SpanName != "" { - reader.spanName = opts.SpanName - } - return reader -} - -// NewIntervalReader creates a reader. Once started it periodically -// reads metrics from all producers and exports them using provided exporter. -func NewIntervalReader(reader *Reader, exporter Exporter) (*IntervalReader, error) { - if exporter == nil { - return nil, errExporterNil - } - if reader == nil { - return nil, errReaderNil - } - - r := &IntervalReader{ - exporter: exporter, - reader: reader, - } - return r, nil -} - -// Start starts the IntervalReader which periodically reads metrics from all -// producers registered with global producer manager. If the reporting interval -// is not set prior to calling this function then default reporting interval -// is used. -func (ir *IntervalReader) Start() error { - if ir == nil { - return errIntervalReaderNil - } - ir.mu.Lock() - defer ir.mu.Unlock() - var reportingInterval = defaultReportingDuration - if ir.ReportingInterval != 0 { - if ir.ReportingInterval < minimumReportingDuration { - return errReportingIntervalTooLow - } - reportingInterval = ir.ReportingInterval - } - - if ir.done != nil { - return errAlreadyStarted - } - ir.timer = time.NewTicker(reportingInterval) - ir.quit = make(chan bool) - ir.done = make(chan bool) - - go ir.startInternal() - return nil -} - -func (ir *IntervalReader) startInternal() { - for { - select { - case <-ir.timer.C: - ir.reader.ReadAndExport(ir.exporter) - case <-ir.quit: - ir.timer.Stop() - ir.done <- true - return - } - } -} - -// Stop stops the reader from reading and exporting metrics. -// Additional call to Stop are no-ops. -func (ir *IntervalReader) Stop() { - if ir == nil { - return - } - ir.mu.Lock() - defer ir.mu.Unlock() - if ir.quit == nil { - return - } - ir.quit <- true - <-ir.done - close(ir.quit) - close(ir.done) - ir.quit = nil -} - -// ReadAndExport reads metrics from all producer registered with -// producer manager and then exports them using provided exporter. -func (r *Reader) ReadAndExport(exporter Exporter) { - ctx, span := trace.StartSpan(context.Background(), r.spanName, trace.WithSampler(r.sampler)) - defer span.End() - producers := metricproducer.GlobalManager().GetAll() - data := []*metricdata.Metric{} - for _, producer := range producers { - data = append(data, producer.Read()...) - } - // TODO: [rghetia] add metrics for errors. - exporter.ExportMetrics(ctx, data) -} diff --git a/vendor/go.opencensus.io/metric/metricproducer/manager.go b/vendor/go.opencensus.io/metric/metricproducer/manager.go deleted file mode 100644 index ca1f39049..000000000 --- a/vendor/go.opencensus.io/metric/metricproducer/manager.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metricproducer - -import ( - "sync" -) - -// Manager maintains a list of active producers. Producers can register -// with the manager to allow readers to read all metrics provided by them. -// Readers can retrieve all producers registered with the manager, -// read metrics from the producers and export them. -type Manager struct { - mu sync.RWMutex - producers map[Producer]struct{} -} - -var prodMgr *Manager -var once sync.Once - -// GlobalManager is a single instance of producer manager -// that is used by all producers and all readers. -func GlobalManager() *Manager { - once.Do(func() { - prodMgr = &Manager{} - prodMgr.producers = make(map[Producer]struct{}) - }) - return prodMgr -} - -// AddProducer adds the producer to the Manager if it is not already present. -func (pm *Manager) AddProducer(producer Producer) { - if producer == nil { - return - } - pm.mu.Lock() - defer pm.mu.Unlock() - pm.producers[producer] = struct{}{} -} - -// DeleteProducer deletes the producer from the Manager if it is present. -func (pm *Manager) DeleteProducer(producer Producer) { - if producer == nil { - return - } - pm.mu.Lock() - defer pm.mu.Unlock() - delete(pm.producers, producer) -} - -// GetAll returns a slice of all producer currently registered with -// the Manager. For each call it generates a new slice. The slice -// should not be cached as registration may change at any time. It is -// typically called periodically by exporter to read metrics from -// the producers. -func (pm *Manager) GetAll() []Producer { - pm.mu.Lock() - defer pm.mu.Unlock() - producers := make([]Producer, len(pm.producers)) - i := 0 - for producer := range pm.producers { - producers[i] = producer - i++ - } - return producers -} diff --git a/vendor/go.opencensus.io/metric/metricproducer/producer.go b/vendor/go.opencensus.io/metric/metricproducer/producer.go deleted file mode 100644 index 6cee9ed17..000000000 --- a/vendor/go.opencensus.io/metric/metricproducer/producer.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package metricproducer - -import ( - "go.opencensus.io/metric/metricdata" -) - -// Producer is a source of metrics. -type Producer interface { - // Read should return the current values of all metrics supported by this - // metric provider. - // The returned metrics should be unique for each combination of name and - // resource. - Read() []*metricdata.Metric -} diff --git a/vendor/go.opencensus.io/opencensus.go b/vendor/go.opencensus.io/opencensus.go deleted file mode 100644 index e5e4b4368..000000000 --- a/vendor/go.opencensus.io/opencensus.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package opencensus contains Go support for OpenCensus. -package opencensus // import "go.opencensus.io" - -// Version is the current release version of OpenCensus in use. -func Version() string { - return "0.23.0" -} diff --git a/vendor/go.opencensus.io/plugin/ocgrpc/client.go b/vendor/go.opencensus.io/plugin/ocgrpc/client.go deleted file mode 100644 index 28fddb844..000000000 --- a/vendor/go.opencensus.io/plugin/ocgrpc/client.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package ocgrpc - -import ( - "context" - "go.opencensus.io/trace" - - "google.golang.org/grpc/stats" -) - -// ClientHandler implements a gRPC stats.Handler for recording OpenCensus stats and -// traces. Use with gRPC clients only. -type ClientHandler struct { - // StartOptions allows configuring the StartOptions used to create new spans. - // - // StartOptions.SpanKind will always be set to trace.SpanKindClient - // for spans started by this handler. - StartOptions trace.StartOptions -} - -// HandleConn exists to satisfy gRPC stats.Handler. -func (c *ClientHandler) HandleConn(ctx context.Context, cs stats.ConnStats) { - // no-op -} - -// TagConn exists to satisfy gRPC stats.Handler. -func (c *ClientHandler) TagConn(ctx context.Context, cti *stats.ConnTagInfo) context.Context { - // no-op - return ctx -} - -// HandleRPC implements per-RPC tracing and stats instrumentation. -func (c *ClientHandler) HandleRPC(ctx context.Context, rs stats.RPCStats) { - traceHandleRPC(ctx, rs) - statsHandleRPC(ctx, rs) -} - -// TagRPC implements per-RPC context management. -func (c *ClientHandler) TagRPC(ctx context.Context, rti *stats.RPCTagInfo) context.Context { - ctx = c.traceTagRPC(ctx, rti) - ctx = c.statsTagRPC(ctx, rti) - return ctx -} diff --git a/vendor/go.opencensus.io/plugin/ocgrpc/client_metrics.go b/vendor/go.opencensus.io/plugin/ocgrpc/client_metrics.go deleted file mode 100644 index abe978b67..000000000 --- a/vendor/go.opencensus.io/plugin/ocgrpc/client_metrics.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package ocgrpc - -import ( - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" -) - -// The following variables are measures are recorded by ClientHandler: -var ( - ClientSentMessagesPerRPC = stats.Int64("grpc.io/client/sent_messages_per_rpc", "Number of messages sent in the RPC (always 1 for non-streaming RPCs).", stats.UnitDimensionless) - ClientSentBytesPerRPC = stats.Int64("grpc.io/client/sent_bytes_per_rpc", "Total bytes sent across all request messages per RPC.", stats.UnitBytes) - ClientReceivedMessagesPerRPC = stats.Int64("grpc.io/client/received_messages_per_rpc", "Number of response messages received per RPC (always 1 for non-streaming RPCs).", stats.UnitDimensionless) - ClientReceivedBytesPerRPC = stats.Int64("grpc.io/client/received_bytes_per_rpc", "Total bytes received across all response messages per RPC.", stats.UnitBytes) - ClientRoundtripLatency = stats.Float64("grpc.io/client/roundtrip_latency", "Time between first byte of request sent to last byte of response received, or terminal error.", stats.UnitMilliseconds) - ClientServerLatency = stats.Float64("grpc.io/client/server_latency", `Propagated from the server and should have the same value as "grpc.io/server/latency".`, stats.UnitMilliseconds) -) - -// Predefined views may be registered to collect data for the above measures. -// As always, you may also define your own custom views over measures collected by this -// package. These are declared as a convenience only; none are registered by -// default. -var ( - ClientSentBytesPerRPCView = &view.View{ - Measure: ClientSentBytesPerRPC, - Name: "grpc.io/client/sent_bytes_per_rpc", - Description: "Distribution of bytes sent per RPC, by method.", - TagKeys: []tag.Key{KeyClientMethod}, - Aggregation: DefaultBytesDistribution, - } - - ClientReceivedBytesPerRPCView = &view.View{ - Measure: ClientReceivedBytesPerRPC, - Name: "grpc.io/client/received_bytes_per_rpc", - Description: "Distribution of bytes received per RPC, by method.", - TagKeys: []tag.Key{KeyClientMethod}, - Aggregation: DefaultBytesDistribution, - } - - ClientRoundtripLatencyView = &view.View{ - Measure: ClientRoundtripLatency, - Name: "grpc.io/client/roundtrip_latency", - Description: "Distribution of round-trip latency, by method.", - TagKeys: []tag.Key{KeyClientMethod}, - Aggregation: DefaultMillisecondsDistribution, - } - - ClientCompletedRPCsView = &view.View{ - Measure: ClientRoundtripLatency, - Name: "grpc.io/client/completed_rpcs", - Description: "Count of RPCs by method and status.", - TagKeys: []tag.Key{KeyClientMethod, KeyClientStatus}, - Aggregation: view.Count(), - } - - ClientSentMessagesPerRPCView = &view.View{ - Measure: ClientSentMessagesPerRPC, - Name: "grpc.io/client/sent_messages_per_rpc", - Description: "Distribution of sent messages count per RPC, by method.", - TagKeys: []tag.Key{KeyClientMethod}, - Aggregation: DefaultMessageCountDistribution, - } - - ClientReceivedMessagesPerRPCView = &view.View{ - Measure: ClientReceivedMessagesPerRPC, - Name: "grpc.io/client/received_messages_per_rpc", - Description: "Distribution of received messages count per RPC, by method.", - TagKeys: []tag.Key{KeyClientMethod}, - Aggregation: DefaultMessageCountDistribution, - } - - ClientServerLatencyView = &view.View{ - Measure: ClientServerLatency, - Name: "grpc.io/client/server_latency", - Description: "Distribution of server latency as viewed by client, by method.", - TagKeys: []tag.Key{KeyClientMethod}, - Aggregation: DefaultMillisecondsDistribution, - } -) - -// DefaultClientViews are the default client views provided by this package. -var DefaultClientViews = []*view.View{ - ClientSentBytesPerRPCView, - ClientReceivedBytesPerRPCView, - ClientRoundtripLatencyView, - ClientCompletedRPCsView, -} - -// TODO(jbd): Add roundtrip_latency, uncompressed_request_bytes, uncompressed_response_bytes, request_count, response_count. -// TODO(acetechnologist): This is temporary and will need to be replaced by a -// mechanism to load these defaults from a common repository/config shared by -// all supported languages. Likely a serialized protobuf of these defaults. diff --git a/vendor/go.opencensus.io/plugin/ocgrpc/client_stats_handler.go b/vendor/go.opencensus.io/plugin/ocgrpc/client_stats_handler.go deleted file mode 100644 index b36349820..000000000 --- a/vendor/go.opencensus.io/plugin/ocgrpc/client_stats_handler.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package ocgrpc - -import ( - "context" - "time" - - "go.opencensus.io/tag" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/stats" -) - -// statsTagRPC gets the tag.Map populated by the application code, serializes -// its tags into the GRPC metadata in order to be sent to the server. -func (h *ClientHandler) statsTagRPC(ctx context.Context, info *stats.RPCTagInfo) context.Context { - startTime := time.Now() - if info == nil { - if grpclog.V(2) { - grpclog.Info("clientHandler.TagRPC called with nil info.") - } - return ctx - } - - d := &rpcData{ - startTime: startTime, - method: info.FullMethodName, - } - ts := tag.FromContext(ctx) - if ts != nil { - encoded := tag.Encode(ts) - ctx = stats.SetTags(ctx, encoded) - } - - return context.WithValue(ctx, rpcDataKey, d) -} diff --git a/vendor/go.opencensus.io/plugin/ocgrpc/doc.go b/vendor/go.opencensus.io/plugin/ocgrpc/doc.go deleted file mode 100644 index 1370323fb..000000000 --- a/vendor/go.opencensus.io/plugin/ocgrpc/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package ocgrpc contains OpenCensus stats and trace -// integrations for gRPC. -// -// Use ServerHandler for servers and ClientHandler for clients. -package ocgrpc // import "go.opencensus.io/plugin/ocgrpc" diff --git a/vendor/go.opencensus.io/plugin/ocgrpc/server.go b/vendor/go.opencensus.io/plugin/ocgrpc/server.go deleted file mode 100644 index 15ada839d..000000000 --- a/vendor/go.opencensus.io/plugin/ocgrpc/server.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package ocgrpc - -import ( - "context" - "go.opencensus.io/trace" - - "google.golang.org/grpc/stats" -) - -// ServerHandler implements gRPC stats.Handler recording OpenCensus stats and -// traces. Use with gRPC servers. -// -// When installed (see Example), tracing metadata is read from inbound RPCs -// by default. If no tracing metadata is present, or if the tracing metadata is -// present but the SpanContext isn't sampled, then a new trace may be started -// (as determined by Sampler). -type ServerHandler struct { - // IsPublicEndpoint may be set to true to always start a new trace around - // each RPC. Any SpanContext in the RPC metadata will be added as a linked - // span instead of making it the parent of the span created around the - // server RPC. - // - // Be aware that if you leave this false (the default) on a public-facing - // server, callers will be able to send tracing metadata in gRPC headers - // and trigger traces in your backend. - IsPublicEndpoint bool - - // StartOptions to use for to spans started around RPCs handled by this server. - // - // These will apply even if there is tracing metadata already - // present on the inbound RPC but the SpanContext is not sampled. This - // ensures that each service has some opportunity to be traced. If you would - // like to not add any additional traces for this gRPC service, set: - // - // StartOptions.Sampler = trace.ProbabilitySampler(0.0) - // - // StartOptions.SpanKind will always be set to trace.SpanKindServer - // for spans started by this handler. - StartOptions trace.StartOptions -} - -var _ stats.Handler = (*ServerHandler)(nil) - -// HandleConn exists to satisfy gRPC stats.Handler. -func (s *ServerHandler) HandleConn(ctx context.Context, cs stats.ConnStats) { - // no-op -} - -// TagConn exists to satisfy gRPC stats.Handler. -func (s *ServerHandler) TagConn(ctx context.Context, cti *stats.ConnTagInfo) context.Context { - // no-op - return ctx -} - -// HandleRPC implements per-RPC tracing and stats instrumentation. -func (s *ServerHandler) HandleRPC(ctx context.Context, rs stats.RPCStats) { - traceHandleRPC(ctx, rs) - statsHandleRPC(ctx, rs) -} - -// TagRPC implements per-RPC context management. -func (s *ServerHandler) TagRPC(ctx context.Context, rti *stats.RPCTagInfo) context.Context { - ctx = s.traceTagRPC(ctx, rti) - ctx = s.statsTagRPC(ctx, rti) - return ctx -} diff --git a/vendor/go.opencensus.io/plugin/ocgrpc/server_metrics.go b/vendor/go.opencensus.io/plugin/ocgrpc/server_metrics.go deleted file mode 100644 index 609d9ed24..000000000 --- a/vendor/go.opencensus.io/plugin/ocgrpc/server_metrics.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package ocgrpc - -import ( - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" -) - -// The following variables are measures are recorded by ServerHandler: -var ( - ServerReceivedMessagesPerRPC = stats.Int64("grpc.io/server/received_messages_per_rpc", "Number of messages received in each RPC. Has value 1 for non-streaming RPCs.", stats.UnitDimensionless) - ServerReceivedBytesPerRPC = stats.Int64("grpc.io/server/received_bytes_per_rpc", "Total bytes received across all messages per RPC.", stats.UnitBytes) - ServerSentMessagesPerRPC = stats.Int64("grpc.io/server/sent_messages_per_rpc", "Number of messages sent in each RPC. Has value 1 for non-streaming RPCs.", stats.UnitDimensionless) - ServerSentBytesPerRPC = stats.Int64("grpc.io/server/sent_bytes_per_rpc", "Total bytes sent in across all response messages per RPC.", stats.UnitBytes) - ServerLatency = stats.Float64("grpc.io/server/server_latency", "Time between first byte of request received to last byte of response sent, or terminal error.", stats.UnitMilliseconds) -) - -// TODO(acetechnologist): This is temporary and will need to be replaced by a -// mechanism to load these defaults from a common repository/config shared by -// all supported languages. Likely a serialized protobuf of these defaults. - -// Predefined views may be registered to collect data for the above measures. -// As always, you may also define your own custom views over measures collected by this -// package. These are declared as a convenience only; none are registered by -// default. -var ( - ServerReceivedBytesPerRPCView = &view.View{ - Name: "grpc.io/server/received_bytes_per_rpc", - Description: "Distribution of received bytes per RPC, by method.", - Measure: ServerReceivedBytesPerRPC, - TagKeys: []tag.Key{KeyServerMethod}, - Aggregation: DefaultBytesDistribution, - } - - ServerSentBytesPerRPCView = &view.View{ - Name: "grpc.io/server/sent_bytes_per_rpc", - Description: "Distribution of total sent bytes per RPC, by method.", - Measure: ServerSentBytesPerRPC, - TagKeys: []tag.Key{KeyServerMethod}, - Aggregation: DefaultBytesDistribution, - } - - ServerLatencyView = &view.View{ - Name: "grpc.io/server/server_latency", - Description: "Distribution of server latency in milliseconds, by method.", - TagKeys: []tag.Key{KeyServerMethod}, - Measure: ServerLatency, - Aggregation: DefaultMillisecondsDistribution, - } - - ServerCompletedRPCsView = &view.View{ - Name: "grpc.io/server/completed_rpcs", - Description: "Count of RPCs by method and status.", - TagKeys: []tag.Key{KeyServerMethod, KeyServerStatus}, - Measure: ServerLatency, - Aggregation: view.Count(), - } - - ServerReceivedMessagesPerRPCView = &view.View{ - Name: "grpc.io/server/received_messages_per_rpc", - Description: "Distribution of messages received count per RPC, by method.", - TagKeys: []tag.Key{KeyServerMethod}, - Measure: ServerReceivedMessagesPerRPC, - Aggregation: DefaultMessageCountDistribution, - } - - ServerSentMessagesPerRPCView = &view.View{ - Name: "grpc.io/server/sent_messages_per_rpc", - Description: "Distribution of messages sent count per RPC, by method.", - TagKeys: []tag.Key{KeyServerMethod}, - Measure: ServerSentMessagesPerRPC, - Aggregation: DefaultMessageCountDistribution, - } -) - -// DefaultServerViews are the default server views provided by this package. -var DefaultServerViews = []*view.View{ - ServerReceivedBytesPerRPCView, - ServerSentBytesPerRPCView, - ServerLatencyView, - ServerCompletedRPCsView, -} diff --git a/vendor/go.opencensus.io/plugin/ocgrpc/server_stats_handler.go b/vendor/go.opencensus.io/plugin/ocgrpc/server_stats_handler.go deleted file mode 100644 index afcef023a..000000000 --- a/vendor/go.opencensus.io/plugin/ocgrpc/server_stats_handler.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package ocgrpc - -import ( - "time" - - "context" - - "go.opencensus.io/tag" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/stats" -) - -// statsTagRPC gets the metadata from gRPC context, extracts the encoded tags from -// it and creates a new tag.Map and puts them into the returned context. -func (h *ServerHandler) statsTagRPC(ctx context.Context, info *stats.RPCTagInfo) context.Context { - startTime := time.Now() - if info == nil { - if grpclog.V(2) { - grpclog.Infof("opencensus: TagRPC called with nil info.") - } - return ctx - } - d := &rpcData{ - startTime: startTime, - method: info.FullMethodName, - } - propagated := h.extractPropagatedTags(ctx) - ctx = tag.NewContext(ctx, propagated) - ctx, _ = tag.New(ctx, tag.Upsert(KeyServerMethod, methodName(info.FullMethodName))) - return context.WithValue(ctx, rpcDataKey, d) -} - -// extractPropagatedTags creates a new tag map containing the tags extracted from the -// gRPC metadata. -func (h *ServerHandler) extractPropagatedTags(ctx context.Context) *tag.Map { - buf := stats.Tags(ctx) - if buf == nil { - return nil - } - propagated, err := tag.Decode(buf) - if err != nil { - if grpclog.V(2) { - grpclog.Warningf("opencensus: Failed to decode tags from gRPC metadata failed to decode: %v", err) - } - return nil - } - return propagated -} diff --git a/vendor/go.opencensus.io/plugin/ocgrpc/stats_common.go b/vendor/go.opencensus.io/plugin/ocgrpc/stats_common.go deleted file mode 100644 index 89cac9c4e..000000000 --- a/vendor/go.opencensus.io/plugin/ocgrpc/stats_common.go +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package ocgrpc - -import ( - "context" - "strconv" - "strings" - "sync/atomic" - "time" - - "go.opencensus.io/metric/metricdata" - ocstats "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" - "go.opencensus.io/trace" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/stats" - "google.golang.org/grpc/status" -) - -type grpcInstrumentationKey string - -// rpcData holds the instrumentation RPC data that is needed between the start -// and end of an call. It holds the info that this package needs to keep track -// of between the various GRPC events. -type rpcData struct { - // reqCount and respCount has to be the first words - // in order to be 64-aligned on 32-bit architectures. - sentCount, sentBytes, recvCount, recvBytes int64 // access atomically - - // startTime represents the time at which TagRPC was invoked at the - // beginning of an RPC. It is an appoximation of the time when the - // application code invoked GRPC code. - startTime time.Time - method string -} - -// The following variables define the default hard-coded auxiliary data used by -// both the default GRPC client and GRPC server metrics. -var ( - DefaultBytesDistribution = view.Distribution(1024, 2048, 4096, 16384, 65536, 262144, 1048576, 4194304, 16777216, 67108864, 268435456, 1073741824, 4294967296) - DefaultMillisecondsDistribution = view.Distribution(0.01, 0.05, 0.1, 0.3, 0.6, 0.8, 1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 20, 25, 30, 40, 50, 65, 80, 100, 130, 160, 200, 250, 300, 400, 500, 650, 800, 1000, 2000, 5000, 10000, 20000, 50000, 100000) - DefaultMessageCountDistribution = view.Distribution(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536) -) - -// Server tags are applied to the context used to process each RPC, as well as -// the measures at the end of each RPC. -var ( - KeyServerMethod = tag.MustNewKey("grpc_server_method") - KeyServerStatus = tag.MustNewKey("grpc_server_status") -) - -// Client tags are applied to measures at the end of each RPC. -var ( - KeyClientMethod = tag.MustNewKey("grpc_client_method") - KeyClientStatus = tag.MustNewKey("grpc_client_status") -) - -var ( - rpcDataKey = grpcInstrumentationKey("opencensus-rpcData") -) - -func methodName(fullname string) string { - return strings.TrimLeft(fullname, "/") -} - -// statsHandleRPC processes the RPC events. -func statsHandleRPC(ctx context.Context, s stats.RPCStats) { - switch st := s.(type) { - case *stats.Begin, *stats.OutHeader, *stats.InHeader, *stats.InTrailer, *stats.OutTrailer: - // do nothing for client - case *stats.OutPayload: - handleRPCOutPayload(ctx, st) - case *stats.InPayload: - handleRPCInPayload(ctx, st) - case *stats.End: - handleRPCEnd(ctx, st) - default: - grpclog.Infof("unexpected stats: %T", st) - } -} - -func handleRPCOutPayload(ctx context.Context, s *stats.OutPayload) { - d, ok := ctx.Value(rpcDataKey).(*rpcData) - if !ok { - if grpclog.V(2) { - grpclog.Infoln("Failed to retrieve *rpcData from context.") - } - return - } - - atomic.AddInt64(&d.sentBytes, int64(s.Length)) - atomic.AddInt64(&d.sentCount, 1) -} - -func handleRPCInPayload(ctx context.Context, s *stats.InPayload) { - d, ok := ctx.Value(rpcDataKey).(*rpcData) - if !ok { - if grpclog.V(2) { - grpclog.Infoln("Failed to retrieve *rpcData from context.") - } - return - } - - atomic.AddInt64(&d.recvBytes, int64(s.Length)) - atomic.AddInt64(&d.recvCount, 1) -} - -func handleRPCEnd(ctx context.Context, s *stats.End) { - d, ok := ctx.Value(rpcDataKey).(*rpcData) - if !ok { - if grpclog.V(2) { - grpclog.Infoln("Failed to retrieve *rpcData from context.") - } - return - } - - elapsedTime := time.Since(d.startTime) - - var st string - if s.Error != nil { - s, ok := status.FromError(s.Error) - if ok { - st = statusCodeToString(s) - } - } else { - st = "OK" - } - - latencyMillis := float64(elapsedTime) / float64(time.Millisecond) - attachments := getSpanCtxAttachment(ctx) - if s.Client { - ocstats.RecordWithOptions(ctx, - ocstats.WithTags( - tag.Upsert(KeyClientMethod, methodName(d.method)), - tag.Upsert(KeyClientStatus, st)), - ocstats.WithAttachments(attachments), - ocstats.WithMeasurements( - ClientSentBytesPerRPC.M(atomic.LoadInt64(&d.sentBytes)), - ClientSentMessagesPerRPC.M(atomic.LoadInt64(&d.sentCount)), - ClientReceivedMessagesPerRPC.M(atomic.LoadInt64(&d.recvCount)), - ClientReceivedBytesPerRPC.M(atomic.LoadInt64(&d.recvBytes)), - ClientRoundtripLatency.M(latencyMillis))) - } else { - ocstats.RecordWithOptions(ctx, - ocstats.WithTags( - tag.Upsert(KeyServerStatus, st), - ), - ocstats.WithAttachments(attachments), - ocstats.WithMeasurements( - ServerSentBytesPerRPC.M(atomic.LoadInt64(&d.sentBytes)), - ServerSentMessagesPerRPC.M(atomic.LoadInt64(&d.sentCount)), - ServerReceivedMessagesPerRPC.M(atomic.LoadInt64(&d.recvCount)), - ServerReceivedBytesPerRPC.M(atomic.LoadInt64(&d.recvBytes)), - ServerLatency.M(latencyMillis))) - } -} - -func statusCodeToString(s *status.Status) string { - // see https://github.com/grpc/grpc/blob/master/doc/statuscodes.md - switch c := s.Code(); c { - case codes.OK: - return "OK" - case codes.Canceled: - return "CANCELLED" - case codes.Unknown: - return "UNKNOWN" - case codes.InvalidArgument: - return "INVALID_ARGUMENT" - case codes.DeadlineExceeded: - return "DEADLINE_EXCEEDED" - case codes.NotFound: - return "NOT_FOUND" - case codes.AlreadyExists: - return "ALREADY_EXISTS" - case codes.PermissionDenied: - return "PERMISSION_DENIED" - case codes.ResourceExhausted: - return "RESOURCE_EXHAUSTED" - case codes.FailedPrecondition: - return "FAILED_PRECONDITION" - case codes.Aborted: - return "ABORTED" - case codes.OutOfRange: - return "OUT_OF_RANGE" - case codes.Unimplemented: - return "UNIMPLEMENTED" - case codes.Internal: - return "INTERNAL" - case codes.Unavailable: - return "UNAVAILABLE" - case codes.DataLoss: - return "DATA_LOSS" - case codes.Unauthenticated: - return "UNAUTHENTICATED" - default: - return "CODE_" + strconv.FormatInt(int64(c), 10) - } -} - -func getSpanCtxAttachment(ctx context.Context) metricdata.Attachments { - attachments := map[string]interface{}{} - span := trace.FromContext(ctx) - if span == nil { - return attachments - } - spanCtx := span.SpanContext() - if spanCtx.IsSampled() { - attachments[metricdata.AttachmentKeySpanContext] = spanCtx - } - return attachments -} diff --git a/vendor/go.opencensus.io/plugin/ocgrpc/trace_common.go b/vendor/go.opencensus.io/plugin/ocgrpc/trace_common.go deleted file mode 100644 index fef582756..000000000 --- a/vendor/go.opencensus.io/plugin/ocgrpc/trace_common.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package ocgrpc - -import ( - "strings" - - "google.golang.org/grpc/codes" - - "context" - "go.opencensus.io/trace" - "go.opencensus.io/trace/propagation" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/stats" - "google.golang.org/grpc/status" -) - -const traceContextKey = "grpc-trace-bin" - -// TagRPC creates a new trace span for the client side of the RPC. -// -// It returns ctx with the new trace span added and a serialization of the -// SpanContext added to the outgoing gRPC metadata. -func (c *ClientHandler) traceTagRPC(ctx context.Context, rti *stats.RPCTagInfo) context.Context { - name := strings.TrimPrefix(rti.FullMethodName, "/") - name = strings.Replace(name, "/", ".", -1) - ctx, span := trace.StartSpan(ctx, name, - trace.WithSampler(c.StartOptions.Sampler), - trace.WithSpanKind(trace.SpanKindClient)) // span is ended by traceHandleRPC - traceContextBinary := propagation.Binary(span.SpanContext()) - return metadata.AppendToOutgoingContext(ctx, traceContextKey, string(traceContextBinary)) -} - -// TagRPC creates a new trace span for the server side of the RPC. -// -// It checks the incoming gRPC metadata in ctx for a SpanContext, and if -// it finds one, uses that SpanContext as the parent context of the new span. -// -// It returns ctx, with the new trace span added. -func (s *ServerHandler) traceTagRPC(ctx context.Context, rti *stats.RPCTagInfo) context.Context { - md, _ := metadata.FromIncomingContext(ctx) - name := strings.TrimPrefix(rti.FullMethodName, "/") - name = strings.Replace(name, "/", ".", -1) - traceContext := md[traceContextKey] - var ( - parent trace.SpanContext - haveParent bool - ) - if len(traceContext) > 0 { - // Metadata with keys ending in -bin are actually binary. They are base64 - // encoded before being put on the wire, see: - // https://github.com/grpc/grpc-go/blob/08d6261/Documentation/grpc-metadata.md#storing-binary-data-in-metadata - traceContextBinary := []byte(traceContext[0]) - parent, haveParent = propagation.FromBinary(traceContextBinary) - if haveParent && !s.IsPublicEndpoint { - ctx, _ := trace.StartSpanWithRemoteParent(ctx, name, parent, - trace.WithSpanKind(trace.SpanKindServer), - trace.WithSampler(s.StartOptions.Sampler), - ) - return ctx - } - } - ctx, span := trace.StartSpan(ctx, name, - trace.WithSpanKind(trace.SpanKindServer), - trace.WithSampler(s.StartOptions.Sampler)) - if haveParent { - span.AddLink(trace.Link{TraceID: parent.TraceID, SpanID: parent.SpanID, Type: trace.LinkTypeChild}) - } - return ctx -} - -func traceHandleRPC(ctx context.Context, rs stats.RPCStats) { - span := trace.FromContext(ctx) - // TODO: compressed and uncompressed sizes are not populated in every message. - switch rs := rs.(type) { - case *stats.Begin: - span.AddAttributes( - trace.BoolAttribute("Client", rs.Client), - trace.BoolAttribute("FailFast", rs.FailFast)) - case *stats.InPayload: - span.AddMessageReceiveEvent(0 /* TODO: messageID */, int64(rs.Length), int64(rs.WireLength)) - case *stats.OutPayload: - span.AddMessageSendEvent(0, int64(rs.Length), int64(rs.WireLength)) - case *stats.End: - if rs.Error != nil { - s, ok := status.FromError(rs.Error) - if ok { - span.SetStatus(trace.Status{Code: int32(s.Code()), Message: s.Message()}) - } else { - span.SetStatus(trace.Status{Code: int32(codes.Internal), Message: rs.Error.Error()}) - } - } - span.End() - } -} diff --git a/vendor/go.opencensus.io/plugin/ochttp/client.go b/vendor/go.opencensus.io/plugin/ochttp/client.go deleted file mode 100644 index da815b2a7..000000000 --- a/vendor/go.opencensus.io/plugin/ochttp/client.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package ochttp - -import ( - "net/http" - "net/http/httptrace" - - "go.opencensus.io/trace" - "go.opencensus.io/trace/propagation" -) - -// Transport is an http.RoundTripper that instruments all outgoing requests with -// OpenCensus stats and tracing. -// -// The zero value is intended to be a useful default, but for -// now it's recommended that you explicitly set Propagation, since the default -// for this may change. -type Transport struct { - // Base may be set to wrap another http.RoundTripper that does the actual - // requests. By default http.DefaultTransport is used. - // - // If base HTTP roundtripper implements CancelRequest, - // the returned round tripper will be cancelable. - Base http.RoundTripper - - // Propagation defines how traces are propagated. If unspecified, a default - // (currently B3 format) will be used. - Propagation propagation.HTTPFormat - - // StartOptions are applied to the span started by this Transport around each - // request. - // - // StartOptions.SpanKind will always be set to trace.SpanKindClient - // for spans started by this transport. - StartOptions trace.StartOptions - - // GetStartOptions allows to set start options per request. If set, - // StartOptions is going to be ignored. - GetStartOptions func(*http.Request) trace.StartOptions - - // NameFromRequest holds the function to use for generating the span name - // from the information found in the outgoing HTTP Request. By default the - // name equals the URL Path. - FormatSpanName func(*http.Request) string - - // NewClientTrace may be set to a function allowing the current *trace.Span - // to be annotated with HTTP request event information emitted by the - // httptrace package. - NewClientTrace func(*http.Request, *trace.Span) *httptrace.ClientTrace - - // TODO: Implement tag propagation for HTTP. -} - -// RoundTrip implements http.RoundTripper, delegating to Base and recording stats and traces for the request. -func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { - rt := t.base() - if isHealthEndpoint(req.URL.Path) { - return rt.RoundTrip(req) - } - // TODO: remove excessive nesting of http.RoundTrippers here. - format := t.Propagation - if format == nil { - format = defaultFormat - } - spanNameFormatter := t.FormatSpanName - if spanNameFormatter == nil { - spanNameFormatter = spanNameFromURL - } - - startOpts := t.StartOptions - if t.GetStartOptions != nil { - startOpts = t.GetStartOptions(req) - } - - rt = &traceTransport{ - base: rt, - format: format, - startOptions: trace.StartOptions{ - Sampler: startOpts.Sampler, - SpanKind: trace.SpanKindClient, - }, - formatSpanName: spanNameFormatter, - newClientTrace: t.NewClientTrace, - } - rt = statsTransport{base: rt} - return rt.RoundTrip(req) -} - -func (t *Transport) base() http.RoundTripper { - if t.Base != nil { - return t.Base - } - return http.DefaultTransport -} - -// CancelRequest cancels an in-flight request by closing its connection. -func (t *Transport) CancelRequest(req *http.Request) { - type canceler interface { - CancelRequest(*http.Request) - } - if cr, ok := t.base().(canceler); ok { - cr.CancelRequest(req) - } -} diff --git a/vendor/go.opencensus.io/plugin/ochttp/client_stats.go b/vendor/go.opencensus.io/plugin/ochttp/client_stats.go deleted file mode 100644 index 17142aabe..000000000 --- a/vendor/go.opencensus.io/plugin/ochttp/client_stats.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package ochttp - -import ( - "context" - "io" - "net/http" - "strconv" - "sync" - "time" - - "go.opencensus.io/stats" - "go.opencensus.io/tag" -) - -// statsTransport is an http.RoundTripper that collects stats for the outgoing requests. -type statsTransport struct { - base http.RoundTripper -} - -// RoundTrip implements http.RoundTripper, delegating to Base and recording stats for the request. -func (t statsTransport) RoundTrip(req *http.Request) (*http.Response, error) { - ctx, _ := tag.New(req.Context(), - tag.Upsert(KeyClientHost, req.Host), - tag.Upsert(Host, req.Host), - tag.Upsert(KeyClientPath, req.URL.Path), - tag.Upsert(Path, req.URL.Path), - tag.Upsert(KeyClientMethod, req.Method), - tag.Upsert(Method, req.Method)) - req = req.WithContext(ctx) - track := &tracker{ - start: time.Now(), - ctx: ctx, - } - if req.Body == nil { - // TODO: Handle cases where ContentLength is not set. - track.reqSize = -1 - } else if req.ContentLength > 0 { - track.reqSize = req.ContentLength - } - stats.Record(ctx, ClientRequestCount.M(1)) - - // Perform request. - resp, err := t.base.RoundTrip(req) - - if err != nil { - track.statusCode = http.StatusInternalServerError - track.end() - } else { - track.statusCode = resp.StatusCode - if req.Method != "HEAD" { - track.respContentLength = resp.ContentLength - } - if resp.Body == nil { - track.end() - } else { - track.body = resp.Body - resp.Body = wrappedBody(track, resp.Body) - } - } - return resp, err -} - -// CancelRequest cancels an in-flight request by closing its connection. -func (t statsTransport) CancelRequest(req *http.Request) { - type canceler interface { - CancelRequest(*http.Request) - } - if cr, ok := t.base.(canceler); ok { - cr.CancelRequest(req) - } -} - -type tracker struct { - ctx context.Context - respSize int64 - respContentLength int64 - reqSize int64 - start time.Time - body io.ReadCloser - statusCode int - endOnce sync.Once -} - -var _ io.ReadCloser = (*tracker)(nil) - -func (t *tracker) end() { - t.endOnce.Do(func() { - latencyMs := float64(time.Since(t.start)) / float64(time.Millisecond) - respSize := t.respSize - if t.respSize == 0 && t.respContentLength > 0 { - respSize = t.respContentLength - } - m := []stats.Measurement{ - ClientSentBytes.M(t.reqSize), - ClientReceivedBytes.M(respSize), - ClientRoundtripLatency.M(latencyMs), - ClientLatency.M(latencyMs), - ClientResponseBytes.M(t.respSize), - } - if t.reqSize >= 0 { - m = append(m, ClientRequestBytes.M(t.reqSize)) - } - - stats.RecordWithTags(t.ctx, []tag.Mutator{ - tag.Upsert(StatusCode, strconv.Itoa(t.statusCode)), - tag.Upsert(KeyClientStatus, strconv.Itoa(t.statusCode)), - }, m...) - }) -} - -func (t *tracker) Read(b []byte) (int, error) { - n, err := t.body.Read(b) - t.respSize += int64(n) - switch err { - case nil: - return n, nil - case io.EOF: - t.end() - } - return n, err -} - -func (t *tracker) Close() error { - // Invoking endSpan on Close will help catch the cases - // in which a read returned a non-nil error, we set the - // span status but didn't end the span. - t.end() - return t.body.Close() -} diff --git a/vendor/go.opencensus.io/plugin/ochttp/doc.go b/vendor/go.opencensus.io/plugin/ochttp/doc.go deleted file mode 100644 index 10e626b16..000000000 --- a/vendor/go.opencensus.io/plugin/ochttp/doc.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package ochttp provides OpenCensus instrumentation for net/http package. -// -// For server instrumentation, see Handler. For client-side instrumentation, -// see Transport. -package ochttp // import "go.opencensus.io/plugin/ochttp" diff --git a/vendor/go.opencensus.io/plugin/ochttp/propagation/b3/b3.go b/vendor/go.opencensus.io/plugin/ochttp/propagation/b3/b3.go deleted file mode 100644 index 2f1c7f006..000000000 --- a/vendor/go.opencensus.io/plugin/ochttp/propagation/b3/b3.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package b3 contains a propagation.HTTPFormat implementation -// for B3 propagation. See https://github.com/openzipkin/b3-propagation -// for more details. -package b3 // import "go.opencensus.io/plugin/ochttp/propagation/b3" - -import ( - "encoding/hex" - "net/http" - - "go.opencensus.io/trace" - "go.opencensus.io/trace/propagation" -) - -// B3 headers that OpenCensus understands. -const ( - TraceIDHeader = "X-B3-TraceId" - SpanIDHeader = "X-B3-SpanId" - SampledHeader = "X-B3-Sampled" -) - -// HTTPFormat implements propagation.HTTPFormat to propagate -// traces in HTTP headers in B3 propagation format. -// HTTPFormat skips the X-B3-ParentId and X-B3-Flags headers -// because there are additional fields not represented in the -// OpenCensus span context. Spans created from the incoming -// header will be the direct children of the client-side span. -// Similarly, receiver of the outgoing spans should use client-side -// span created by OpenCensus as the parent. -type HTTPFormat struct{} - -var _ propagation.HTTPFormat = (*HTTPFormat)(nil) - -// SpanContextFromRequest extracts a B3 span context from incoming requests. -func (f *HTTPFormat) SpanContextFromRequest(req *http.Request) (sc trace.SpanContext, ok bool) { - tid, ok := ParseTraceID(req.Header.Get(TraceIDHeader)) - if !ok { - return trace.SpanContext{}, false - } - sid, ok := ParseSpanID(req.Header.Get(SpanIDHeader)) - if !ok { - return trace.SpanContext{}, false - } - sampled, _ := ParseSampled(req.Header.Get(SampledHeader)) - return trace.SpanContext{ - TraceID: tid, - SpanID: sid, - TraceOptions: sampled, - }, true -} - -// ParseTraceID parses the value of the X-B3-TraceId header. -func ParseTraceID(tid string) (trace.TraceID, bool) { - if tid == "" { - return trace.TraceID{}, false - } - b, err := hex.DecodeString(tid) - if err != nil { - return trace.TraceID{}, false - } - var traceID trace.TraceID - if len(b) <= 8 { - // The lower 64-bits. - start := 8 + (8 - len(b)) - copy(traceID[start:], b) - } else { - start := 16 - len(b) - copy(traceID[start:], b) - } - - return traceID, true -} - -// ParseSpanID parses the value of the X-B3-SpanId or X-B3-ParentSpanId headers. -func ParseSpanID(sid string) (spanID trace.SpanID, ok bool) { - if sid == "" { - return trace.SpanID{}, false - } - b, err := hex.DecodeString(sid) - if err != nil { - return trace.SpanID{}, false - } - start := 8 - len(b) - copy(spanID[start:], b) - return spanID, true -} - -// ParseSampled parses the value of the X-B3-Sampled header. -func ParseSampled(sampled string) (trace.TraceOptions, bool) { - switch sampled { - case "true", "1": - return trace.TraceOptions(1), true - default: - return trace.TraceOptions(0), false - } -} - -// SpanContextToRequest modifies the given request to include B3 headers. -func (f *HTTPFormat) SpanContextToRequest(sc trace.SpanContext, req *http.Request) { - req.Header.Set(TraceIDHeader, hex.EncodeToString(sc.TraceID[:])) - req.Header.Set(SpanIDHeader, hex.EncodeToString(sc.SpanID[:])) - - var sampled string - if sc.IsSampled() { - sampled = "1" - } else { - sampled = "0" - } - req.Header.Set(SampledHeader, sampled) -} diff --git a/vendor/go.opencensus.io/plugin/ochttp/route.go b/vendor/go.opencensus.io/plugin/ochttp/route.go deleted file mode 100644 index 5e6a34307..000000000 --- a/vendor/go.opencensus.io/plugin/ochttp/route.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package ochttp - -import ( - "context" - "net/http" - - "go.opencensus.io/tag" -) - -// SetRoute sets the http_server_route tag to the given value. -// It's useful when an HTTP framework does not support the http.Handler interface -// and using WithRouteTag is not an option, but provides a way to hook into the request flow. -func SetRoute(ctx context.Context, route string) { - if a, ok := ctx.Value(addedTagsKey{}).(*addedTags); ok { - a.t = append(a.t, tag.Upsert(KeyServerRoute, route)) - } -} - -// WithRouteTag returns an http.Handler that records stats with the -// http_server_route tag set to the given value. -func WithRouteTag(handler http.Handler, route string) http.Handler { - return taggedHandlerFunc(func(w http.ResponseWriter, r *http.Request) []tag.Mutator { - addRoute := []tag.Mutator{tag.Upsert(KeyServerRoute, route)} - ctx, _ := tag.New(r.Context(), addRoute...) - r = r.WithContext(ctx) - handler.ServeHTTP(w, r) - return addRoute - }) -} - -// taggedHandlerFunc is a http.Handler that returns tags describing the -// processing of the request. These tags will be recorded along with the -// measures in this package at the end of the request. -type taggedHandlerFunc func(w http.ResponseWriter, r *http.Request) []tag.Mutator - -func (h taggedHandlerFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) { - tags := h(w, r) - if a, ok := r.Context().Value(addedTagsKey{}).(*addedTags); ok { - a.t = append(a.t, tags...) - } -} - -type addedTagsKey struct{} - -type addedTags struct { - t []tag.Mutator -} diff --git a/vendor/go.opencensus.io/plugin/ochttp/server.go b/vendor/go.opencensus.io/plugin/ochttp/server.go deleted file mode 100644 index c7ea64235..000000000 --- a/vendor/go.opencensus.io/plugin/ochttp/server.go +++ /dev/null @@ -1,453 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package ochttp - -import ( - "context" - "io" - "net/http" - "strconv" - "sync" - "time" - - "go.opencensus.io/stats" - "go.opencensus.io/tag" - "go.opencensus.io/trace" - "go.opencensus.io/trace/propagation" -) - -// Handler is an http.Handler wrapper to instrument your HTTP server with -// OpenCensus. It supports both stats and tracing. -// -// Tracing -// -// This handler is aware of the incoming request's span, reading it from request -// headers as configured using the Propagation field. -// The extracted span can be accessed from the incoming request's -// context. -// -// span := trace.FromContext(r.Context()) -// -// The server span will be automatically ended at the end of ServeHTTP. -type Handler struct { - // Propagation defines how traces are propagated. If unspecified, - // B3 propagation will be used. - Propagation propagation.HTTPFormat - - // Handler is the handler used to handle the incoming request. - Handler http.Handler - - // StartOptions are applied to the span started by this Handler around each - // request. - // - // StartOptions.SpanKind will always be set to trace.SpanKindServer - // for spans started by this transport. - StartOptions trace.StartOptions - - // GetStartOptions allows to set start options per request. If set, - // StartOptions is going to be ignored. - GetStartOptions func(*http.Request) trace.StartOptions - - // IsPublicEndpoint should be set to true for publicly accessible HTTP(S) - // servers. If true, any trace metadata set on the incoming request will - // be added as a linked trace instead of being added as a parent of the - // current trace. - IsPublicEndpoint bool - - // FormatSpanName holds the function to use for generating the span name - // from the information found in the incoming HTTP Request. By default the - // name equals the URL Path. - FormatSpanName func(*http.Request) string - - // IsHealthEndpoint holds the function to use for determining if the - // incoming HTTP request should be considered a health check. This is in - // addition to the private isHealthEndpoint func which may also indicate - // tracing should be skipped. - IsHealthEndpoint func(*http.Request) bool -} - -func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - var tags addedTags - r, traceEnd := h.startTrace(w, r) - defer traceEnd() - w, statsEnd := h.startStats(w, r) - defer statsEnd(&tags) - handler := h.Handler - if handler == nil { - handler = http.DefaultServeMux - } - r = r.WithContext(context.WithValue(r.Context(), addedTagsKey{}, &tags)) - handler.ServeHTTP(w, r) -} - -func (h *Handler) startTrace(w http.ResponseWriter, r *http.Request) (*http.Request, func()) { - if h.IsHealthEndpoint != nil && h.IsHealthEndpoint(r) || isHealthEndpoint(r.URL.Path) { - return r, func() {} - } - var name string - if h.FormatSpanName == nil { - name = spanNameFromURL(r) - } else { - name = h.FormatSpanName(r) - } - ctx := r.Context() - - startOpts := h.StartOptions - if h.GetStartOptions != nil { - startOpts = h.GetStartOptions(r) - } - - var span *trace.Span - sc, ok := h.extractSpanContext(r) - if ok && !h.IsPublicEndpoint { - ctx, span = trace.StartSpanWithRemoteParent(ctx, name, sc, - trace.WithSampler(startOpts.Sampler), - trace.WithSpanKind(trace.SpanKindServer)) - } else { - ctx, span = trace.StartSpan(ctx, name, - trace.WithSampler(startOpts.Sampler), - trace.WithSpanKind(trace.SpanKindServer), - ) - if ok { - span.AddLink(trace.Link{ - TraceID: sc.TraceID, - SpanID: sc.SpanID, - Type: trace.LinkTypeParent, - Attributes: nil, - }) - } - } - span.AddAttributes(requestAttrs(r)...) - if r.Body == nil { - // TODO: Handle cases where ContentLength is not set. - } else if r.ContentLength > 0 { - span.AddMessageReceiveEvent(0, /* TODO: messageID */ - r.ContentLength, -1) - } - return r.WithContext(ctx), span.End -} - -func (h *Handler) extractSpanContext(r *http.Request) (trace.SpanContext, bool) { - if h.Propagation == nil { - return defaultFormat.SpanContextFromRequest(r) - } - return h.Propagation.SpanContextFromRequest(r) -} - -func (h *Handler) startStats(w http.ResponseWriter, r *http.Request) (http.ResponseWriter, func(tags *addedTags)) { - ctx, _ := tag.New(r.Context(), - tag.Upsert(Host, r.Host), - tag.Upsert(Path, r.URL.Path), - tag.Upsert(Method, r.Method)) - track := &trackingResponseWriter{ - start: time.Now(), - ctx: ctx, - writer: w, - } - if r.Body == nil { - // TODO: Handle cases where ContentLength is not set. - track.reqSize = -1 - } else if r.ContentLength > 0 { - track.reqSize = r.ContentLength - } - stats.Record(ctx, ServerRequestCount.M(1)) - return track.wrappedResponseWriter(), track.end -} - -type trackingResponseWriter struct { - ctx context.Context - reqSize int64 - respSize int64 - start time.Time - statusCode int - statusLine string - endOnce sync.Once - writer http.ResponseWriter -} - -// Compile time assertion for ResponseWriter interface -var _ http.ResponseWriter = (*trackingResponseWriter)(nil) - -func (t *trackingResponseWriter) end(tags *addedTags) { - t.endOnce.Do(func() { - if t.statusCode == 0 { - t.statusCode = 200 - } - - span := trace.FromContext(t.ctx) - span.SetStatus(TraceStatus(t.statusCode, t.statusLine)) - span.AddAttributes(trace.Int64Attribute(StatusCodeAttribute, int64(t.statusCode))) - - m := []stats.Measurement{ - ServerLatency.M(float64(time.Since(t.start)) / float64(time.Millisecond)), - ServerResponseBytes.M(t.respSize), - } - if t.reqSize >= 0 { - m = append(m, ServerRequestBytes.M(t.reqSize)) - } - allTags := make([]tag.Mutator, len(tags.t)+1) - allTags[0] = tag.Upsert(StatusCode, strconv.Itoa(t.statusCode)) - copy(allTags[1:], tags.t) - stats.RecordWithTags(t.ctx, allTags, m...) - }) -} - -func (t *trackingResponseWriter) Header() http.Header { - return t.writer.Header() -} - -func (t *trackingResponseWriter) Write(data []byte) (int, error) { - n, err := t.writer.Write(data) - t.respSize += int64(n) - // Add message event for request bytes sent. - span := trace.FromContext(t.ctx) - span.AddMessageSendEvent(0 /* TODO: messageID */, int64(n), -1) - return n, err -} - -func (t *trackingResponseWriter) WriteHeader(statusCode int) { - t.writer.WriteHeader(statusCode) - t.statusCode = statusCode - t.statusLine = http.StatusText(t.statusCode) -} - -// wrappedResponseWriter returns a wrapped version of the original -// ResponseWriter and only implements the same combination of additional -// interfaces as the original. -// This implementation is based on https://github.com/felixge/httpsnoop. -func (t *trackingResponseWriter) wrappedResponseWriter() http.ResponseWriter { - var ( - hj, i0 = t.writer.(http.Hijacker) - cn, i1 = t.writer.(http.CloseNotifier) - pu, i2 = t.writer.(http.Pusher) - fl, i3 = t.writer.(http.Flusher) - rf, i4 = t.writer.(io.ReaderFrom) - ) - - switch { - case !i0 && !i1 && !i2 && !i3 && !i4: - return struct { - http.ResponseWriter - }{t} - case !i0 && !i1 && !i2 && !i3 && i4: - return struct { - http.ResponseWriter - io.ReaderFrom - }{t, rf} - case !i0 && !i1 && !i2 && i3 && !i4: - return struct { - http.ResponseWriter - http.Flusher - }{t, fl} - case !i0 && !i1 && !i2 && i3 && i4: - return struct { - http.ResponseWriter - http.Flusher - io.ReaderFrom - }{t, fl, rf} - case !i0 && !i1 && i2 && !i3 && !i4: - return struct { - http.ResponseWriter - http.Pusher - }{t, pu} - case !i0 && !i1 && i2 && !i3 && i4: - return struct { - http.ResponseWriter - http.Pusher - io.ReaderFrom - }{t, pu, rf} - case !i0 && !i1 && i2 && i3 && !i4: - return struct { - http.ResponseWriter - http.Pusher - http.Flusher - }{t, pu, fl} - case !i0 && !i1 && i2 && i3 && i4: - return struct { - http.ResponseWriter - http.Pusher - http.Flusher - io.ReaderFrom - }{t, pu, fl, rf} - case !i0 && i1 && !i2 && !i3 && !i4: - return struct { - http.ResponseWriter - http.CloseNotifier - }{t, cn} - case !i0 && i1 && !i2 && !i3 && i4: - return struct { - http.ResponseWriter - http.CloseNotifier - io.ReaderFrom - }{t, cn, rf} - case !i0 && i1 && !i2 && i3 && !i4: - return struct { - http.ResponseWriter - http.CloseNotifier - http.Flusher - }{t, cn, fl} - case !i0 && i1 && !i2 && i3 && i4: - return struct { - http.ResponseWriter - http.CloseNotifier - http.Flusher - io.ReaderFrom - }{t, cn, fl, rf} - case !i0 && i1 && i2 && !i3 && !i4: - return struct { - http.ResponseWriter - http.CloseNotifier - http.Pusher - }{t, cn, pu} - case !i0 && i1 && i2 && !i3 && i4: - return struct { - http.ResponseWriter - http.CloseNotifier - http.Pusher - io.ReaderFrom - }{t, cn, pu, rf} - case !i0 && i1 && i2 && i3 && !i4: - return struct { - http.ResponseWriter - http.CloseNotifier - http.Pusher - http.Flusher - }{t, cn, pu, fl} - case !i0 && i1 && i2 && i3 && i4: - return struct { - http.ResponseWriter - http.CloseNotifier - http.Pusher - http.Flusher - io.ReaderFrom - }{t, cn, pu, fl, rf} - case i0 && !i1 && !i2 && !i3 && !i4: - return struct { - http.ResponseWriter - http.Hijacker - }{t, hj} - case i0 && !i1 && !i2 && !i3 && i4: - return struct { - http.ResponseWriter - http.Hijacker - io.ReaderFrom - }{t, hj, rf} - case i0 && !i1 && !i2 && i3 && !i4: - return struct { - http.ResponseWriter - http.Hijacker - http.Flusher - }{t, hj, fl} - case i0 && !i1 && !i2 && i3 && i4: - return struct { - http.ResponseWriter - http.Hijacker - http.Flusher - io.ReaderFrom - }{t, hj, fl, rf} - case i0 && !i1 && i2 && !i3 && !i4: - return struct { - http.ResponseWriter - http.Hijacker - http.Pusher - }{t, hj, pu} - case i0 && !i1 && i2 && !i3 && i4: - return struct { - http.ResponseWriter - http.Hijacker - http.Pusher - io.ReaderFrom - }{t, hj, pu, rf} - case i0 && !i1 && i2 && i3 && !i4: - return struct { - http.ResponseWriter - http.Hijacker - http.Pusher - http.Flusher - }{t, hj, pu, fl} - case i0 && !i1 && i2 && i3 && i4: - return struct { - http.ResponseWriter - http.Hijacker - http.Pusher - http.Flusher - io.ReaderFrom - }{t, hj, pu, fl, rf} - case i0 && i1 && !i2 && !i3 && !i4: - return struct { - http.ResponseWriter - http.Hijacker - http.CloseNotifier - }{t, hj, cn} - case i0 && i1 && !i2 && !i3 && i4: - return struct { - http.ResponseWriter - http.Hijacker - http.CloseNotifier - io.ReaderFrom - }{t, hj, cn, rf} - case i0 && i1 && !i2 && i3 && !i4: - return struct { - http.ResponseWriter - http.Hijacker - http.CloseNotifier - http.Flusher - }{t, hj, cn, fl} - case i0 && i1 && !i2 && i3 && i4: - return struct { - http.ResponseWriter - http.Hijacker - http.CloseNotifier - http.Flusher - io.ReaderFrom - }{t, hj, cn, fl, rf} - case i0 && i1 && i2 && !i3 && !i4: - return struct { - http.ResponseWriter - http.Hijacker - http.CloseNotifier - http.Pusher - }{t, hj, cn, pu} - case i0 && i1 && i2 && !i3 && i4: - return struct { - http.ResponseWriter - http.Hijacker - http.CloseNotifier - http.Pusher - io.ReaderFrom - }{t, hj, cn, pu, rf} - case i0 && i1 && i2 && i3 && !i4: - return struct { - http.ResponseWriter - http.Hijacker - http.CloseNotifier - http.Pusher - http.Flusher - }{t, hj, cn, pu, fl} - case i0 && i1 && i2 && i3 && i4: - return struct { - http.ResponseWriter - http.Hijacker - http.CloseNotifier - http.Pusher - http.Flusher - io.ReaderFrom - }{t, hj, cn, pu, fl, rf} - default: - return struct { - http.ResponseWriter - }{t} - } -} diff --git a/vendor/go.opencensus.io/plugin/ochttp/span_annotating_client_trace.go b/vendor/go.opencensus.io/plugin/ochttp/span_annotating_client_trace.go deleted file mode 100644 index 05c6c56cc..000000000 --- a/vendor/go.opencensus.io/plugin/ochttp/span_annotating_client_trace.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package ochttp - -import ( - "crypto/tls" - "net/http" - "net/http/httptrace" - "strings" - - "go.opencensus.io/trace" -) - -type spanAnnotator struct { - sp *trace.Span -} - -// TODO: Remove NewSpanAnnotator at the next release. - -// NewSpanAnnotator returns a httptrace.ClientTrace which annotates -// all emitted httptrace events on the provided Span. -// Deprecated: Use NewSpanAnnotatingClientTrace instead -func NewSpanAnnotator(r *http.Request, s *trace.Span) *httptrace.ClientTrace { - return NewSpanAnnotatingClientTrace(r, s) -} - -// NewSpanAnnotatingClientTrace returns a httptrace.ClientTrace which annotates -// all emitted httptrace events on the provided Span. -func NewSpanAnnotatingClientTrace(_ *http.Request, s *trace.Span) *httptrace.ClientTrace { - sa := spanAnnotator{sp: s} - - return &httptrace.ClientTrace{ - GetConn: sa.getConn, - GotConn: sa.gotConn, - PutIdleConn: sa.putIdleConn, - GotFirstResponseByte: sa.gotFirstResponseByte, - Got100Continue: sa.got100Continue, - DNSStart: sa.dnsStart, - DNSDone: sa.dnsDone, - ConnectStart: sa.connectStart, - ConnectDone: sa.connectDone, - TLSHandshakeStart: sa.tlsHandshakeStart, - TLSHandshakeDone: sa.tlsHandshakeDone, - WroteHeaders: sa.wroteHeaders, - Wait100Continue: sa.wait100Continue, - WroteRequest: sa.wroteRequest, - } -} - -func (s spanAnnotator) getConn(hostPort string) { - attrs := []trace.Attribute{ - trace.StringAttribute("httptrace.get_connection.host_port", hostPort), - } - s.sp.Annotate(attrs, "GetConn") -} - -func (s spanAnnotator) gotConn(info httptrace.GotConnInfo) { - attrs := []trace.Attribute{ - trace.BoolAttribute("httptrace.got_connection.reused", info.Reused), - trace.BoolAttribute("httptrace.got_connection.was_idle", info.WasIdle), - } - if info.WasIdle { - attrs = append(attrs, - trace.StringAttribute("httptrace.got_connection.idle_time", info.IdleTime.String())) - } - s.sp.Annotate(attrs, "GotConn") -} - -// PutIdleConn implements a httptrace.ClientTrace hook -func (s spanAnnotator) putIdleConn(err error) { - var attrs []trace.Attribute - if err != nil { - attrs = append(attrs, - trace.StringAttribute("httptrace.put_idle_connection.error", err.Error())) - } - s.sp.Annotate(attrs, "PutIdleConn") -} - -func (s spanAnnotator) gotFirstResponseByte() { - s.sp.Annotate(nil, "GotFirstResponseByte") -} - -func (s spanAnnotator) got100Continue() { - s.sp.Annotate(nil, "Got100Continue") -} - -func (s spanAnnotator) dnsStart(info httptrace.DNSStartInfo) { - attrs := []trace.Attribute{ - trace.StringAttribute("httptrace.dns_start.host", info.Host), - } - s.sp.Annotate(attrs, "DNSStart") -} - -func (s spanAnnotator) dnsDone(info httptrace.DNSDoneInfo) { - var addrs []string - for _, addr := range info.Addrs { - addrs = append(addrs, addr.String()) - } - attrs := []trace.Attribute{ - trace.StringAttribute("httptrace.dns_done.addrs", strings.Join(addrs, " , ")), - } - if info.Err != nil { - attrs = append(attrs, - trace.StringAttribute("httptrace.dns_done.error", info.Err.Error())) - } - s.sp.Annotate(attrs, "DNSDone") -} - -func (s spanAnnotator) connectStart(network, addr string) { - attrs := []trace.Attribute{ - trace.StringAttribute("httptrace.connect_start.network", network), - trace.StringAttribute("httptrace.connect_start.addr", addr), - } - s.sp.Annotate(attrs, "ConnectStart") -} - -func (s spanAnnotator) connectDone(network, addr string, err error) { - attrs := []trace.Attribute{ - trace.StringAttribute("httptrace.connect_done.network", network), - trace.StringAttribute("httptrace.connect_done.addr", addr), - } - if err != nil { - attrs = append(attrs, - trace.StringAttribute("httptrace.connect_done.error", err.Error())) - } - s.sp.Annotate(attrs, "ConnectDone") -} - -func (s spanAnnotator) tlsHandshakeStart() { - s.sp.Annotate(nil, "TLSHandshakeStart") -} - -func (s spanAnnotator) tlsHandshakeDone(_ tls.ConnectionState, err error) { - var attrs []trace.Attribute - if err != nil { - attrs = append(attrs, - trace.StringAttribute("httptrace.tls_handshake_done.error", err.Error())) - } - s.sp.Annotate(attrs, "TLSHandshakeDone") -} - -func (s spanAnnotator) wroteHeaders() { - s.sp.Annotate(nil, "WroteHeaders") -} - -func (s spanAnnotator) wait100Continue() { - s.sp.Annotate(nil, "Wait100Continue") -} - -func (s spanAnnotator) wroteRequest(info httptrace.WroteRequestInfo) { - var attrs []trace.Attribute - if info.Err != nil { - attrs = append(attrs, - trace.StringAttribute("httptrace.wrote_request.error", info.Err.Error())) - } - s.sp.Annotate(attrs, "WroteRequest") -} diff --git a/vendor/go.opencensus.io/plugin/ochttp/stats.go b/vendor/go.opencensus.io/plugin/ochttp/stats.go deleted file mode 100644 index ee3729040..000000000 --- a/vendor/go.opencensus.io/plugin/ochttp/stats.go +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package ochttp - -import ( - "go.opencensus.io/stats" - "go.opencensus.io/stats/view" - "go.opencensus.io/tag" -) - -// Deprecated: client HTTP measures. -var ( - // Deprecated: Use a Count aggregation over one of the other client measures to achieve the same effect. - ClientRequestCount = stats.Int64( - "opencensus.io/http/client/request_count", - "Number of HTTP requests started", - stats.UnitDimensionless) - // Deprecated: Use ClientSentBytes. - ClientRequestBytes = stats.Int64( - "opencensus.io/http/client/request_bytes", - "HTTP request body size if set as ContentLength (uncompressed)", - stats.UnitBytes) - // Deprecated: Use ClientReceivedBytes. - ClientResponseBytes = stats.Int64( - "opencensus.io/http/client/response_bytes", - "HTTP response body size (uncompressed)", - stats.UnitBytes) - // Deprecated: Use ClientRoundtripLatency. - ClientLatency = stats.Float64( - "opencensus.io/http/client/latency", - "End-to-end latency", - stats.UnitMilliseconds) -) - -// The following client HTTP measures are supported for use in custom views. -var ( - ClientSentBytes = stats.Int64( - "opencensus.io/http/client/sent_bytes", - "Total bytes sent in request body (not including headers)", - stats.UnitBytes, - ) - ClientReceivedBytes = stats.Int64( - "opencensus.io/http/client/received_bytes", - "Total bytes received in response bodies (not including headers but including error responses with bodies)", - stats.UnitBytes, - ) - ClientRoundtripLatency = stats.Float64( - "opencensus.io/http/client/roundtrip_latency", - "Time between first byte of request headers sent to last byte of response received, or terminal error", - stats.UnitMilliseconds, - ) -) - -// The following server HTTP measures are supported for use in custom views: -var ( - ServerRequestCount = stats.Int64( - "opencensus.io/http/server/request_count", - "Number of HTTP requests started", - stats.UnitDimensionless) - ServerRequestBytes = stats.Int64( - "opencensus.io/http/server/request_bytes", - "HTTP request body size if set as ContentLength (uncompressed)", - stats.UnitBytes) - ServerResponseBytes = stats.Int64( - "opencensus.io/http/server/response_bytes", - "HTTP response body size (uncompressed)", - stats.UnitBytes) - ServerLatency = stats.Float64( - "opencensus.io/http/server/latency", - "End-to-end latency", - stats.UnitMilliseconds) -) - -// The following tags are applied to stats recorded by this package. Host, Path -// and Method are applied to all measures. StatusCode is not applied to -// ClientRequestCount or ServerRequestCount, since it is recorded before the status is known. -var ( - // Host is the value of the HTTP Host header. - // - // The value of this tag can be controlled by the HTTP client, so you need - // to watch out for potentially generating high-cardinality labels in your - // metrics backend if you use this tag in views. - Host = tag.MustNewKey("http.host") - - // StatusCode is the numeric HTTP response status code, - // or "error" if a transport error occurred and no status code was read. - StatusCode = tag.MustNewKey("http.status") - - // Path is the URL path (not including query string) in the request. - // - // The value of this tag can be controlled by the HTTP client, so you need - // to watch out for potentially generating high-cardinality labels in your - // metrics backend if you use this tag in views. - Path = tag.MustNewKey("http.path") - - // Method is the HTTP method of the request, capitalized (GET, POST, etc.). - Method = tag.MustNewKey("http.method") - - // KeyServerRoute is a low cardinality string representing the logical - // handler of the request. This is usually the pattern registered on the a - // ServeMux (or similar string). - KeyServerRoute = tag.MustNewKey("http_server_route") -) - -// Client tag keys. -var ( - // KeyClientMethod is the HTTP method, capitalized (i.e. GET, POST, PUT, DELETE, etc.). - KeyClientMethod = tag.MustNewKey("http_client_method") - // KeyClientPath is the URL path (not including query string). - KeyClientPath = tag.MustNewKey("http_client_path") - // KeyClientStatus is the HTTP status code as an integer (e.g. 200, 404, 500.), or "error" if no response status line was received. - KeyClientStatus = tag.MustNewKey("http_client_status") - // KeyClientHost is the value of the request Host header. - KeyClientHost = tag.MustNewKey("http_client_host") -) - -// Default distributions used by views in this package. -var ( - DefaultSizeDistribution = view.Distribution(1024, 2048, 4096, 16384, 65536, 262144, 1048576, 4194304, 16777216, 67108864, 268435456, 1073741824, 4294967296) - DefaultLatencyDistribution = view.Distribution(1, 2, 3, 4, 5, 6, 8, 10, 13, 16, 20, 25, 30, 40, 50, 65, 80, 100, 130, 160, 200, 250, 300, 400, 500, 650, 800, 1000, 2000, 5000, 10000, 20000, 50000, 100000) -) - -// Package ochttp provides some convenience views for client measures. -// You still need to register these views for data to actually be collected. -var ( - ClientSentBytesDistribution = &view.View{ - Name: "opencensus.io/http/client/sent_bytes", - Measure: ClientSentBytes, - Aggregation: DefaultSizeDistribution, - Description: "Total bytes sent in request body (not including headers), by HTTP method and response status", - TagKeys: []tag.Key{KeyClientMethod, KeyClientStatus}, - } - - ClientReceivedBytesDistribution = &view.View{ - Name: "opencensus.io/http/client/received_bytes", - Measure: ClientReceivedBytes, - Aggregation: DefaultSizeDistribution, - Description: "Total bytes received in response bodies (not including headers but including error responses with bodies), by HTTP method and response status", - TagKeys: []tag.Key{KeyClientMethod, KeyClientStatus}, - } - - ClientRoundtripLatencyDistribution = &view.View{ - Name: "opencensus.io/http/client/roundtrip_latency", - Measure: ClientRoundtripLatency, - Aggregation: DefaultLatencyDistribution, - Description: "End-to-end latency, by HTTP method and response status", - TagKeys: []tag.Key{KeyClientMethod, KeyClientStatus}, - } - - ClientCompletedCount = &view.View{ - Name: "opencensus.io/http/client/completed_count", - Measure: ClientRoundtripLatency, - Aggregation: view.Count(), - Description: "Count of completed requests, by HTTP method and response status", - TagKeys: []tag.Key{KeyClientMethod, KeyClientStatus}, - } -) - -// Deprecated: Old client Views. -var ( - // Deprecated: No direct replacement, but see ClientCompletedCount. - ClientRequestCountView = &view.View{ - Name: "opencensus.io/http/client/request_count", - Description: "Count of HTTP requests started", - Measure: ClientRequestCount, - Aggregation: view.Count(), - } - - // Deprecated: Use ClientSentBytesDistribution. - ClientRequestBytesView = &view.View{ - Name: "opencensus.io/http/client/request_bytes", - Description: "Size distribution of HTTP request body", - Measure: ClientSentBytes, - Aggregation: DefaultSizeDistribution, - } - - // Deprecated: Use ClientReceivedBytesDistribution instead. - ClientResponseBytesView = &view.View{ - Name: "opencensus.io/http/client/response_bytes", - Description: "Size distribution of HTTP response body", - Measure: ClientReceivedBytes, - Aggregation: DefaultSizeDistribution, - } - - // Deprecated: Use ClientRoundtripLatencyDistribution instead. - ClientLatencyView = &view.View{ - Name: "opencensus.io/http/client/latency", - Description: "Latency distribution of HTTP requests", - Measure: ClientRoundtripLatency, - Aggregation: DefaultLatencyDistribution, - } - - // Deprecated: Use ClientCompletedCount instead. - ClientRequestCountByMethod = &view.View{ - Name: "opencensus.io/http/client/request_count_by_method", - Description: "Client request count by HTTP method", - TagKeys: []tag.Key{Method}, - Measure: ClientSentBytes, - Aggregation: view.Count(), - } - - // Deprecated: Use ClientCompletedCount instead. - ClientResponseCountByStatusCode = &view.View{ - Name: "opencensus.io/http/client/response_count_by_status_code", - Description: "Client response count by status code", - TagKeys: []tag.Key{StatusCode}, - Measure: ClientRoundtripLatency, - Aggregation: view.Count(), - } -) - -// Package ochttp provides some convenience views for server measures. -// You still need to register these views for data to actually be collected. -var ( - ServerRequestCountView = &view.View{ - Name: "opencensus.io/http/server/request_count", - Description: "Count of HTTP requests started", - Measure: ServerRequestCount, - Aggregation: view.Count(), - } - - ServerRequestBytesView = &view.View{ - Name: "opencensus.io/http/server/request_bytes", - Description: "Size distribution of HTTP request body", - Measure: ServerRequestBytes, - Aggregation: DefaultSizeDistribution, - } - - ServerResponseBytesView = &view.View{ - Name: "opencensus.io/http/server/response_bytes", - Description: "Size distribution of HTTP response body", - Measure: ServerResponseBytes, - Aggregation: DefaultSizeDistribution, - } - - ServerLatencyView = &view.View{ - Name: "opencensus.io/http/server/latency", - Description: "Latency distribution of HTTP requests", - Measure: ServerLatency, - Aggregation: DefaultLatencyDistribution, - } - - ServerRequestCountByMethod = &view.View{ - Name: "opencensus.io/http/server/request_count_by_method", - Description: "Server request count by HTTP method", - TagKeys: []tag.Key{Method}, - Measure: ServerRequestCount, - Aggregation: view.Count(), - } - - ServerResponseCountByStatusCode = &view.View{ - Name: "opencensus.io/http/server/response_count_by_status_code", - Description: "Server response count by status code", - TagKeys: []tag.Key{StatusCode}, - Measure: ServerLatency, - Aggregation: view.Count(), - } -) - -// DefaultClientViews are the default client views provided by this package. -// Deprecated: No replacement. Register the views you would like individually. -var DefaultClientViews = []*view.View{ - ClientRequestCountView, - ClientRequestBytesView, - ClientResponseBytesView, - ClientLatencyView, - ClientRequestCountByMethod, - ClientResponseCountByStatusCode, -} - -// DefaultServerViews are the default server views provided by this package. -// Deprecated: No replacement. Register the views you would like individually. -var DefaultServerViews = []*view.View{ - ServerRequestCountView, - ServerRequestBytesView, - ServerResponseBytesView, - ServerLatencyView, - ServerRequestCountByMethod, - ServerResponseCountByStatusCode, -} diff --git a/vendor/go.opencensus.io/plugin/ochttp/trace.go b/vendor/go.opencensus.io/plugin/ochttp/trace.go deleted file mode 100644 index ed3a5db56..000000000 --- a/vendor/go.opencensus.io/plugin/ochttp/trace.go +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package ochttp - -import ( - "io" - "net/http" - "net/http/httptrace" - - "go.opencensus.io/plugin/ochttp/propagation/b3" - "go.opencensus.io/trace" - "go.opencensus.io/trace/propagation" -) - -// TODO(jbd): Add godoc examples. - -var defaultFormat propagation.HTTPFormat = &b3.HTTPFormat{} - -// Attributes recorded on the span for the requests. -// Only trace exporters will need them. -const ( - HostAttribute = "http.host" - MethodAttribute = "http.method" - PathAttribute = "http.path" - URLAttribute = "http.url" - UserAgentAttribute = "http.user_agent" - StatusCodeAttribute = "http.status_code" -) - -type traceTransport struct { - base http.RoundTripper - startOptions trace.StartOptions - format propagation.HTTPFormat - formatSpanName func(*http.Request) string - newClientTrace func(*http.Request, *trace.Span) *httptrace.ClientTrace -} - -// TODO(jbd): Add message events for request and response size. - -// RoundTrip creates a trace.Span and inserts it into the outgoing request's headers. -// The created span can follow a parent span, if a parent is presented in -// the request's context. -func (t *traceTransport) RoundTrip(req *http.Request) (*http.Response, error) { - name := t.formatSpanName(req) - // TODO(jbd): Discuss whether we want to prefix - // outgoing requests with Sent. - ctx, span := trace.StartSpan(req.Context(), name, - trace.WithSampler(t.startOptions.Sampler), - trace.WithSpanKind(trace.SpanKindClient)) - - if t.newClientTrace != nil { - req = req.WithContext(httptrace.WithClientTrace(ctx, t.newClientTrace(req, span))) - } else { - req = req.WithContext(ctx) - } - - if t.format != nil { - // SpanContextToRequest will modify its Request argument, which is - // contrary to the contract for http.RoundTripper, so we need to - // pass it a copy of the Request. - // However, the Request struct itself was already copied by - // the WithContext calls above and so we just need to copy the header. - header := make(http.Header) - for k, v := range req.Header { - header[k] = v - } - req.Header = header - t.format.SpanContextToRequest(span.SpanContext(), req) - } - - span.AddAttributes(requestAttrs(req)...) - resp, err := t.base.RoundTrip(req) - if err != nil { - span.SetStatus(trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}) - span.End() - return resp, err - } - - span.AddAttributes(responseAttrs(resp)...) - span.SetStatus(TraceStatus(resp.StatusCode, resp.Status)) - - // span.End() will be invoked after - // a read from resp.Body returns io.EOF or when - // resp.Body.Close() is invoked. - bt := &bodyTracker{rc: resp.Body, span: span} - resp.Body = wrappedBody(bt, resp.Body) - return resp, err -} - -// bodyTracker wraps a response.Body and invokes -// trace.EndSpan on encountering io.EOF on reading -// the body of the original response. -type bodyTracker struct { - rc io.ReadCloser - span *trace.Span -} - -var _ io.ReadCloser = (*bodyTracker)(nil) - -func (bt *bodyTracker) Read(b []byte) (int, error) { - n, err := bt.rc.Read(b) - - switch err { - case nil: - return n, nil - case io.EOF: - bt.span.End() - default: - // For all other errors, set the span status - bt.span.SetStatus(trace.Status{ - // Code 2 is the error code for Internal server error. - Code: 2, - Message: err.Error(), - }) - } - return n, err -} - -func (bt *bodyTracker) Close() error { - // Invoking endSpan on Close will help catch the cases - // in which a read returned a non-nil error, we set the - // span status but didn't end the span. - bt.span.End() - return bt.rc.Close() -} - -// CancelRequest cancels an in-flight request by closing its connection. -func (t *traceTransport) CancelRequest(req *http.Request) { - type canceler interface { - CancelRequest(*http.Request) - } - if cr, ok := t.base.(canceler); ok { - cr.CancelRequest(req) - } -} - -func spanNameFromURL(req *http.Request) string { - return req.URL.Path -} - -func requestAttrs(r *http.Request) []trace.Attribute { - userAgent := r.UserAgent() - - attrs := make([]trace.Attribute, 0, 5) - attrs = append(attrs, - trace.StringAttribute(PathAttribute, r.URL.Path), - trace.StringAttribute(URLAttribute, r.URL.String()), - trace.StringAttribute(HostAttribute, r.Host), - trace.StringAttribute(MethodAttribute, r.Method), - ) - - if userAgent != "" { - attrs = append(attrs, trace.StringAttribute(UserAgentAttribute, userAgent)) - } - - return attrs -} - -func responseAttrs(resp *http.Response) []trace.Attribute { - return []trace.Attribute{ - trace.Int64Attribute(StatusCodeAttribute, int64(resp.StatusCode)), - } -} - -// TraceStatus is a utility to convert the HTTP status code to a trace.Status that -// represents the outcome as closely as possible. -func TraceStatus(httpStatusCode int, statusLine string) trace.Status { - var code int32 - if httpStatusCode < 200 || httpStatusCode >= 400 { - code = trace.StatusCodeUnknown - } - switch httpStatusCode { - case 499: - code = trace.StatusCodeCancelled - case http.StatusBadRequest: - code = trace.StatusCodeInvalidArgument - case http.StatusUnprocessableEntity: - code = trace.StatusCodeInvalidArgument - case http.StatusGatewayTimeout: - code = trace.StatusCodeDeadlineExceeded - case http.StatusNotFound: - code = trace.StatusCodeNotFound - case http.StatusForbidden: - code = trace.StatusCodePermissionDenied - case http.StatusUnauthorized: // 401 is actually unauthenticated. - code = trace.StatusCodeUnauthenticated - case http.StatusTooManyRequests: - code = trace.StatusCodeResourceExhausted - case http.StatusNotImplemented: - code = trace.StatusCodeUnimplemented - case http.StatusServiceUnavailable: - code = trace.StatusCodeUnavailable - case http.StatusOK: - code = trace.StatusCodeOK - case http.StatusConflict: - code = trace.StatusCodeAlreadyExists - } - - return trace.Status{Code: code, Message: codeToStr[code]} -} - -var codeToStr = map[int32]string{ - trace.StatusCodeOK: `OK`, - trace.StatusCodeCancelled: `CANCELLED`, - trace.StatusCodeUnknown: `UNKNOWN`, - trace.StatusCodeInvalidArgument: `INVALID_ARGUMENT`, - trace.StatusCodeDeadlineExceeded: `DEADLINE_EXCEEDED`, - trace.StatusCodeNotFound: `NOT_FOUND`, - trace.StatusCodeAlreadyExists: `ALREADY_EXISTS`, - trace.StatusCodePermissionDenied: `PERMISSION_DENIED`, - trace.StatusCodeResourceExhausted: `RESOURCE_EXHAUSTED`, - trace.StatusCodeFailedPrecondition: `FAILED_PRECONDITION`, - trace.StatusCodeAborted: `ABORTED`, - trace.StatusCodeOutOfRange: `OUT_OF_RANGE`, - trace.StatusCodeUnimplemented: `UNIMPLEMENTED`, - trace.StatusCodeInternal: `INTERNAL`, - trace.StatusCodeUnavailable: `UNAVAILABLE`, - trace.StatusCodeDataLoss: `DATA_LOSS`, - trace.StatusCodeUnauthenticated: `UNAUTHENTICATED`, -} - -func isHealthEndpoint(path string) bool { - // Health checking is pretty frequent and - // traces collected for health endpoints - // can be extremely noisy and expensive. - // Disable canonical health checking endpoints - // like /healthz and /_ah/health for now. - if path == "/healthz" || path == "/_ah/health" { - return true - } - return false -} diff --git a/vendor/go.opencensus.io/plugin/ochttp/wrapped_body.go b/vendor/go.opencensus.io/plugin/ochttp/wrapped_body.go deleted file mode 100644 index 7d75cae2b..000000000 --- a/vendor/go.opencensus.io/plugin/ochttp/wrapped_body.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package ochttp - -import ( - "io" -) - -// wrappedBody returns a wrapped version of the original -// Body and only implements the same combination of additional -// interfaces as the original. -func wrappedBody(wrapper io.ReadCloser, body io.ReadCloser) io.ReadCloser { - var ( - wr, i0 = body.(io.Writer) - ) - switch { - case !i0: - return struct { - io.ReadCloser - }{wrapper} - - case i0: - return struct { - io.ReadCloser - io.Writer - }{wrapper, wr} - default: - return struct { - io.ReadCloser - }{wrapper} - } -} diff --git a/vendor/go.opencensus.io/resource/resource.go b/vendor/go.opencensus.io/resource/resource.go deleted file mode 100644 index b1764e1d3..000000000 --- a/vendor/go.opencensus.io/resource/resource.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package resource provides functionality for resource, which capture -// identifying information about the entities for which signals are exported. -package resource - -import ( - "context" - "fmt" - "os" - "regexp" - "sort" - "strconv" - "strings" -) - -// Environment variables used by FromEnv to decode a resource. -const ( - EnvVarType = "OC_RESOURCE_TYPE" - EnvVarLabels = "OC_RESOURCE_LABELS" -) - -// Resource describes an entity about which identifying information and metadata is exposed. -// For example, a type "k8s.io/container" may hold labels describing the pod name and namespace. -type Resource struct { - Type string - Labels map[string]string -} - -// EncodeLabels encodes a labels map to a string as provided via the OC_RESOURCE_LABELS environment variable. -func EncodeLabels(labels map[string]string) string { - sortedKeys := make([]string, 0, len(labels)) - for k := range labels { - sortedKeys = append(sortedKeys, k) - } - sort.Strings(sortedKeys) - - s := "" - for i, k := range sortedKeys { - if i > 0 { - s += "," - } - s += k + "=" + strconv.Quote(labels[k]) - } - return s -} - -var labelRegex = regexp.MustCompile(`^\s*([[:ascii:]]{1,256}?)=("[[:ascii:]]{0,256}?")\s*,`) - -// DecodeLabels decodes a serialized label map as used in the OC_RESOURCE_LABELS variable. -// A list of labels of the form `="",="",...` is accepted. -// Domain names and paths are accepted as label keys. -// Most users will want to use FromEnv instead. -func DecodeLabels(s string) (map[string]string, error) { - m := map[string]string{} - // Ensure a trailing comma, which allows us to keep the regex simpler - s = strings.TrimRight(strings.TrimSpace(s), ",") + "," - - for len(s) > 0 { - match := labelRegex.FindStringSubmatch(s) - if len(match) == 0 { - return nil, fmt.Errorf("invalid label formatting, remainder: %s", s) - } - v := match[2] - if v == "" { - v = match[3] - } else { - var err error - if v, err = strconv.Unquote(v); err != nil { - return nil, fmt.Errorf("invalid label formatting, remainder: %s, err: %s", s, err) - } - } - m[match[1]] = v - - s = s[len(match[0]):] - } - return m, nil -} - -// FromEnv is a detector that loads resource information from the OC_RESOURCE_TYPE -// and OC_RESOURCE_labelS environment variables. -func FromEnv(context.Context) (*Resource, error) { - res := &Resource{ - Type: strings.TrimSpace(os.Getenv(EnvVarType)), - } - labels := strings.TrimSpace(os.Getenv(EnvVarLabels)) - if labels == "" { - return res, nil - } - var err error - if res.Labels, err = DecodeLabels(labels); err != nil { - return nil, err - } - return res, nil -} - -var _ Detector = FromEnv - -// merge resource information from b into a. In case of a collision, a takes precedence. -func merge(a, b *Resource) *Resource { - if a == nil { - return b - } - if b == nil { - return a - } - res := &Resource{ - Type: a.Type, - Labels: map[string]string{}, - } - if res.Type == "" { - res.Type = b.Type - } - for k, v := range b.Labels { - res.Labels[k] = v - } - // Labels from resource a overwrite labels from resource b. - for k, v := range a.Labels { - res.Labels[k] = v - } - return res -} - -// Detector attempts to detect resource information. -// If the detector cannot find resource information, the returned resource is nil but no -// error is returned. -// An error is only returned on unexpected failures. -type Detector func(context.Context) (*Resource, error) - -// MultiDetector returns a Detector that calls all input detectors in order and -// merges each result with the previous one. In case a type of label key is already set, -// the first set value is takes precedence. -// It returns on the first error that a sub-detector encounters. -func MultiDetector(detectors ...Detector) Detector { - return func(ctx context.Context) (*Resource, error) { - return detectAll(ctx, detectors...) - } -} - -// detectall calls all input detectors sequentially an merges each result with the previous one. -// It returns on the first error that a sub-detector encounters. -func detectAll(ctx context.Context, detectors ...Detector) (*Resource, error) { - var res *Resource - for _, d := range detectors { - r, err := d(ctx) - if err != nil { - return nil, err - } - res = merge(res, r) - } - return res, nil -} diff --git a/vendor/go.opencensus.io/resource/resourcekeys/const.go b/vendor/go.opencensus.io/resource/resourcekeys/const.go deleted file mode 100644 index 1f2246662..000000000 --- a/vendor/go.opencensus.io/resource/resourcekeys/const.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package resourcekeys contains well known type and label keys for resources. -package resourcekeys // import "go.opencensus.io/resource/resourcekeys" - -// Constants for Kubernetes resources. -const ( - K8SType = "k8s" - - // A uniquely identifying name for the Kubernetes cluster. Kubernetes - // does not have cluster names as an internal concept so this may be - // set to any meaningful value within the environment. For example, - // GKE clusters have a name which can be used for this label. - K8SKeyClusterName = "k8s.cluster.name" - K8SKeyNamespaceName = "k8s.namespace.name" - K8SKeyPodName = "k8s.pod.name" - K8SKeyDeploymentName = "k8s.deployment.name" -) - -// Constants for Container resources. -const ( - ContainerType = "container" - - // A uniquely identifying name for the Container. - ContainerKeyName = "container.name" - ContainerKeyImageName = "container.image.name" - ContainerKeyImageTag = "container.image.tag" -) - -// Constants for Cloud resources. -const ( - CloudType = "cloud" - - CloudKeyProvider = "cloud.provider" - CloudKeyAccountID = "cloud.account.id" - CloudKeyRegion = "cloud.region" - CloudKeyZone = "cloud.zone" - - // Cloud Providers - CloudProviderAWS = "aws" - CloudProviderGCP = "gcp" - CloudProviderAZURE = "azure" -) - -// Constants for Host resources. -const ( - HostType = "host" - - // A uniquely identifying name for the host. - HostKeyName = "host.name" - - // A hostname as returned by the 'hostname' command on host machine. - HostKeyHostName = "host.hostname" - HostKeyID = "host.id" - HostKeyType = "host.type" -) diff --git a/vendor/go.opencensus.io/stats/doc.go b/vendor/go.opencensus.io/stats/doc.go deleted file mode 100644 index 00d473ee0..000000000 --- a/vendor/go.opencensus.io/stats/doc.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -/* -Package stats contains support for OpenCensus stats recording. - -OpenCensus allows users to create typed measures, record measurements, -aggregate the collected data, and export the aggregated data. - -Measures - -A measure represents a type of data point to be tracked and recorded. -For example, latency, request Mb/s, and response Mb/s are measures -to collect from a server. - -Measure constructors such as Int64 and Float64 automatically -register the measure by the given name. Each registered measure needs -to be unique by name. Measures also have a description and a unit. - -Libraries can define and export measures. Application authors can then -create views and collect and break down measures by the tags they are -interested in. - -Recording measurements - -Measurement is a data point to be collected for a measure. For example, -for a latency (ms) measure, 100 is a measurement that represents a 100ms -latency event. Measurements are created from measures with -the current context. Tags from the current context are recorded with the -measurements if they are any. - -Recorded measurements are dropped immediately if no views are registered for them. -There is usually no need to conditionally enable and disable -recording to reduce cost. Recording of measurements is cheap. - -Libraries can always record measurements, and applications can later decide -on which measurements they want to collect by registering views. This allows -libraries to turn on the instrumentation by default. - -Exemplars - -For a given recorded measurement, the associated exemplar is a diagnostic map -that gives more information about the measurement. - -When aggregated using a Distribution aggregation, an exemplar is kept for each -bucket in the Distribution. This allows you to easily find an example of a -measurement that fell into each bucket. - -For example, if you also use the OpenCensus trace package and you -record a measurement with a context that contains a sampled trace span, -then the trace span will be added to the exemplar associated with the measurement. - -When exported to a supporting back end, you should be able to easily navigate -to example traces that fell into each bucket in the Distribution. - -*/ -package stats // import "go.opencensus.io/stats" diff --git a/vendor/go.opencensus.io/stats/internal/record.go b/vendor/go.opencensus.io/stats/internal/record.go deleted file mode 100644 index 36935e629..000000000 --- a/vendor/go.opencensus.io/stats/internal/record.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package internal - -import ( - "go.opencensus.io/tag" -) - -// DefaultRecorder will be called for each Record call. -var DefaultRecorder func(tags *tag.Map, measurement interface{}, attachments map[string]interface{}) - -// SubscriptionReporter reports when a view subscribed with a measure. -var SubscriptionReporter func(measure string) diff --git a/vendor/go.opencensus.io/stats/measure.go b/vendor/go.opencensus.io/stats/measure.go deleted file mode 100644 index 1ffd3cefc..000000000 --- a/vendor/go.opencensus.io/stats/measure.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package stats - -import ( - "sync" - "sync/atomic" -) - -// Measure represents a single numeric value to be tracked and recorded. -// For example, latency, request bytes, and response bytes could be measures -// to collect from a server. -// -// Measures by themselves have no outside effects. In order to be exported, -// the measure needs to be used in a View. If no Views are defined over a -// measure, there is very little cost in recording it. -type Measure interface { - // Name returns the name of this measure. - // - // Measure names are globally unique (among all libraries linked into your program). - // We recommend prefixing the measure name with a domain name relevant to your - // project or application. - // - // Measure names are never sent over the wire or exported to backends. - // They are only used to create Views. - Name() string - - // Description returns the human-readable description of this measure. - Description() string - - // Unit returns the units for the values this measure takes on. - // - // Units are encoded according to the case-sensitive abbreviations from the - // Unified Code for Units of Measure: http://unitsofmeasure.org/ucum.html - Unit() string -} - -// measureDescriptor is the untyped descriptor associated with each measure. -// Int64Measure and Float64Measure wrap measureDescriptor to provide typed -// recording APIs. -// Two Measures with the same name will have the same measureDescriptor. -type measureDescriptor struct { - subs int32 // access atomically - - name string - description string - unit string -} - -func (m *measureDescriptor) subscribe() { - atomic.StoreInt32(&m.subs, 1) -} - -func (m *measureDescriptor) subscribed() bool { - return atomic.LoadInt32(&m.subs) == 1 -} - -var ( - mu sync.RWMutex - measures = make(map[string]*measureDescriptor) -) - -func registerMeasureHandle(name, desc, unit string) *measureDescriptor { - mu.Lock() - defer mu.Unlock() - - if stored, ok := measures[name]; ok { - return stored - } - m := &measureDescriptor{ - name: name, - description: desc, - unit: unit, - } - measures[name] = m - return m -} - -// Measurement is the numeric value measured when recording stats. Each measure -// provides methods to create measurements of their kind. For example, Int64Measure -// provides M to convert an int64 into a measurement. -type Measurement struct { - v float64 - m Measure - desc *measureDescriptor -} - -// Value returns the value of the Measurement as a float64. -func (m Measurement) Value() float64 { - return m.v -} - -// Measure returns the Measure from which this Measurement was created. -func (m Measurement) Measure() Measure { - return m.m -} diff --git a/vendor/go.opencensus.io/stats/measure_float64.go b/vendor/go.opencensus.io/stats/measure_float64.go deleted file mode 100644 index f02c1eda8..000000000 --- a/vendor/go.opencensus.io/stats/measure_float64.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package stats - -// Float64Measure is a measure for float64 values. -type Float64Measure struct { - desc *measureDescriptor -} - -// M creates a new float64 measurement. -// Use Record to record measurements. -func (m *Float64Measure) M(v float64) Measurement { - return Measurement{ - m: m, - desc: m.desc, - v: v, - } -} - -// Float64 creates a new measure for float64 values. -// -// See the documentation for interface Measure for more guidance on the -// parameters of this function. -func Float64(name, description, unit string) *Float64Measure { - mi := registerMeasureHandle(name, description, unit) - return &Float64Measure{mi} -} - -// Name returns the name of the measure. -func (m *Float64Measure) Name() string { - return m.desc.name -} - -// Description returns the description of the measure. -func (m *Float64Measure) Description() string { - return m.desc.description -} - -// Unit returns the unit of the measure. -func (m *Float64Measure) Unit() string { - return m.desc.unit -} diff --git a/vendor/go.opencensus.io/stats/measure_int64.go b/vendor/go.opencensus.io/stats/measure_int64.go deleted file mode 100644 index d101d7973..000000000 --- a/vendor/go.opencensus.io/stats/measure_int64.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package stats - -// Int64Measure is a measure for int64 values. -type Int64Measure struct { - desc *measureDescriptor -} - -// M creates a new int64 measurement. -// Use Record to record measurements. -func (m *Int64Measure) M(v int64) Measurement { - return Measurement{ - m: m, - desc: m.desc, - v: float64(v), - } -} - -// Int64 creates a new measure for int64 values. -// -// See the documentation for interface Measure for more guidance on the -// parameters of this function. -func Int64(name, description, unit string) *Int64Measure { - mi := registerMeasureHandle(name, description, unit) - return &Int64Measure{mi} -} - -// Name returns the name of the measure. -func (m *Int64Measure) Name() string { - return m.desc.name -} - -// Description returns the description of the measure. -func (m *Int64Measure) Description() string { - return m.desc.description -} - -// Unit returns the unit of the measure. -func (m *Int64Measure) Unit() string { - return m.desc.unit -} diff --git a/vendor/go.opencensus.io/stats/record.go b/vendor/go.opencensus.io/stats/record.go deleted file mode 100644 index ad4691184..000000000 --- a/vendor/go.opencensus.io/stats/record.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package stats - -import ( - "context" - - "go.opencensus.io/metric/metricdata" - "go.opencensus.io/stats/internal" - "go.opencensus.io/tag" -) - -func init() { - internal.SubscriptionReporter = func(measure string) { - mu.Lock() - measures[measure].subscribe() - mu.Unlock() - } -} - -type recordOptions struct { - attachments metricdata.Attachments - mutators []tag.Mutator - measurements []Measurement -} - -// WithAttachments applies provided exemplar attachments. -func WithAttachments(attachments metricdata.Attachments) Options { - return func(ro *recordOptions) { - ro.attachments = attachments - } -} - -// WithTags applies provided tag mutators. -func WithTags(mutators ...tag.Mutator) Options { - return func(ro *recordOptions) { - ro.mutators = mutators - } -} - -// WithMeasurements applies provided measurements. -func WithMeasurements(measurements ...Measurement) Options { - return func(ro *recordOptions) { - ro.measurements = measurements - } -} - -// Options apply changes to recordOptions. -type Options func(*recordOptions) - -func createRecordOption(ros ...Options) *recordOptions { - o := &recordOptions{} - for _, ro := range ros { - ro(o) - } - return o -} - -// Record records one or multiple measurements with the same context at once. -// If there are any tags in the context, measurements will be tagged with them. -func Record(ctx context.Context, ms ...Measurement) { - RecordWithOptions(ctx, WithMeasurements(ms...)) -} - -// RecordWithTags records one or multiple measurements at once. -// -// Measurements will be tagged with the tags in the context mutated by the mutators. -// RecordWithTags is useful if you want to record with tag mutations but don't want -// to propagate the mutations in the context. -func RecordWithTags(ctx context.Context, mutators []tag.Mutator, ms ...Measurement) error { - return RecordWithOptions(ctx, WithTags(mutators...), WithMeasurements(ms...)) -} - -// RecordWithOptions records measurements from the given options (if any) against context -// and tags and attachments in the options (if any). -// If there are any tags in the context, measurements will be tagged with them. -func RecordWithOptions(ctx context.Context, ros ...Options) error { - o := createRecordOption(ros...) - if len(o.measurements) == 0 { - return nil - } - recorder := internal.DefaultRecorder - if recorder == nil { - return nil - } - record := false - for _, m := range o.measurements { - if m.desc.subscribed() { - record = true - break - } - } - if !record { - return nil - } - if len(o.mutators) > 0 { - var err error - if ctx, err = tag.New(ctx, o.mutators...); err != nil { - return err - } - } - recorder(tag.FromContext(ctx), o.measurements, o.attachments) - return nil -} diff --git a/vendor/go.opencensus.io/stats/units.go b/vendor/go.opencensus.io/stats/units.go deleted file mode 100644 index 736399652..000000000 --- a/vendor/go.opencensus.io/stats/units.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package stats - -// Units are encoded according to the case-sensitive abbreviations from the -// Unified Code for Units of Measure: http://unitsofmeasure.org/ucum.html -const ( - UnitNone = "1" // Deprecated: Use UnitDimensionless. - UnitDimensionless = "1" - UnitBytes = "By" - UnitMilliseconds = "ms" - UnitSeconds = "s" -) diff --git a/vendor/go.opencensus.io/stats/view/aggregation.go b/vendor/go.opencensus.io/stats/view/aggregation.go deleted file mode 100644 index 9d7093728..000000000 --- a/vendor/go.opencensus.io/stats/view/aggregation.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package view - -// AggType represents the type of aggregation function used on a View. -type AggType int - -// All available aggregation types. -const ( - AggTypeNone AggType = iota // no aggregation; reserved for future use. - AggTypeCount // the count aggregation, see Count. - AggTypeSum // the sum aggregation, see Sum. - AggTypeDistribution // the distribution aggregation, see Distribution. - AggTypeLastValue // the last value aggregation, see LastValue. -) - -func (t AggType) String() string { - return aggTypeName[t] -} - -var aggTypeName = map[AggType]string{ - AggTypeNone: "None", - AggTypeCount: "Count", - AggTypeSum: "Sum", - AggTypeDistribution: "Distribution", - AggTypeLastValue: "LastValue", -} - -// Aggregation represents a data aggregation method. Use one of the functions: -// Count, Sum, or Distribution to construct an Aggregation. -type Aggregation struct { - Type AggType // Type is the AggType of this Aggregation. - Buckets []float64 // Buckets are the bucket endpoints if this Aggregation represents a distribution, see Distribution. - - newData func() AggregationData -} - -var ( - aggCount = &Aggregation{ - Type: AggTypeCount, - newData: func() AggregationData { - return &CountData{} - }, - } - aggSum = &Aggregation{ - Type: AggTypeSum, - newData: func() AggregationData { - return &SumData{} - }, - } -) - -// Count indicates that data collected and aggregated -// with this method will be turned into a count value. -// For example, total number of accepted requests can be -// aggregated by using Count. -func Count() *Aggregation { - return aggCount -} - -// Sum indicates that data collected and aggregated -// with this method will be summed up. -// For example, accumulated request bytes can be aggregated by using -// Sum. -func Sum() *Aggregation { - return aggSum -} - -// Distribution indicates that the desired aggregation is -// a histogram distribution. -// -// A distribution aggregation may contain a histogram of the values in the -// population. The bucket boundaries for that histogram are described -// by the bounds. This defines len(bounds)+1 buckets. -// -// If len(bounds) >= 2 then the boundaries for bucket index i are: -// -// [-infinity, bounds[i]) for i = 0 -// [bounds[i-1], bounds[i]) for 0 < i < length -// [bounds[i-1], +infinity) for i = length -// -// If len(bounds) is 0 then there is no histogram associated with the -// distribution. There will be a single bucket with boundaries -// (-infinity, +infinity). -// -// If len(bounds) is 1 then there is no finite buckets, and that single -// element is the common boundary of the overflow and underflow buckets. -func Distribution(bounds ...float64) *Aggregation { - agg := &Aggregation{ - Type: AggTypeDistribution, - Buckets: bounds, - } - agg.newData = func() AggregationData { - return newDistributionData(agg) - } - return agg -} - -// LastValue only reports the last value recorded using this -// aggregation. All other measurements will be dropped. -func LastValue() *Aggregation { - return &Aggregation{ - Type: AggTypeLastValue, - newData: func() AggregationData { - return &LastValueData{} - }, - } -} diff --git a/vendor/go.opencensus.io/stats/view/aggregation_data.go b/vendor/go.opencensus.io/stats/view/aggregation_data.go deleted file mode 100644 index f331d456e..000000000 --- a/vendor/go.opencensus.io/stats/view/aggregation_data.go +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package view - -import ( - "math" - "time" - - "go.opencensus.io/metric/metricdata" -) - -// AggregationData represents an aggregated value from a collection. -// They are reported on the view data during exporting. -// Mosts users won't directly access aggregration data. -type AggregationData interface { - isAggregationData() bool - addSample(v float64, attachments map[string]interface{}, t time.Time) - clone() AggregationData - equal(other AggregationData) bool - toPoint(t metricdata.Type, time time.Time) metricdata.Point -} - -const epsilon = 1e-9 - -// CountData is the aggregated data for the Count aggregation. -// A count aggregation processes data and counts the recordings. -// -// Most users won't directly access count data. -type CountData struct { - Value int64 -} - -func (a *CountData) isAggregationData() bool { return true } - -func (a *CountData) addSample(_ float64, _ map[string]interface{}, _ time.Time) { - a.Value = a.Value + 1 -} - -func (a *CountData) clone() AggregationData { - return &CountData{Value: a.Value} -} - -func (a *CountData) equal(other AggregationData) bool { - a2, ok := other.(*CountData) - if !ok { - return false - } - - return a.Value == a2.Value -} - -func (a *CountData) toPoint(metricType metricdata.Type, t time.Time) metricdata.Point { - switch metricType { - case metricdata.TypeCumulativeInt64: - return metricdata.NewInt64Point(t, a.Value) - default: - panic("unsupported metricdata.Type") - } -} - -// SumData is the aggregated data for the Sum aggregation. -// A sum aggregation processes data and sums up the recordings. -// -// Most users won't directly access sum data. -type SumData struct { - Value float64 -} - -func (a *SumData) isAggregationData() bool { return true } - -func (a *SumData) addSample(v float64, _ map[string]interface{}, _ time.Time) { - a.Value += v -} - -func (a *SumData) clone() AggregationData { - return &SumData{Value: a.Value} -} - -func (a *SumData) equal(other AggregationData) bool { - a2, ok := other.(*SumData) - if !ok { - return false - } - return math.Pow(a.Value-a2.Value, 2) < epsilon -} - -func (a *SumData) toPoint(metricType metricdata.Type, t time.Time) metricdata.Point { - switch metricType { - case metricdata.TypeCumulativeInt64: - return metricdata.NewInt64Point(t, int64(a.Value)) - case metricdata.TypeCumulativeFloat64: - return metricdata.NewFloat64Point(t, a.Value) - default: - panic("unsupported metricdata.Type") - } -} - -// DistributionData is the aggregated data for the -// Distribution aggregation. -// -// Most users won't directly access distribution data. -// -// For a distribution with N bounds, the associated DistributionData will have -// N+1 buckets. -type DistributionData struct { - Count int64 // number of data points aggregated - Min float64 // minimum value in the distribution - Max float64 // max value in the distribution - Mean float64 // mean of the distribution - SumOfSquaredDev float64 // sum of the squared deviation from the mean - CountPerBucket []int64 // number of occurrences per bucket - // ExemplarsPerBucket is slice the same length as CountPerBucket containing - // an exemplar for the associated bucket, or nil. - ExemplarsPerBucket []*metricdata.Exemplar - bounds []float64 // histogram distribution of the values -} - -func newDistributionData(agg *Aggregation) *DistributionData { - bucketCount := len(agg.Buckets) + 1 - return &DistributionData{ - CountPerBucket: make([]int64, bucketCount), - ExemplarsPerBucket: make([]*metricdata.Exemplar, bucketCount), - bounds: agg.Buckets, - Min: math.MaxFloat64, - Max: math.SmallestNonzeroFloat64, - } -} - -// Sum returns the sum of all samples collected. -func (a *DistributionData) Sum() float64 { return a.Mean * float64(a.Count) } - -func (a *DistributionData) variance() float64 { - if a.Count <= 1 { - return 0 - } - return a.SumOfSquaredDev / float64(a.Count-1) -} - -func (a *DistributionData) isAggregationData() bool { return true } - -// TODO(songy23): support exemplar attachments. -func (a *DistributionData) addSample(v float64, attachments map[string]interface{}, t time.Time) { - if v < a.Min { - a.Min = v - } - if v > a.Max { - a.Max = v - } - a.Count++ - a.addToBucket(v, attachments, t) - - if a.Count == 1 { - a.Mean = v - return - } - - oldMean := a.Mean - a.Mean = a.Mean + (v-a.Mean)/float64(a.Count) - a.SumOfSquaredDev = a.SumOfSquaredDev + (v-oldMean)*(v-a.Mean) -} - -func (a *DistributionData) addToBucket(v float64, attachments map[string]interface{}, t time.Time) { - var count *int64 - var i int - var b float64 - for i, b = range a.bounds { - if v < b { - count = &a.CountPerBucket[i] - break - } - } - if count == nil { // Last bucket. - i = len(a.bounds) - count = &a.CountPerBucket[i] - } - *count++ - if exemplar := getExemplar(v, attachments, t); exemplar != nil { - a.ExemplarsPerBucket[i] = exemplar - } -} - -func getExemplar(v float64, attachments map[string]interface{}, t time.Time) *metricdata.Exemplar { - if len(attachments) == 0 { - return nil - } - return &metricdata.Exemplar{ - Value: v, - Timestamp: t, - Attachments: attachments, - } -} - -func (a *DistributionData) clone() AggregationData { - c := *a - c.CountPerBucket = append([]int64(nil), a.CountPerBucket...) - c.ExemplarsPerBucket = append([]*metricdata.Exemplar(nil), a.ExemplarsPerBucket...) - return &c -} - -func (a *DistributionData) equal(other AggregationData) bool { - a2, ok := other.(*DistributionData) - if !ok { - return false - } - if a2 == nil { - return false - } - if len(a.CountPerBucket) != len(a2.CountPerBucket) { - return false - } - for i := range a.CountPerBucket { - if a.CountPerBucket[i] != a2.CountPerBucket[i] { - return false - } - } - return a.Count == a2.Count && a.Min == a2.Min && a.Max == a2.Max && math.Pow(a.Mean-a2.Mean, 2) < epsilon && math.Pow(a.variance()-a2.variance(), 2) < epsilon -} - -func (a *DistributionData) toPoint(metricType metricdata.Type, t time.Time) metricdata.Point { - switch metricType { - case metricdata.TypeCumulativeDistribution: - buckets := []metricdata.Bucket{} - for i := 0; i < len(a.CountPerBucket); i++ { - buckets = append(buckets, metricdata.Bucket{ - Count: a.CountPerBucket[i], - Exemplar: a.ExemplarsPerBucket[i], - }) - } - bucketOptions := &metricdata.BucketOptions{Bounds: a.bounds} - - val := &metricdata.Distribution{ - Count: a.Count, - Sum: a.Sum(), - SumOfSquaredDeviation: a.SumOfSquaredDev, - BucketOptions: bucketOptions, - Buckets: buckets, - } - return metricdata.NewDistributionPoint(t, val) - - default: - // TODO: [rghetia] when we have a use case for TypeGaugeDistribution. - panic("unsupported metricdata.Type") - } -} - -// LastValueData returns the last value recorded for LastValue aggregation. -type LastValueData struct { - Value float64 -} - -func (l *LastValueData) isAggregationData() bool { - return true -} - -func (l *LastValueData) addSample(v float64, _ map[string]interface{}, _ time.Time) { - l.Value = v -} - -func (l *LastValueData) clone() AggregationData { - return &LastValueData{l.Value} -} - -func (l *LastValueData) equal(other AggregationData) bool { - a2, ok := other.(*LastValueData) - if !ok { - return false - } - return l.Value == a2.Value -} - -func (l *LastValueData) toPoint(metricType metricdata.Type, t time.Time) metricdata.Point { - switch metricType { - case metricdata.TypeGaugeInt64: - return metricdata.NewInt64Point(t, int64(l.Value)) - case metricdata.TypeGaugeFloat64: - return metricdata.NewFloat64Point(t, l.Value) - default: - panic("unsupported metricdata.Type") - } -} diff --git a/vendor/go.opencensus.io/stats/view/collector.go b/vendor/go.opencensus.io/stats/view/collector.go deleted file mode 100644 index 8a6a2c0fd..000000000 --- a/vendor/go.opencensus.io/stats/view/collector.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package view - -import ( - "sort" - "time" - - "go.opencensus.io/internal/tagencoding" - "go.opencensus.io/tag" -) - -type collector struct { - // signatures holds the aggregations values for each unique tag signature - // (values for all keys) to its aggregator. - signatures map[string]AggregationData - // Aggregation is the description of the aggregation to perform for this - // view. - a *Aggregation -} - -func (c *collector) addSample(s string, v float64, attachments map[string]interface{}, t time.Time) { - aggregator, ok := c.signatures[s] - if !ok { - aggregator = c.a.newData() - c.signatures[s] = aggregator - } - aggregator.addSample(v, attachments, t) -} - -// collectRows returns a snapshot of the collected Row values. -func (c *collector) collectedRows(keys []tag.Key) []*Row { - rows := make([]*Row, 0, len(c.signatures)) - for sig, aggregator := range c.signatures { - tags := decodeTags([]byte(sig), keys) - row := &Row{Tags: tags, Data: aggregator.clone()} - rows = append(rows, row) - } - return rows -} - -func (c *collector) clearRows() { - c.signatures = make(map[string]AggregationData) -} - -// encodeWithKeys encodes the map by using values -// only associated with the keys provided. -func encodeWithKeys(m *tag.Map, keys []tag.Key) []byte { - vb := &tagencoding.Values{ - Buffer: make([]byte, len(keys)), - } - for _, k := range keys { - v, _ := m.Value(k) - vb.WriteValue([]byte(v)) - } - return vb.Bytes() -} - -// decodeTags decodes tags from the buffer and -// orders them by the keys. -func decodeTags(buf []byte, keys []tag.Key) []tag.Tag { - vb := &tagencoding.Values{Buffer: buf} - var tags []tag.Tag - for _, k := range keys { - v := vb.ReadValue() - if v != nil { - tags = append(tags, tag.Tag{Key: k, Value: string(v)}) - } - } - vb.ReadIndex = 0 - sort.Slice(tags, func(i, j int) bool { return tags[i].Key.Name() < tags[j].Key.Name() }) - return tags -} diff --git a/vendor/go.opencensus.io/stats/view/doc.go b/vendor/go.opencensus.io/stats/view/doc.go deleted file mode 100644 index 7bbedfe1f..000000000 --- a/vendor/go.opencensus.io/stats/view/doc.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -// Package view contains support for collecting and exposing aggregates over stats. -// -// In order to collect measurements, views need to be defined and registered. -// A view allows recorded measurements to be filtered and aggregated. -// -// All recorded measurements can be grouped by a list of tags. -// -// OpenCensus provides several aggregation methods: Count, Distribution and Sum. -// -// Count only counts the number of measurement points recorded. -// Distribution provides statistical summary of the aggregated data by counting -// how many recorded measurements fall into each bucket. -// Sum adds up the measurement values. -// LastValue just keeps track of the most recently recorded measurement value. -// All aggregations are cumulative. -// -// Views can be registered and unregistered at any time during program execution. -// -// Libraries can define views but it is recommended that in most cases registering -// views be left up to applications. -// -// Exporting -// -// Collected and aggregated data can be exported to a metric collection -// backend by registering its exporter. -// -// Multiple exporters can be registered to upload the data to various -// different back ends. -package view // import "go.opencensus.io/stats/view" - -// TODO(acetechnologist): Add a link to the language independent OpenCensus -// spec when it is available. diff --git a/vendor/go.opencensus.io/stats/view/export.go b/vendor/go.opencensus.io/stats/view/export.go deleted file mode 100644 index 7cb59718f..000000000 --- a/vendor/go.opencensus.io/stats/view/export.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package view - -import "sync" - -var ( - exportersMu sync.RWMutex // guards exporters - exporters = make(map[Exporter]struct{}) -) - -// Exporter exports the collected records as view data. -// -// The ExportView method should return quickly; if an -// Exporter takes a significant amount of time to -// process a Data, that work should be done on another goroutine. -// -// It is safe to assume that ExportView will not be called concurrently from -// multiple goroutines. -// -// The Data should not be modified. -type Exporter interface { - ExportView(viewData *Data) -} - -// RegisterExporter registers an exporter. -// Collected data will be reported via all the -// registered exporters. Once you no longer -// want data to be exported, invoke UnregisterExporter -// with the previously registered exporter. -// -// Binaries can register exporters, libraries shouldn't register exporters. -func RegisterExporter(e Exporter) { - exportersMu.Lock() - defer exportersMu.Unlock() - - exporters[e] = struct{}{} -} - -// UnregisterExporter unregisters an exporter. -func UnregisterExporter(e Exporter) { - exportersMu.Lock() - defer exportersMu.Unlock() - - delete(exporters, e) -} diff --git a/vendor/go.opencensus.io/stats/view/view.go b/vendor/go.opencensus.io/stats/view/view.go deleted file mode 100644 index 293b54ecb..000000000 --- a/vendor/go.opencensus.io/stats/view/view.go +++ /dev/null @@ -1,221 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package view - -import ( - "bytes" - "errors" - "fmt" - "reflect" - "sort" - "sync/atomic" - "time" - - "go.opencensus.io/metric/metricdata" - "go.opencensus.io/stats" - "go.opencensus.io/tag" -) - -// View allows users to aggregate the recorded stats.Measurements. -// Views need to be passed to the Register function before data will be -// collected and sent to Exporters. -type View struct { - Name string // Name of View. Must be unique. If unset, will default to the name of the Measure. - Description string // Description is a human-readable description for this view. - - // TagKeys are the tag keys describing the grouping of this view. - // A single Row will be produced for each combination of associated tag values. - TagKeys []tag.Key - - // Measure is a stats.Measure to aggregate in this view. - Measure stats.Measure - - // Aggregation is the aggregation function to apply to the set of Measurements. - Aggregation *Aggregation -} - -// WithName returns a copy of the View with a new name. This is useful for -// renaming views to cope with limitations placed on metric names by various -// backends. -func (v *View) WithName(name string) *View { - vNew := *v - vNew.Name = name - return &vNew -} - -// same compares two views and returns true if they represent the same aggregation. -func (v *View) same(other *View) bool { - if v == other { - return true - } - if v == nil { - return false - } - return reflect.DeepEqual(v.Aggregation, other.Aggregation) && - v.Measure.Name() == other.Measure.Name() -} - -// ErrNegativeBucketBounds error returned if histogram contains negative bounds. -// -// Deprecated: this should not be public. -var ErrNegativeBucketBounds = errors.New("negative bucket bounds not supported") - -// canonicalize canonicalizes v by setting explicit -// defaults for Name and Description and sorting the TagKeys -func (v *View) canonicalize() error { - if v.Measure == nil { - return fmt.Errorf("cannot register view %q: measure not set", v.Name) - } - if v.Aggregation == nil { - return fmt.Errorf("cannot register view %q: aggregation not set", v.Name) - } - if v.Name == "" { - v.Name = v.Measure.Name() - } - if v.Description == "" { - v.Description = v.Measure.Description() - } - if err := checkViewName(v.Name); err != nil { - return err - } - sort.Slice(v.TagKeys, func(i, j int) bool { - return v.TagKeys[i].Name() < v.TagKeys[j].Name() - }) - sort.Float64s(v.Aggregation.Buckets) - for _, b := range v.Aggregation.Buckets { - if b < 0 { - return ErrNegativeBucketBounds - } - } - // drop 0 bucket silently. - v.Aggregation.Buckets = dropZeroBounds(v.Aggregation.Buckets...) - - return nil -} - -func dropZeroBounds(bounds ...float64) []float64 { - for i, bound := range bounds { - if bound > 0 { - return bounds[i:] - } - } - return []float64{} -} - -// viewInternal is the internal representation of a View. -type viewInternal struct { - view *View // view is the canonicalized View definition associated with this view. - subscribed uint32 // 1 if someone is subscribed and data need to be exported, use atomic to access - collector *collector - metricDescriptor *metricdata.Descriptor -} - -func newViewInternal(v *View) (*viewInternal, error) { - return &viewInternal{ - view: v, - collector: &collector{make(map[string]AggregationData), v.Aggregation}, - metricDescriptor: viewToMetricDescriptor(v), - }, nil -} - -func (v *viewInternal) subscribe() { - atomic.StoreUint32(&v.subscribed, 1) -} - -func (v *viewInternal) unsubscribe() { - atomic.StoreUint32(&v.subscribed, 0) -} - -// isSubscribed returns true if the view is exporting -// data by subscription. -func (v *viewInternal) isSubscribed() bool { - return atomic.LoadUint32(&v.subscribed) == 1 -} - -func (v *viewInternal) clearRows() { - v.collector.clearRows() -} - -func (v *viewInternal) collectedRows() []*Row { - return v.collector.collectedRows(v.view.TagKeys) -} - -func (v *viewInternal) addSample(m *tag.Map, val float64, attachments map[string]interface{}, t time.Time) { - if !v.isSubscribed() { - return - } - sig := string(encodeWithKeys(m, v.view.TagKeys)) - v.collector.addSample(sig, val, attachments, t) -} - -// A Data is a set of rows about usage of the single measure associated -// with the given view. Each row is specific to a unique set of tags. -type Data struct { - View *View - Start, End time.Time - Rows []*Row -} - -// Row is the collected value for a specific set of key value pairs a.k.a tags. -type Row struct { - Tags []tag.Tag - Data AggregationData -} - -func (r *Row) String() string { - var buffer bytes.Buffer - buffer.WriteString("{ ") - buffer.WriteString("{ ") - for _, t := range r.Tags { - buffer.WriteString(fmt.Sprintf("{%v %v}", t.Key.Name(), t.Value)) - } - buffer.WriteString(" }") - buffer.WriteString(fmt.Sprintf("%v", r.Data)) - buffer.WriteString(" }") - return buffer.String() -} - -// Equal returns true if both rows are equal. Tags are expected to be ordered -// by the key name. Even if both rows have the same tags but the tags appear in -// different orders it will return false. -func (r *Row) Equal(other *Row) bool { - if r == other { - return true - } - return reflect.DeepEqual(r.Tags, other.Tags) && r.Data.equal(other.Data) -} - -const maxNameLength = 255 - -// Returns true if the given string contains only printable characters. -func isPrintable(str string) bool { - for _, r := range str { - if !(r >= ' ' && r <= '~') { - return false - } - } - return true -} - -func checkViewName(name string) error { - if len(name) > maxNameLength { - return fmt.Errorf("view name cannot be larger than %v", maxNameLength) - } - if !isPrintable(name) { - return fmt.Errorf("view name needs to be an ASCII string") - } - return nil -} diff --git a/vendor/go.opencensus.io/stats/view/view_to_metric.go b/vendor/go.opencensus.io/stats/view/view_to_metric.go deleted file mode 100644 index 293c1646d..000000000 --- a/vendor/go.opencensus.io/stats/view/view_to_metric.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package view - -import ( - "time" - - "go.opencensus.io/metric/metricdata" - "go.opencensus.io/stats" -) - -func getUnit(unit string) metricdata.Unit { - switch unit { - case "1": - return metricdata.UnitDimensionless - case "ms": - return metricdata.UnitMilliseconds - case "By": - return metricdata.UnitBytes - } - return metricdata.UnitDimensionless -} - -func getType(v *View) metricdata.Type { - m := v.Measure - agg := v.Aggregation - - switch agg.Type { - case AggTypeSum: - switch m.(type) { - case *stats.Int64Measure: - return metricdata.TypeCumulativeInt64 - case *stats.Float64Measure: - return metricdata.TypeCumulativeFloat64 - default: - panic("unexpected measure type") - } - case AggTypeDistribution: - return metricdata.TypeCumulativeDistribution - case AggTypeLastValue: - switch m.(type) { - case *stats.Int64Measure: - return metricdata.TypeGaugeInt64 - case *stats.Float64Measure: - return metricdata.TypeGaugeFloat64 - default: - panic("unexpected measure type") - } - case AggTypeCount: - switch m.(type) { - case *stats.Int64Measure: - return metricdata.TypeCumulativeInt64 - case *stats.Float64Measure: - return metricdata.TypeCumulativeInt64 - default: - panic("unexpected measure type") - } - default: - panic("unexpected aggregation type") - } -} - -func getLabelKeys(v *View) []metricdata.LabelKey { - labelKeys := []metricdata.LabelKey{} - for _, k := range v.TagKeys { - labelKeys = append(labelKeys, metricdata.LabelKey{Key: k.Name()}) - } - return labelKeys -} - -func viewToMetricDescriptor(v *View) *metricdata.Descriptor { - return &metricdata.Descriptor{ - Name: v.Name, - Description: v.Description, - Unit: convertUnit(v), - Type: getType(v), - LabelKeys: getLabelKeys(v), - } -} - -func convertUnit(v *View) metricdata.Unit { - switch v.Aggregation.Type { - case AggTypeCount: - return metricdata.UnitDimensionless - default: - return getUnit(v.Measure.Unit()) - } -} - -func toLabelValues(row *Row, expectedKeys []metricdata.LabelKey) []metricdata.LabelValue { - labelValues := []metricdata.LabelValue{} - tagMap := make(map[string]string) - for _, tag := range row.Tags { - tagMap[tag.Key.Name()] = tag.Value - } - - for _, key := range expectedKeys { - if val, ok := tagMap[key.Key]; ok { - labelValues = append(labelValues, metricdata.NewLabelValue(val)) - } else { - labelValues = append(labelValues, metricdata.LabelValue{}) - } - } - return labelValues -} - -func rowToTimeseries(v *viewInternal, row *Row, now time.Time, startTime time.Time) *metricdata.TimeSeries { - return &metricdata.TimeSeries{ - Points: []metricdata.Point{row.Data.toPoint(v.metricDescriptor.Type, now)}, - LabelValues: toLabelValues(row, v.metricDescriptor.LabelKeys), - StartTime: startTime, - } -} - -func viewToMetric(v *viewInternal, now time.Time, startTime time.Time) *metricdata.Metric { - if v.metricDescriptor.Type == metricdata.TypeGaugeInt64 || - v.metricDescriptor.Type == metricdata.TypeGaugeFloat64 { - startTime = time.Time{} - } - - rows := v.collectedRows() - if len(rows) == 0 { - return nil - } - - ts := []*metricdata.TimeSeries{} - for _, row := range rows { - ts = append(ts, rowToTimeseries(v, row, now, startTime)) - } - - m := &metricdata.Metric{ - Descriptor: *v.metricDescriptor, - TimeSeries: ts, - } - return m -} diff --git a/vendor/go.opencensus.io/stats/view/worker.go b/vendor/go.opencensus.io/stats/view/worker.go deleted file mode 100644 index 2f3c018af..000000000 --- a/vendor/go.opencensus.io/stats/view/worker.go +++ /dev/null @@ -1,281 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package view - -import ( - "fmt" - "sync" - "time" - - "go.opencensus.io/metric/metricdata" - "go.opencensus.io/metric/metricproducer" - "go.opencensus.io/stats" - "go.opencensus.io/stats/internal" - "go.opencensus.io/tag" -) - -func init() { - defaultWorker = newWorker() - go defaultWorker.start() - internal.DefaultRecorder = record -} - -type measureRef struct { - measure string - views map[*viewInternal]struct{} -} - -type worker struct { - measures map[string]*measureRef - views map[string]*viewInternal - startTimes map[*viewInternal]time.Time - - timer *time.Ticker - c chan command - quit, done chan bool - mu sync.RWMutex -} - -var defaultWorker *worker - -var defaultReportingDuration = 10 * time.Second - -// Find returns a registered view associated with this name. -// If no registered view is found, nil is returned. -func Find(name string) (v *View) { - req := &getViewByNameReq{ - name: name, - c: make(chan *getViewByNameResp), - } - defaultWorker.c <- req - resp := <-req.c - return resp.v -} - -// Register begins collecting data for the given views. -// Once a view is registered, it reports data to the registered exporters. -func Register(views ...*View) error { - req := ®isterViewReq{ - views: views, - err: make(chan error), - } - defaultWorker.c <- req - return <-req.err -} - -// Unregister the given views. Data will not longer be exported for these views -// after Unregister returns. -// It is not necessary to unregister from views you expect to collect for the -// duration of your program execution. -func Unregister(views ...*View) { - names := make([]string, len(views)) - for i := range views { - names[i] = views[i].Name - } - req := &unregisterFromViewReq{ - views: names, - done: make(chan struct{}), - } - defaultWorker.c <- req - <-req.done -} - -// RetrieveData gets a snapshot of the data collected for the the view registered -// with the given name. It is intended for testing only. -func RetrieveData(viewName string) ([]*Row, error) { - req := &retrieveDataReq{ - now: time.Now(), - v: viewName, - c: make(chan *retrieveDataResp), - } - defaultWorker.c <- req - resp := <-req.c - return resp.rows, resp.err -} - -func record(tags *tag.Map, ms interface{}, attachments map[string]interface{}) { - req := &recordReq{ - tm: tags, - ms: ms.([]stats.Measurement), - attachments: attachments, - t: time.Now(), - } - defaultWorker.c <- req -} - -// SetReportingPeriod sets the interval between reporting aggregated views in -// the program. If duration is less than or equal to zero, it enables the -// default behavior. -// -// Note: each exporter makes different promises about what the lowest supported -// duration is. For example, the Stackdriver exporter recommends a value no -// lower than 1 minute. Consult each exporter per your needs. -func SetReportingPeriod(d time.Duration) { - // TODO(acetechnologist): ensure that the duration d is more than a certain - // value. e.g. 1s - req := &setReportingPeriodReq{ - d: d, - c: make(chan bool), - } - defaultWorker.c <- req - <-req.c // don't return until the timer is set to the new duration. -} - -func newWorker() *worker { - return &worker{ - measures: make(map[string]*measureRef), - views: make(map[string]*viewInternal), - startTimes: make(map[*viewInternal]time.Time), - timer: time.NewTicker(defaultReportingDuration), - c: make(chan command, 1024), - quit: make(chan bool), - done: make(chan bool), - } -} - -func (w *worker) start() { - prodMgr := metricproducer.GlobalManager() - prodMgr.AddProducer(w) - - for { - select { - case cmd := <-w.c: - cmd.handleCommand(w) - case <-w.timer.C: - w.reportUsage(time.Now()) - case <-w.quit: - w.timer.Stop() - close(w.c) - w.done <- true - return - } - } -} - -func (w *worker) stop() { - prodMgr := metricproducer.GlobalManager() - prodMgr.DeleteProducer(w) - - w.quit <- true - <-w.done -} - -func (w *worker) getMeasureRef(name string) *measureRef { - if mr, ok := w.measures[name]; ok { - return mr - } - mr := &measureRef{ - measure: name, - views: make(map[*viewInternal]struct{}), - } - w.measures[name] = mr - return mr -} - -func (w *worker) tryRegisterView(v *View) (*viewInternal, error) { - w.mu.Lock() - defer w.mu.Unlock() - vi, err := newViewInternal(v) - if err != nil { - return nil, err - } - if x, ok := w.views[vi.view.Name]; ok { - if !x.view.same(vi.view) { - return nil, fmt.Errorf("cannot register view %q; a different view with the same name is already registered", v.Name) - } - - // the view is already registered so there is nothing to do and the - // command is considered successful. - return x, nil - } - w.views[vi.view.Name] = vi - ref := w.getMeasureRef(vi.view.Measure.Name()) - ref.views[vi] = struct{}{} - return vi, nil -} - -func (w *worker) unregisterView(viewName string) { - w.mu.Lock() - defer w.mu.Unlock() - delete(w.views, viewName) -} - -func (w *worker) reportView(v *viewInternal, now time.Time) { - if !v.isSubscribed() { - return - } - rows := v.collectedRows() - _, ok := w.startTimes[v] - if !ok { - w.startTimes[v] = now - } - viewData := &Data{ - View: v.view, - Start: w.startTimes[v], - End: time.Now(), - Rows: rows, - } - exportersMu.Lock() - for e := range exporters { - e.ExportView(viewData) - } - exportersMu.Unlock() -} - -func (w *worker) reportUsage(now time.Time) { - w.mu.Lock() - defer w.mu.Unlock() - for _, v := range w.views { - w.reportView(v, now) - } -} - -func (w *worker) toMetric(v *viewInternal, now time.Time) *metricdata.Metric { - if !v.isSubscribed() { - return nil - } - - _, ok := w.startTimes[v] - if !ok { - w.startTimes[v] = now - } - - var startTime time.Time - if v.metricDescriptor.Type == metricdata.TypeGaugeInt64 || - v.metricDescriptor.Type == metricdata.TypeGaugeFloat64 { - startTime = time.Time{} - } else { - startTime = w.startTimes[v] - } - - return viewToMetric(v, now, startTime) -} - -// Read reads all view data and returns them as metrics. -// It is typically invoked by metric reader to export stats in metric format. -func (w *worker) Read() []*metricdata.Metric { - w.mu.Lock() - defer w.mu.Unlock() - now := time.Now() - metrics := make([]*metricdata.Metric, 0, len(w.views)) - for _, v := range w.views { - metric := w.toMetric(v, now) - if metric != nil { - metrics = append(metrics, metric) - } - } - return metrics -} diff --git a/vendor/go.opencensus.io/stats/view/worker_commands.go b/vendor/go.opencensus.io/stats/view/worker_commands.go deleted file mode 100644 index 0267e179a..000000000 --- a/vendor/go.opencensus.io/stats/view/worker_commands.go +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package view - -import ( - "errors" - "fmt" - "strings" - "time" - - "go.opencensus.io/stats" - "go.opencensus.io/stats/internal" - "go.opencensus.io/tag" -) - -type command interface { - handleCommand(w *worker) -} - -// getViewByNameReq is the command to get a view given its name. -type getViewByNameReq struct { - name string - c chan *getViewByNameResp -} - -type getViewByNameResp struct { - v *View -} - -func (cmd *getViewByNameReq) handleCommand(w *worker) { - v := w.views[cmd.name] - if v == nil { - cmd.c <- &getViewByNameResp{nil} - return - } - cmd.c <- &getViewByNameResp{v.view} -} - -// registerViewReq is the command to register a view. -type registerViewReq struct { - views []*View - err chan error -} - -func (cmd *registerViewReq) handleCommand(w *worker) { - for _, v := range cmd.views { - if err := v.canonicalize(); err != nil { - cmd.err <- err - return - } - } - var errstr []string - for _, view := range cmd.views { - vi, err := w.tryRegisterView(view) - if err != nil { - errstr = append(errstr, fmt.Sprintf("%s: %v", view.Name, err)) - continue - } - internal.SubscriptionReporter(view.Measure.Name()) - vi.subscribe() - } - if len(errstr) > 0 { - cmd.err <- errors.New(strings.Join(errstr, "\n")) - } else { - cmd.err <- nil - } -} - -// unregisterFromViewReq is the command to unregister to a view. Has no -// impact on the data collection for client that are pulling data from the -// library. -type unregisterFromViewReq struct { - views []string - done chan struct{} -} - -func (cmd *unregisterFromViewReq) handleCommand(w *worker) { - for _, name := range cmd.views { - vi, ok := w.views[name] - if !ok { - continue - } - - // Report pending data for this view before removing it. - w.reportView(vi, time.Now()) - - vi.unsubscribe() - if !vi.isSubscribed() { - // this was the last subscription and view is not collecting anymore. - // The collected data can be cleared. - vi.clearRows() - } - w.unregisterView(name) - } - cmd.done <- struct{}{} -} - -// retrieveDataReq is the command to retrieve data for a view. -type retrieveDataReq struct { - now time.Time - v string - c chan *retrieveDataResp -} - -type retrieveDataResp struct { - rows []*Row - err error -} - -func (cmd *retrieveDataReq) handleCommand(w *worker) { - w.mu.Lock() - defer w.mu.Unlock() - vi, ok := w.views[cmd.v] - if !ok { - cmd.c <- &retrieveDataResp{ - nil, - fmt.Errorf("cannot retrieve data; view %q is not registered", cmd.v), - } - return - } - - if !vi.isSubscribed() { - cmd.c <- &retrieveDataResp{ - nil, - fmt.Errorf("cannot retrieve data; view %q has no subscriptions or collection is not forcibly started", cmd.v), - } - return - } - cmd.c <- &retrieveDataResp{ - vi.collectedRows(), - nil, - } -} - -// recordReq is the command to record data related to multiple measures -// at once. -type recordReq struct { - tm *tag.Map - ms []stats.Measurement - attachments map[string]interface{} - t time.Time -} - -func (cmd *recordReq) handleCommand(w *worker) { - w.mu.Lock() - defer w.mu.Unlock() - for _, m := range cmd.ms { - if (m == stats.Measurement{}) { // not registered - continue - } - ref := w.getMeasureRef(m.Measure().Name()) - for v := range ref.views { - v.addSample(cmd.tm, m.Value(), cmd.attachments, time.Now()) - } - } -} - -// setReportingPeriodReq is the command to modify the duration between -// reporting the collected data to the registered clients. -type setReportingPeriodReq struct { - d time.Duration - c chan bool -} - -func (cmd *setReportingPeriodReq) handleCommand(w *worker) { - w.timer.Stop() - if cmd.d <= 0 { - w.timer = time.NewTicker(defaultReportingDuration) - } else { - w.timer = time.NewTicker(cmd.d) - } - cmd.c <- true -} diff --git a/vendor/go.opencensus.io/tag/context.go b/vendor/go.opencensus.io/tag/context.go deleted file mode 100644 index b27d1b26b..000000000 --- a/vendor/go.opencensus.io/tag/context.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package tag - -import ( - "context" -) - -// FromContext returns the tag map stored in the context. -func FromContext(ctx context.Context) *Map { - // The returned tag map shouldn't be mutated. - ts := ctx.Value(mapCtxKey) - if ts == nil { - return nil - } - return ts.(*Map) -} - -// NewContext creates a new context with the given tag map. -// To propagate a tag map to downstream methods and downstream RPCs, add a tag map -// to the current context. NewContext will return a copy of the current context, -// and put the tag map into the returned one. -// If there is already a tag map in the current context, it will be replaced with m. -func NewContext(ctx context.Context, m *Map) context.Context { - return context.WithValue(ctx, mapCtxKey, m) -} - -type ctxKey struct{} - -var mapCtxKey = ctxKey{} diff --git a/vendor/go.opencensus.io/tag/doc.go b/vendor/go.opencensus.io/tag/doc.go deleted file mode 100644 index da16b74e4..000000000 --- a/vendor/go.opencensus.io/tag/doc.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -/* -Package tag contains OpenCensus tags. - -Tags are key-value pairs. Tags provide additional cardinality to -the OpenCensus instrumentation data. - -Tags can be propagated on the wire and in the same -process via context.Context. Encode and Decode should be -used to represent tags into their binary propagation form. -*/ -package tag // import "go.opencensus.io/tag" diff --git a/vendor/go.opencensus.io/tag/key.go b/vendor/go.opencensus.io/tag/key.go deleted file mode 100644 index 71ec91365..000000000 --- a/vendor/go.opencensus.io/tag/key.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package tag - -// Key represents a tag key. -type Key struct { - name string -} - -// NewKey creates or retrieves a string key identified by name. -// Calling NewKey more than once with the same name returns the same key. -func NewKey(name string) (Key, error) { - if !checkKeyName(name) { - return Key{}, errInvalidKeyName - } - return Key{name: name}, nil -} - -// MustNewKey returns a key with the given name, and panics if name is an invalid key name. -func MustNewKey(name string) Key { - k, err := NewKey(name) - if err != nil { - panic(err) - } - return k -} - -// Name returns the name of the key. -func (k Key) Name() string { - return k.name -} diff --git a/vendor/go.opencensus.io/tag/map.go b/vendor/go.opencensus.io/tag/map.go deleted file mode 100644 index 0272ef85a..000000000 --- a/vendor/go.opencensus.io/tag/map.go +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package tag - -import ( - "bytes" - "context" - "fmt" - "sort" -) - -// Tag is a key value pair that can be propagated on wire. -type Tag struct { - Key Key - Value string -} - -type tagContent struct { - value string - m metadatas -} - -// Map is a map of tags. Use New to create a context containing -// a new Map. -type Map struct { - m map[Key]tagContent -} - -// Value returns the value for the key if a value for the key exists. -func (m *Map) Value(k Key) (string, bool) { - if m == nil { - return "", false - } - v, ok := m.m[k] - return v.value, ok -} - -func (m *Map) String() string { - if m == nil { - return "nil" - } - keys := make([]Key, 0, len(m.m)) - for k := range m.m { - keys = append(keys, k) - } - sort.Slice(keys, func(i, j int) bool { return keys[i].Name() < keys[j].Name() }) - - var buffer bytes.Buffer - buffer.WriteString("{ ") - for _, k := range keys { - buffer.WriteString(fmt.Sprintf("{%v %v}", k.name, m.m[k])) - } - buffer.WriteString(" }") - return buffer.String() -} - -func (m *Map) insert(k Key, v string, md metadatas) { - if _, ok := m.m[k]; ok { - return - } - m.m[k] = tagContent{value: v, m: md} -} - -func (m *Map) update(k Key, v string, md metadatas) { - if _, ok := m.m[k]; ok { - m.m[k] = tagContent{value: v, m: md} - } -} - -func (m *Map) upsert(k Key, v string, md metadatas) { - m.m[k] = tagContent{value: v, m: md} -} - -func (m *Map) delete(k Key) { - delete(m.m, k) -} - -func newMap() *Map { - return &Map{m: make(map[Key]tagContent)} -} - -// Mutator modifies a tag map. -type Mutator interface { - Mutate(t *Map) (*Map, error) -} - -// Insert returns a mutator that inserts a -// value associated with k. If k already exists in the tag map, -// mutator doesn't update the value. -// Metadata applies metadata to the tag. It is optional. -// Metadatas are applied in the order in which it is provided. -// If more than one metadata updates the same attribute then -// the update from the last metadata prevails. -func Insert(k Key, v string, mds ...Metadata) Mutator { - return &mutator{ - fn: func(m *Map) (*Map, error) { - if !checkValue(v) { - return nil, errInvalidValue - } - m.insert(k, v, createMetadatas(mds...)) - return m, nil - }, - } -} - -// Update returns a mutator that updates the -// value of the tag associated with k with v. If k doesn't -// exists in the tag map, the mutator doesn't insert the value. -// Metadata applies metadata to the tag. It is optional. -// Metadatas are applied in the order in which it is provided. -// If more than one metadata updates the same attribute then -// the update from the last metadata prevails. -func Update(k Key, v string, mds ...Metadata) Mutator { - return &mutator{ - fn: func(m *Map) (*Map, error) { - if !checkValue(v) { - return nil, errInvalidValue - } - m.update(k, v, createMetadatas(mds...)) - return m, nil - }, - } -} - -// Upsert returns a mutator that upserts the -// value of the tag associated with k with v. It inserts the -// value if k doesn't exist already. It mutates the value -// if k already exists. -// Metadata applies metadata to the tag. It is optional. -// Metadatas are applied in the order in which it is provided. -// If more than one metadata updates the same attribute then -// the update from the last metadata prevails. -func Upsert(k Key, v string, mds ...Metadata) Mutator { - return &mutator{ - fn: func(m *Map) (*Map, error) { - if !checkValue(v) { - return nil, errInvalidValue - } - m.upsert(k, v, createMetadatas(mds...)) - return m, nil - }, - } -} - -func createMetadatas(mds ...Metadata) metadatas { - var metas metadatas - if len(mds) > 0 { - for _, md := range mds { - if md != nil { - md(&metas) - } - } - } else { - WithTTL(TTLUnlimitedPropagation)(&metas) - } - return metas - -} - -// Delete returns a mutator that deletes -// the value associated with k. -func Delete(k Key) Mutator { - return &mutator{ - fn: func(m *Map) (*Map, error) { - m.delete(k) - return m, nil - }, - } -} - -// New returns a new context that contains a tag map -// originated from the incoming context and modified -// with the provided mutators. -func New(ctx context.Context, mutator ...Mutator) (context.Context, error) { - m := newMap() - orig := FromContext(ctx) - if orig != nil { - for k, v := range orig.m { - if !checkKeyName(k.Name()) { - return ctx, fmt.Errorf("key:%q: %v", k, errInvalidKeyName) - } - if !checkValue(v.value) { - return ctx, fmt.Errorf("key:%q value:%q: %v", k.Name(), v, errInvalidValue) - } - m.insert(k, v.value, v.m) - } - } - var err error - for _, mod := range mutator { - m, err = mod.Mutate(m) - if err != nil { - return ctx, err - } - } - return NewContext(ctx, m), nil -} - -// Do is similar to pprof.Do: a convenience for installing the tags -// from the context as Go profiler labels. This allows you to -// correlated runtime profiling with stats. -// -// It converts the key/values from the given map to Go profiler labels -// and calls pprof.Do. -// -// Do is going to do nothing if your Go version is below 1.9. -func Do(ctx context.Context, f func(ctx context.Context)) { - do(ctx, f) -} - -type mutator struct { - fn func(t *Map) (*Map, error) -} - -func (m *mutator) Mutate(t *Map) (*Map, error) { - return m.fn(t) -} diff --git a/vendor/go.opencensus.io/tag/map_codec.go b/vendor/go.opencensus.io/tag/map_codec.go deleted file mode 100644 index c242e695c..000000000 --- a/vendor/go.opencensus.io/tag/map_codec.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package tag - -import ( - "encoding/binary" - "fmt" -) - -// KeyType defines the types of keys allowed. Currently only keyTypeString is -// supported. -type keyType byte - -const ( - keyTypeString keyType = iota - keyTypeInt64 - keyTypeTrue - keyTypeFalse - - tagsVersionID = byte(0) -) - -type encoderGRPC struct { - buf []byte - writeIdx, readIdx int -} - -// writeKeyString writes the fieldID '0' followed by the key string and value -// string. -func (eg *encoderGRPC) writeTagString(k, v string) { - eg.writeByte(byte(keyTypeString)) - eg.writeStringWithVarintLen(k) - eg.writeStringWithVarintLen(v) -} - -func (eg *encoderGRPC) writeTagUint64(k string, i uint64) { - eg.writeByte(byte(keyTypeInt64)) - eg.writeStringWithVarintLen(k) - eg.writeUint64(i) -} - -func (eg *encoderGRPC) writeTagTrue(k string) { - eg.writeByte(byte(keyTypeTrue)) - eg.writeStringWithVarintLen(k) -} - -func (eg *encoderGRPC) writeTagFalse(k string) { - eg.writeByte(byte(keyTypeFalse)) - eg.writeStringWithVarintLen(k) -} - -func (eg *encoderGRPC) writeBytesWithVarintLen(bytes []byte) { - length := len(bytes) - - eg.growIfRequired(binary.MaxVarintLen64 + length) - eg.writeIdx += binary.PutUvarint(eg.buf[eg.writeIdx:], uint64(length)) - copy(eg.buf[eg.writeIdx:], bytes) - eg.writeIdx += length -} - -func (eg *encoderGRPC) writeStringWithVarintLen(s string) { - length := len(s) - - eg.growIfRequired(binary.MaxVarintLen64 + length) - eg.writeIdx += binary.PutUvarint(eg.buf[eg.writeIdx:], uint64(length)) - copy(eg.buf[eg.writeIdx:], s) - eg.writeIdx += length -} - -func (eg *encoderGRPC) writeByte(v byte) { - eg.growIfRequired(1) - eg.buf[eg.writeIdx] = v - eg.writeIdx++ -} - -func (eg *encoderGRPC) writeUint32(i uint32) { - eg.growIfRequired(4) - binary.LittleEndian.PutUint32(eg.buf[eg.writeIdx:], i) - eg.writeIdx += 4 -} - -func (eg *encoderGRPC) writeUint64(i uint64) { - eg.growIfRequired(8) - binary.LittleEndian.PutUint64(eg.buf[eg.writeIdx:], i) - eg.writeIdx += 8 -} - -func (eg *encoderGRPC) readByte() byte { - b := eg.buf[eg.readIdx] - eg.readIdx++ - return b -} - -func (eg *encoderGRPC) readUint32() uint32 { - i := binary.LittleEndian.Uint32(eg.buf[eg.readIdx:]) - eg.readIdx += 4 - return i -} - -func (eg *encoderGRPC) readUint64() uint64 { - i := binary.LittleEndian.Uint64(eg.buf[eg.readIdx:]) - eg.readIdx += 8 - return i -} - -func (eg *encoderGRPC) readBytesWithVarintLen() ([]byte, error) { - if eg.readEnded() { - return nil, fmt.Errorf("unexpected end while readBytesWithVarintLen '%x' starting at idx '%v'", eg.buf, eg.readIdx) - } - length, valueStart := binary.Uvarint(eg.buf[eg.readIdx:]) - if valueStart <= 0 { - return nil, fmt.Errorf("unexpected end while readBytesWithVarintLen '%x' starting at idx '%v'", eg.buf, eg.readIdx) - } - - valueStart += eg.readIdx - valueEnd := valueStart + int(length) - if valueEnd > len(eg.buf) { - return nil, fmt.Errorf("malformed encoding: length:%v, upper:%v, maxLength:%v", length, valueEnd, len(eg.buf)) - } - - eg.readIdx = valueEnd - return eg.buf[valueStart:valueEnd], nil -} - -func (eg *encoderGRPC) readStringWithVarintLen() (string, error) { - bytes, err := eg.readBytesWithVarintLen() - if err != nil { - return "", err - } - return string(bytes), nil -} - -func (eg *encoderGRPC) growIfRequired(expected int) { - if len(eg.buf)-eg.writeIdx < expected { - tmp := make([]byte, 2*(len(eg.buf)+1)+expected) - copy(tmp, eg.buf) - eg.buf = tmp - } -} - -func (eg *encoderGRPC) readEnded() bool { - return eg.readIdx >= len(eg.buf) -} - -func (eg *encoderGRPC) bytes() []byte { - return eg.buf[:eg.writeIdx] -} - -// Encode encodes the tag map into a []byte. It is useful to propagate -// the tag maps on wire in binary format. -func Encode(m *Map) []byte { - if m == nil { - return nil - } - eg := &encoderGRPC{ - buf: make([]byte, len(m.m)), - } - eg.writeByte(tagsVersionID) - for k, v := range m.m { - if v.m.ttl.ttl == valueTTLUnlimitedPropagation { - eg.writeByte(byte(keyTypeString)) - eg.writeStringWithVarintLen(k.name) - eg.writeBytesWithVarintLen([]byte(v.value)) - } - } - return eg.bytes() -} - -// Decode decodes the given []byte into a tag map. -func Decode(bytes []byte) (*Map, error) { - ts := newMap() - err := DecodeEach(bytes, ts.upsert) - if err != nil { - // no partial failures - return nil, err - } - return ts, nil -} - -// DecodeEach decodes the given serialized tag map, calling handler for each -// tag key and value decoded. -func DecodeEach(bytes []byte, fn func(key Key, val string, md metadatas)) error { - eg := &encoderGRPC{ - buf: bytes, - } - if len(eg.buf) == 0 { - return nil - } - - version := eg.readByte() - if version > tagsVersionID { - return fmt.Errorf("cannot decode: unsupported version: %q; supports only up to: %q", version, tagsVersionID) - } - - for !eg.readEnded() { - typ := keyType(eg.readByte()) - - if typ != keyTypeString { - return fmt.Errorf("cannot decode: invalid key type: %q", typ) - } - - k, err := eg.readBytesWithVarintLen() - if err != nil { - return err - } - - v, err := eg.readBytesWithVarintLen() - if err != nil { - return err - } - - key, err := NewKey(string(k)) - if err != nil { - return err - } - val := string(v) - if !checkValue(val) { - return errInvalidValue - } - fn(key, val, createMetadatas(WithTTL(TTLUnlimitedPropagation))) - if err != nil { - return err - } - } - return nil -} diff --git a/vendor/go.opencensus.io/tag/metadata.go b/vendor/go.opencensus.io/tag/metadata.go deleted file mode 100644 index 6571a583e..000000000 --- a/vendor/go.opencensus.io/tag/metadata.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package tag - -const ( - // valueTTLNoPropagation prevents tag from propagating. - valueTTLNoPropagation = 0 - - // valueTTLUnlimitedPropagation allows tag to propagate without any limits on number of hops. - valueTTLUnlimitedPropagation = -1 -) - -// TTL is metadata that specifies number of hops a tag can propagate. -// Details about TTL metadata is specified at https://github.com/census-instrumentation/opencensus-specs/blob/master/tags/TagMap.md#tagmetadata -type TTL struct { - ttl int -} - -var ( - // TTLUnlimitedPropagation is TTL metadata that allows tag to propagate without any limits on number of hops. - TTLUnlimitedPropagation = TTL{ttl: valueTTLUnlimitedPropagation} - - // TTLNoPropagation is TTL metadata that prevents tag from propagating. - TTLNoPropagation = TTL{ttl: valueTTLNoPropagation} -) - -type metadatas struct { - ttl TTL -} - -// Metadata applies metadatas specified by the function. -type Metadata func(*metadatas) - -// WithTTL applies metadata with provided ttl. -func WithTTL(ttl TTL) Metadata { - return func(m *metadatas) { - m.ttl = ttl - } -} diff --git a/vendor/go.opencensus.io/tag/profile_19.go b/vendor/go.opencensus.io/tag/profile_19.go deleted file mode 100644 index b34d95e34..000000000 --- a/vendor/go.opencensus.io/tag/profile_19.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build go1.9 - -package tag - -import ( - "context" - "runtime/pprof" -) - -func do(ctx context.Context, f func(ctx context.Context)) { - m := FromContext(ctx) - keyvals := make([]string, 0, 2*len(m.m)) - for k, v := range m.m { - keyvals = append(keyvals, k.Name(), v.value) - } - pprof.Do(ctx, pprof.Labels(keyvals...), f) -} diff --git a/vendor/go.opencensus.io/tag/profile_not19.go b/vendor/go.opencensus.io/tag/profile_not19.go deleted file mode 100644 index 83adbce56..000000000 --- a/vendor/go.opencensus.io/tag/profile_not19.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build !go1.9 - -package tag - -import "context" - -func do(ctx context.Context, f func(ctx context.Context)) { - f(ctx) -} diff --git a/vendor/go.opencensus.io/tag/validate.go b/vendor/go.opencensus.io/tag/validate.go deleted file mode 100644 index 0939fc674..000000000 --- a/vendor/go.opencensus.io/tag/validate.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package tag - -import "errors" - -const ( - maxKeyLength = 255 - - // valid are restricted to US-ASCII subset (range 0x20 (' ') to 0x7e ('~')). - validKeyValueMin = 32 - validKeyValueMax = 126 -) - -var ( - errInvalidKeyName = errors.New("invalid key name: only ASCII characters accepted; max length must be 255 characters") - errInvalidValue = errors.New("invalid value: only ASCII characters accepted; max length must be 255 characters") -) - -func checkKeyName(name string) bool { - if len(name) == 0 { - return false - } - if len(name) > maxKeyLength { - return false - } - return isASCII(name) -} - -func isASCII(s string) bool { - for _, c := range s { - if (c < validKeyValueMin) || (c > validKeyValueMax) { - return false - } - } - return true -} - -func checkValue(v string) bool { - if len(v) > maxKeyLength { - return false - } - return isASCII(v) -} diff --git a/vendor/go.opencensus.io/trace/basetypes.go b/vendor/go.opencensus.io/trace/basetypes.go deleted file mode 100644 index 0c54492a2..000000000 --- a/vendor/go.opencensus.io/trace/basetypes.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package trace - -import ( - "fmt" - "time" -) - -type ( - // TraceID is a 16-byte identifier for a set of spans. - TraceID [16]byte - - // SpanID is an 8-byte identifier for a single span. - SpanID [8]byte -) - -func (t TraceID) String() string { - return fmt.Sprintf("%02x", t[:]) -} - -func (s SpanID) String() string { - return fmt.Sprintf("%02x", s[:]) -} - -// Annotation represents a text annotation with a set of attributes and a timestamp. -type Annotation struct { - Time time.Time - Message string - Attributes map[string]interface{} -} - -// Attribute represents a key-value pair on a span, link or annotation. -// Construct with one of: BoolAttribute, Int64Attribute, or StringAttribute. -type Attribute struct { - key string - value interface{} -} - -// BoolAttribute returns a bool-valued attribute. -func BoolAttribute(key string, value bool) Attribute { - return Attribute{key: key, value: value} -} - -// Int64Attribute returns an int64-valued attribute. -func Int64Attribute(key string, value int64) Attribute { - return Attribute{key: key, value: value} -} - -// Float64Attribute returns a float64-valued attribute. -func Float64Attribute(key string, value float64) Attribute { - return Attribute{key: key, value: value} -} - -// StringAttribute returns a string-valued attribute. -func StringAttribute(key string, value string) Attribute { - return Attribute{key: key, value: value} -} - -// LinkType specifies the relationship between the span that had the link -// added, and the linked span. -type LinkType int32 - -// LinkType values. -const ( - LinkTypeUnspecified LinkType = iota // The relationship of the two spans is unknown. - LinkTypeChild // The linked span is a child of the current span. - LinkTypeParent // The linked span is the parent of the current span. -) - -// Link represents a reference from one span to another span. -type Link struct { - TraceID TraceID - SpanID SpanID - Type LinkType - // Attributes is a set of attributes on the link. - Attributes map[string]interface{} -} - -// MessageEventType specifies the type of message event. -type MessageEventType int32 - -// MessageEventType values. -const ( - MessageEventTypeUnspecified MessageEventType = iota // Unknown event type. - MessageEventTypeSent // Indicates a sent RPC message. - MessageEventTypeRecv // Indicates a received RPC message. -) - -// MessageEvent represents an event describing a message sent or received on the network. -type MessageEvent struct { - Time time.Time - EventType MessageEventType - MessageID int64 - UncompressedByteSize int64 - CompressedByteSize int64 -} - -// Status is the status of a Span. -type Status struct { - // Code is a status code. Zero indicates success. - // - // If Code will be propagated to Google APIs, it ideally should be a value from - // https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto . - Code int32 - Message string -} diff --git a/vendor/go.opencensus.io/trace/config.go b/vendor/go.opencensus.io/trace/config.go deleted file mode 100644 index 775f8274f..000000000 --- a/vendor/go.opencensus.io/trace/config.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package trace - -import ( - "sync" - - "go.opencensus.io/trace/internal" -) - -// Config represents the global tracing configuration. -type Config struct { - // DefaultSampler is the default sampler used when creating new spans. - DefaultSampler Sampler - - // IDGenerator is for internal use only. - IDGenerator internal.IDGenerator - - // MaxAnnotationEventsPerSpan is max number of annotation events per span - MaxAnnotationEventsPerSpan int - - // MaxMessageEventsPerSpan is max number of message events per span - MaxMessageEventsPerSpan int - - // MaxAnnotationEventsPerSpan is max number of attributes per span - MaxAttributesPerSpan int - - // MaxLinksPerSpan is max number of links per span - MaxLinksPerSpan int -} - -var configWriteMu sync.Mutex - -const ( - // DefaultMaxAnnotationEventsPerSpan is default max number of annotation events per span - DefaultMaxAnnotationEventsPerSpan = 32 - - // DefaultMaxMessageEventsPerSpan is default max number of message events per span - DefaultMaxMessageEventsPerSpan = 128 - - // DefaultMaxAttributesPerSpan is default max number of attributes per span - DefaultMaxAttributesPerSpan = 32 - - // DefaultMaxLinksPerSpan is default max number of links per span - DefaultMaxLinksPerSpan = 32 -) - -// ApplyConfig applies changes to the global tracing configuration. -// -// Fields not provided in the given config are going to be preserved. -func ApplyConfig(cfg Config) { - configWriteMu.Lock() - defer configWriteMu.Unlock() - c := *config.Load().(*Config) - if cfg.DefaultSampler != nil { - c.DefaultSampler = cfg.DefaultSampler - } - if cfg.IDGenerator != nil { - c.IDGenerator = cfg.IDGenerator - } - if cfg.MaxAnnotationEventsPerSpan > 0 { - c.MaxAnnotationEventsPerSpan = cfg.MaxAnnotationEventsPerSpan - } - if cfg.MaxMessageEventsPerSpan > 0 { - c.MaxMessageEventsPerSpan = cfg.MaxMessageEventsPerSpan - } - if cfg.MaxAttributesPerSpan > 0 { - c.MaxAttributesPerSpan = cfg.MaxAttributesPerSpan - } - if cfg.MaxLinksPerSpan > 0 { - c.MaxLinksPerSpan = cfg.MaxLinksPerSpan - } - config.Store(&c) -} diff --git a/vendor/go.opencensus.io/trace/doc.go b/vendor/go.opencensus.io/trace/doc.go deleted file mode 100644 index 04b1ee4f3..000000000 --- a/vendor/go.opencensus.io/trace/doc.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* -Package trace contains support for OpenCensus distributed tracing. - -The following assumes a basic familiarity with OpenCensus concepts. -See http://opencensus.io - - -Exporting Traces - -To export collected tracing data, register at least one exporter. You can use -one of the provided exporters or write your own. - - trace.RegisterExporter(exporter) - -By default, traces will be sampled relatively rarely. To change the sampling -frequency for your entire program, call ApplyConfig. Use a ProbabilitySampler -to sample a subset of traces, or use AlwaysSample to collect a trace on every run: - - trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) - -Be careful about using trace.AlwaysSample in a production application with -significant traffic: a new trace will be started and exported for every request. - -Adding Spans to a Trace - -A trace consists of a tree of spans. In Go, the current span is carried in a -context.Context. - -It is common to want to capture all the activity of a function call in a span. For -this to work, the function must take a context.Context as a parameter. Add these two -lines to the top of the function: - - ctx, span := trace.StartSpan(ctx, "example.com/Run") - defer span.End() - -StartSpan will create a new top-level span if the context -doesn't contain another span, otherwise it will create a child span. -*/ -package trace // import "go.opencensus.io/trace" diff --git a/vendor/go.opencensus.io/trace/evictedqueue.go b/vendor/go.opencensus.io/trace/evictedqueue.go deleted file mode 100644 index ffc264f23..000000000 --- a/vendor/go.opencensus.io/trace/evictedqueue.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package trace - -type evictedQueue struct { - queue []interface{} - capacity int - droppedCount int -} - -func newEvictedQueue(capacity int) *evictedQueue { - eq := &evictedQueue{ - capacity: capacity, - queue: make([]interface{}, 0), - } - - return eq -} - -func (eq *evictedQueue) add(value interface{}) { - if len(eq.queue) == eq.capacity { - eq.queue = eq.queue[1:] - eq.droppedCount++ - } - eq.queue = append(eq.queue, value) -} diff --git a/vendor/go.opencensus.io/trace/export.go b/vendor/go.opencensus.io/trace/export.go deleted file mode 100644 index e0d9a4b99..000000000 --- a/vendor/go.opencensus.io/trace/export.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package trace - -import ( - "sync" - "sync/atomic" - "time" -) - -// Exporter is a type for functions that receive sampled trace spans. -// -// The ExportSpan method should be safe for concurrent use and should return -// quickly; if an Exporter takes a significant amount of time to process a -// SpanData, that work should be done on another goroutine. -// -// The SpanData should not be modified, but a pointer to it can be kept. -type Exporter interface { - ExportSpan(s *SpanData) -} - -type exportersMap map[Exporter]struct{} - -var ( - exporterMu sync.Mutex - exporters atomic.Value -) - -// RegisterExporter adds to the list of Exporters that will receive sampled -// trace spans. -// -// Binaries can register exporters, libraries shouldn't register exporters. -func RegisterExporter(e Exporter) { - exporterMu.Lock() - new := make(exportersMap) - if old, ok := exporters.Load().(exportersMap); ok { - for k, v := range old { - new[k] = v - } - } - new[e] = struct{}{} - exporters.Store(new) - exporterMu.Unlock() -} - -// UnregisterExporter removes from the list of Exporters the Exporter that was -// registered with the given name. -func UnregisterExporter(e Exporter) { - exporterMu.Lock() - new := make(exportersMap) - if old, ok := exporters.Load().(exportersMap); ok { - for k, v := range old { - new[k] = v - } - } - delete(new, e) - exporters.Store(new) - exporterMu.Unlock() -} - -// SpanData contains all the information collected by a Span. -type SpanData struct { - SpanContext - ParentSpanID SpanID - SpanKind int - Name string - StartTime time.Time - // The wall clock time of EndTime will be adjusted to always be offset - // from StartTime by the duration of the span. - EndTime time.Time - // The values of Attributes each have type string, bool, or int64. - Attributes map[string]interface{} - Annotations []Annotation - MessageEvents []MessageEvent - Status - Links []Link - HasRemoteParent bool - DroppedAttributeCount int - DroppedAnnotationCount int - DroppedMessageEventCount int - DroppedLinkCount int - - // ChildSpanCount holds the number of child span created for this span. - ChildSpanCount int -} diff --git a/vendor/go.opencensus.io/trace/internal/internal.go b/vendor/go.opencensus.io/trace/internal/internal.go deleted file mode 100644 index 7e808d8f3..000000000 --- a/vendor/go.opencensus.io/trace/internal/internal.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package internal provides trace internals. -package internal - -// IDGenerator allows custom generators for TraceId and SpanId. -type IDGenerator interface { - NewTraceID() [16]byte - NewSpanID() [8]byte -} diff --git a/vendor/go.opencensus.io/trace/lrumap.go b/vendor/go.opencensus.io/trace/lrumap.go deleted file mode 100644 index dc7a295c7..000000000 --- a/vendor/go.opencensus.io/trace/lrumap.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2019, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package trace - -import ( - "github.com/golang/groupcache/lru" -) - -// A simple lru.Cache wrapper that tracks the keys of the current contents and -// the cumulative number of evicted items. -type lruMap struct { - cacheKeys map[lru.Key]bool - cache *lru.Cache - droppedCount int -} - -func newLruMap(size int) *lruMap { - lm := &lruMap{ - cacheKeys: make(map[lru.Key]bool), - cache: lru.New(size), - droppedCount: 0, - } - lm.cache.OnEvicted = func(key lru.Key, value interface{}) { - delete(lm.cacheKeys, key) - lm.droppedCount++ - } - return lm -} - -func (lm lruMap) len() int { - return lm.cache.Len() -} - -func (lm lruMap) keys() []interface{} { - keys := []interface{}{} - for k := range lm.cacheKeys { - keys = append(keys, k) - } - return keys -} - -func (lm *lruMap) add(key, value interface{}) { - lm.cacheKeys[lru.Key(key)] = true - lm.cache.Add(lru.Key(key), value) -} - -func (lm *lruMap) get(key interface{}) (interface{}, bool) { - return lm.cache.Get(key) -} diff --git a/vendor/go.opencensus.io/trace/propagation/propagation.go b/vendor/go.opencensus.io/trace/propagation/propagation.go deleted file mode 100644 index 1eb190a96..000000000 --- a/vendor/go.opencensus.io/trace/propagation/propagation.go +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package propagation implements the binary trace context format. -package propagation // import "go.opencensus.io/trace/propagation" - -// TODO: link to external spec document. - -// BinaryFormat format: -// -// Binary value: -// version_id: 1 byte representing the version id. -// -// For version_id = 0: -// -// version_format: -// field_format: -// -// Fields: -// -// TraceId: (field_id = 0, len = 16, default = "0000000000000000") - 16-byte array representing the trace_id. -// SpanId: (field_id = 1, len = 8, default = "00000000") - 8-byte array representing the span_id. -// TraceOptions: (field_id = 2, len = 1, default = "0") - 1-byte array representing the trace_options. -// -// Fields MUST be encoded using the field id order (smaller to higher). -// -// Valid value example: -// -// {0, 0, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1, 97, -// 98, 99, 100, 101, 102, 103, 104, 2, 1} -// -// version_id = 0; -// trace_id = {64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79} -// span_id = {97, 98, 99, 100, 101, 102, 103, 104}; -// trace_options = {1}; - -import ( - "net/http" - - "go.opencensus.io/trace" -) - -// Binary returns the binary format representation of a SpanContext. -// -// If sc is the zero value, Binary returns nil. -func Binary(sc trace.SpanContext) []byte { - if sc == (trace.SpanContext{}) { - return nil - } - var b [29]byte - copy(b[2:18], sc.TraceID[:]) - b[18] = 1 - copy(b[19:27], sc.SpanID[:]) - b[27] = 2 - b[28] = uint8(sc.TraceOptions) - return b[:] -} - -// FromBinary returns the SpanContext represented by b. -// -// If b has an unsupported version ID or contains no TraceID, FromBinary -// returns with ok==false. -func FromBinary(b []byte) (sc trace.SpanContext, ok bool) { - if len(b) == 0 || b[0] != 0 { - return trace.SpanContext{}, false - } - b = b[1:] - if len(b) >= 17 && b[0] == 0 { - copy(sc.TraceID[:], b[1:17]) - b = b[17:] - } else { - return trace.SpanContext{}, false - } - if len(b) >= 9 && b[0] == 1 { - copy(sc.SpanID[:], b[1:9]) - b = b[9:] - } - if len(b) >= 2 && b[0] == 2 { - sc.TraceOptions = trace.TraceOptions(b[1]) - } - return sc, true -} - -// HTTPFormat implementations propagate span contexts -// in HTTP requests. -// -// SpanContextFromRequest extracts a span context from incoming -// requests. -// -// SpanContextToRequest modifies the given request to include the given -// span context. -type HTTPFormat interface { - SpanContextFromRequest(req *http.Request) (sc trace.SpanContext, ok bool) - SpanContextToRequest(sc trace.SpanContext, req *http.Request) -} - -// TODO(jbd): Find a more representative but short name for HTTPFormat. diff --git a/vendor/go.opencensus.io/trace/sampling.go b/vendor/go.opencensus.io/trace/sampling.go deleted file mode 100644 index 71c10f9e3..000000000 --- a/vendor/go.opencensus.io/trace/sampling.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package trace - -import ( - "encoding/binary" -) - -const defaultSamplingProbability = 1e-4 - -// Sampler decides whether a trace should be sampled and exported. -type Sampler func(SamplingParameters) SamplingDecision - -// SamplingParameters contains the values passed to a Sampler. -type SamplingParameters struct { - ParentContext SpanContext - TraceID TraceID - SpanID SpanID - Name string - HasRemoteParent bool -} - -// SamplingDecision is the value returned by a Sampler. -type SamplingDecision struct { - Sample bool -} - -// ProbabilitySampler returns a Sampler that samples a given fraction of traces. -// -// It also samples spans whose parents are sampled. -func ProbabilitySampler(fraction float64) Sampler { - if !(fraction >= 0) { - fraction = 0 - } else if fraction >= 1 { - return AlwaysSample() - } - - traceIDUpperBound := uint64(fraction * (1 << 63)) - return Sampler(func(p SamplingParameters) SamplingDecision { - if p.ParentContext.IsSampled() { - return SamplingDecision{Sample: true} - } - x := binary.BigEndian.Uint64(p.TraceID[0:8]) >> 1 - return SamplingDecision{Sample: x < traceIDUpperBound} - }) -} - -// AlwaysSample returns a Sampler that samples every trace. -// Be careful about using this sampler in a production application with -// significant traffic: a new trace will be started and exported for every -// request. -func AlwaysSample() Sampler { - return func(p SamplingParameters) SamplingDecision { - return SamplingDecision{Sample: true} - } -} - -// NeverSample returns a Sampler that samples no traces. -func NeverSample() Sampler { - return func(p SamplingParameters) SamplingDecision { - return SamplingDecision{Sample: false} - } -} diff --git a/vendor/go.opencensus.io/trace/spanbucket.go b/vendor/go.opencensus.io/trace/spanbucket.go deleted file mode 100644 index fbabad34c..000000000 --- a/vendor/go.opencensus.io/trace/spanbucket.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package trace - -import ( - "time" -) - -// samplePeriod is the minimum time between accepting spans in a single bucket. -const samplePeriod = time.Second - -// defaultLatencies contains the default latency bucket bounds. -// TODO: consider defaults, make configurable -var defaultLatencies = [...]time.Duration{ - 10 * time.Microsecond, - 100 * time.Microsecond, - time.Millisecond, - 10 * time.Millisecond, - 100 * time.Millisecond, - time.Second, - 10 * time.Second, - time.Minute, -} - -// bucket is a container for a set of spans for a particular error code or latency range. -type bucket struct { - nextTime time.Time // next time we can accept a span - buffer []*SpanData // circular buffer of spans - nextIndex int // location next SpanData should be placed in buffer - overflow bool // whether the circular buffer has wrapped around -} - -func makeBucket(bufferSize int) bucket { - return bucket{ - buffer: make([]*SpanData, bufferSize), - } -} - -// add adds a span to the bucket, if nextTime has been reached. -func (b *bucket) add(s *SpanData) { - if s.EndTime.Before(b.nextTime) { - return - } - if len(b.buffer) == 0 { - return - } - b.nextTime = s.EndTime.Add(samplePeriod) - b.buffer[b.nextIndex] = s - b.nextIndex++ - if b.nextIndex == len(b.buffer) { - b.nextIndex = 0 - b.overflow = true - } -} - -// size returns the number of spans in the bucket. -func (b *bucket) size() int { - if b.overflow { - return len(b.buffer) - } - return b.nextIndex -} - -// span returns the ith span in the bucket. -func (b *bucket) span(i int) *SpanData { - if !b.overflow { - return b.buffer[i] - } - if i < len(b.buffer)-b.nextIndex { - return b.buffer[b.nextIndex+i] - } - return b.buffer[b.nextIndex+i-len(b.buffer)] -} - -// resize changes the size of the bucket to n, keeping up to n existing spans. -func (b *bucket) resize(n int) { - cur := b.size() - newBuffer := make([]*SpanData, n) - if cur < n { - for i := 0; i < cur; i++ { - newBuffer[i] = b.span(i) - } - b.buffer = newBuffer - b.nextIndex = cur - b.overflow = false - return - } - for i := 0; i < n; i++ { - newBuffer[i] = b.span(i + cur - n) - } - b.buffer = newBuffer - b.nextIndex = 0 - b.overflow = true -} - -// latencyBucket returns the appropriate bucket number for a given latency. -func latencyBucket(latency time.Duration) int { - i := 0 - for i < len(defaultLatencies) && latency >= defaultLatencies[i] { - i++ - } - return i -} - -// latencyBucketBounds returns the lower and upper bounds for a latency bucket -// number. -// -// The lower bound is inclusive, the upper bound is exclusive (except for the -// last bucket.) -func latencyBucketBounds(index int) (lower time.Duration, upper time.Duration) { - if index == 0 { - return 0, defaultLatencies[index] - } - if index == len(defaultLatencies) { - return defaultLatencies[index-1], 1<<63 - 1 - } - return defaultLatencies[index-1], defaultLatencies[index] -} diff --git a/vendor/go.opencensus.io/trace/spanstore.go b/vendor/go.opencensus.io/trace/spanstore.go deleted file mode 100644 index c442d9902..000000000 --- a/vendor/go.opencensus.io/trace/spanstore.go +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package trace - -import ( - "sync" - "time" - - "go.opencensus.io/internal" -) - -const ( - maxBucketSize = 100000 - defaultBucketSize = 10 -) - -var ( - ssmu sync.RWMutex // protects spanStores - spanStores = make(map[string]*spanStore) -) - -// This exists purely to avoid exposing internal methods used by z-Pages externally. -type internalOnly struct{} - -func init() { - //TODO(#412): remove - internal.Trace = &internalOnly{} -} - -// ReportActiveSpans returns the active spans for the given name. -func (i internalOnly) ReportActiveSpans(name string) []*SpanData { - s := spanStoreForName(name) - if s == nil { - return nil - } - var out []*SpanData - s.mu.Lock() - defer s.mu.Unlock() - for span := range s.active { - out = append(out, span.makeSpanData()) - } - return out -} - -// ReportSpansByError returns a sample of error spans. -// -// If code is nonzero, only spans with that status code are returned. -func (i internalOnly) ReportSpansByError(name string, code int32) []*SpanData { - s := spanStoreForName(name) - if s == nil { - return nil - } - var out []*SpanData - s.mu.Lock() - defer s.mu.Unlock() - if code != 0 { - if b, ok := s.errors[code]; ok { - for _, sd := range b.buffer { - if sd == nil { - break - } - out = append(out, sd) - } - } - } else { - for _, b := range s.errors { - for _, sd := range b.buffer { - if sd == nil { - break - } - out = append(out, sd) - } - } - } - return out -} - -// ConfigureBucketSizes sets the number of spans to keep per latency and error -// bucket for different span names. -func (i internalOnly) ConfigureBucketSizes(bcs []internal.BucketConfiguration) { - for _, bc := range bcs { - latencyBucketSize := bc.MaxRequestsSucceeded - if latencyBucketSize < 0 { - latencyBucketSize = 0 - } - if latencyBucketSize > maxBucketSize { - latencyBucketSize = maxBucketSize - } - errorBucketSize := bc.MaxRequestsErrors - if errorBucketSize < 0 { - errorBucketSize = 0 - } - if errorBucketSize > maxBucketSize { - errorBucketSize = maxBucketSize - } - spanStoreSetSize(bc.Name, latencyBucketSize, errorBucketSize) - } -} - -// ReportSpansPerMethod returns a summary of what spans are being stored for each span name. -func (i internalOnly) ReportSpansPerMethod() map[string]internal.PerMethodSummary { - out := make(map[string]internal.PerMethodSummary) - ssmu.RLock() - defer ssmu.RUnlock() - for name, s := range spanStores { - s.mu.Lock() - p := internal.PerMethodSummary{ - Active: len(s.active), - } - for code, b := range s.errors { - p.ErrorBuckets = append(p.ErrorBuckets, internal.ErrorBucketSummary{ - ErrorCode: code, - Size: b.size(), - }) - } - for i, b := range s.latency { - min, max := latencyBucketBounds(i) - p.LatencyBuckets = append(p.LatencyBuckets, internal.LatencyBucketSummary{ - MinLatency: min, - MaxLatency: max, - Size: b.size(), - }) - } - s.mu.Unlock() - out[name] = p - } - return out -} - -// ReportSpansByLatency returns a sample of successful spans. -// -// minLatency is the minimum latency of spans to be returned. -// maxLatency, if nonzero, is the maximum latency of spans to be returned. -func (i internalOnly) ReportSpansByLatency(name string, minLatency, maxLatency time.Duration) []*SpanData { - s := spanStoreForName(name) - if s == nil { - return nil - } - var out []*SpanData - s.mu.Lock() - defer s.mu.Unlock() - for i, b := range s.latency { - min, max := latencyBucketBounds(i) - if i+1 != len(s.latency) && max <= minLatency { - continue - } - if maxLatency != 0 && maxLatency < min { - continue - } - for _, sd := range b.buffer { - if sd == nil { - break - } - if minLatency != 0 || maxLatency != 0 { - d := sd.EndTime.Sub(sd.StartTime) - if d < minLatency { - continue - } - if maxLatency != 0 && d > maxLatency { - continue - } - } - out = append(out, sd) - } - } - return out -} - -// spanStore keeps track of spans stored for a particular span name. -// -// It contains all active spans; a sample of spans for failed requests, -// categorized by error code; and a sample of spans for successful requests, -// bucketed by latency. -type spanStore struct { - mu sync.Mutex // protects everything below. - active map[*Span]struct{} - errors map[int32]*bucket - latency []bucket - maxSpansPerErrorBucket int -} - -// newSpanStore creates a span store. -func newSpanStore(name string, latencyBucketSize int, errorBucketSize int) *spanStore { - s := &spanStore{ - active: make(map[*Span]struct{}), - latency: make([]bucket, len(defaultLatencies)+1), - maxSpansPerErrorBucket: errorBucketSize, - } - for i := range s.latency { - s.latency[i] = makeBucket(latencyBucketSize) - } - return s -} - -// spanStoreForName returns the spanStore for the given name. -// -// It returns nil if it doesn't exist. -func spanStoreForName(name string) *spanStore { - var s *spanStore - ssmu.RLock() - s, _ = spanStores[name] - ssmu.RUnlock() - return s -} - -// spanStoreForNameCreateIfNew returns the spanStore for the given name. -// -// It creates it if it didn't exist. -func spanStoreForNameCreateIfNew(name string) *spanStore { - ssmu.RLock() - s, ok := spanStores[name] - ssmu.RUnlock() - if ok { - return s - } - ssmu.Lock() - defer ssmu.Unlock() - s, ok = spanStores[name] - if ok { - return s - } - s = newSpanStore(name, defaultBucketSize, defaultBucketSize) - spanStores[name] = s - return s -} - -// spanStoreSetSize resizes the spanStore for the given name. -// -// It creates it if it didn't exist. -func spanStoreSetSize(name string, latencyBucketSize int, errorBucketSize int) { - ssmu.RLock() - s, ok := spanStores[name] - ssmu.RUnlock() - if ok { - s.resize(latencyBucketSize, errorBucketSize) - return - } - ssmu.Lock() - defer ssmu.Unlock() - s, ok = spanStores[name] - if ok { - s.resize(latencyBucketSize, errorBucketSize) - return - } - s = newSpanStore(name, latencyBucketSize, errorBucketSize) - spanStores[name] = s -} - -func (s *spanStore) resize(latencyBucketSize int, errorBucketSize int) { - s.mu.Lock() - for i := range s.latency { - s.latency[i].resize(latencyBucketSize) - } - for _, b := range s.errors { - b.resize(errorBucketSize) - } - s.maxSpansPerErrorBucket = errorBucketSize - s.mu.Unlock() -} - -// add adds a span to the active bucket of the spanStore. -func (s *spanStore) add(span *Span) { - s.mu.Lock() - s.active[span] = struct{}{} - s.mu.Unlock() -} - -// finished removes a span from the active set, and adds a corresponding -// SpanData to a latency or error bucket. -func (s *spanStore) finished(span *Span, sd *SpanData) { - latency := sd.EndTime.Sub(sd.StartTime) - if latency < 0 { - latency = 0 - } - code := sd.Status.Code - - s.mu.Lock() - delete(s.active, span) - if code == 0 { - s.latency[latencyBucket(latency)].add(sd) - } else { - if s.errors == nil { - s.errors = make(map[int32]*bucket) - } - if b := s.errors[code]; b != nil { - b.add(sd) - } else { - b := makeBucket(s.maxSpansPerErrorBucket) - s.errors[code] = &b - b.add(sd) - } - } - s.mu.Unlock() -} diff --git a/vendor/go.opencensus.io/trace/status_codes.go b/vendor/go.opencensus.io/trace/status_codes.go deleted file mode 100644 index ec60effd1..000000000 --- a/vendor/go.opencensus.io/trace/status_codes.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package trace - -// Status codes for use with Span.SetStatus. These correspond to the status -// codes used by gRPC defined here: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto -const ( - StatusCodeOK = 0 - StatusCodeCancelled = 1 - StatusCodeUnknown = 2 - StatusCodeInvalidArgument = 3 - StatusCodeDeadlineExceeded = 4 - StatusCodeNotFound = 5 - StatusCodeAlreadyExists = 6 - StatusCodePermissionDenied = 7 - StatusCodeResourceExhausted = 8 - StatusCodeFailedPrecondition = 9 - StatusCodeAborted = 10 - StatusCodeOutOfRange = 11 - StatusCodeUnimplemented = 12 - StatusCodeInternal = 13 - StatusCodeUnavailable = 14 - StatusCodeDataLoss = 15 - StatusCodeUnauthenticated = 16 -) diff --git a/vendor/go.opencensus.io/trace/trace.go b/vendor/go.opencensus.io/trace/trace.go deleted file mode 100644 index 3f8977b41..000000000 --- a/vendor/go.opencensus.io/trace/trace.go +++ /dev/null @@ -1,598 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package trace - -import ( - "context" - crand "crypto/rand" - "encoding/binary" - "fmt" - "math/rand" - "sync" - "sync/atomic" - "time" - - "go.opencensus.io/internal" - "go.opencensus.io/trace/tracestate" -) - -// Span represents a span of a trace. It has an associated SpanContext, and -// stores data accumulated while the span is active. -// -// Ideally users should interact with Spans by calling the functions in this -// package that take a Context parameter. -type Span struct { - // data contains information recorded about the span. - // - // It will be non-nil if we are exporting the span or recording events for it. - // Otherwise, data is nil, and the Span is simply a carrier for the - // SpanContext, so that the trace ID is propagated. - data *SpanData - mu sync.Mutex // protects the contents of *data (but not the pointer value.) - spanContext SpanContext - - // lruAttributes are capped at configured limit. When the capacity is reached an oldest entry - // is removed to create room for a new entry. - lruAttributes *lruMap - - // annotations are stored in FIFO queue capped by configured limit. - annotations *evictedQueue - - // messageEvents are stored in FIFO queue capped by configured limit. - messageEvents *evictedQueue - - // links are stored in FIFO queue capped by configured limit. - links *evictedQueue - - // spanStore is the spanStore this span belongs to, if any, otherwise it is nil. - *spanStore - endOnce sync.Once - - executionTracerTaskEnd func() // ends the execution tracer span -} - -// IsRecordingEvents returns true if events are being recorded for this span. -// Use this check to avoid computing expensive annotations when they will never -// be used. -func (s *Span) IsRecordingEvents() bool { - if s == nil { - return false - } - return s.data != nil -} - -// TraceOptions contains options associated with a trace span. -type TraceOptions uint32 - -// IsSampled returns true if the span will be exported. -func (sc SpanContext) IsSampled() bool { - return sc.TraceOptions.IsSampled() -} - -// setIsSampled sets the TraceOptions bit that determines whether the span will be exported. -func (sc *SpanContext) setIsSampled(sampled bool) { - if sampled { - sc.TraceOptions |= 1 - } else { - sc.TraceOptions &= ^TraceOptions(1) - } -} - -// IsSampled returns true if the span will be exported. -func (t TraceOptions) IsSampled() bool { - return t&1 == 1 -} - -// SpanContext contains the state that must propagate across process boundaries. -// -// SpanContext is not an implementation of context.Context. -// TODO: add reference to external Census docs for SpanContext. -type SpanContext struct { - TraceID TraceID - SpanID SpanID - TraceOptions TraceOptions - Tracestate *tracestate.Tracestate -} - -type contextKey struct{} - -// FromContext returns the Span stored in a context, or nil if there isn't one. -func FromContext(ctx context.Context) *Span { - s, _ := ctx.Value(contextKey{}).(*Span) - return s -} - -// NewContext returns a new context with the given Span attached. -func NewContext(parent context.Context, s *Span) context.Context { - return context.WithValue(parent, contextKey{}, s) -} - -// All available span kinds. Span kind must be either one of these values. -const ( - SpanKindUnspecified = iota - SpanKindServer - SpanKindClient -) - -// StartOptions contains options concerning how a span is started. -type StartOptions struct { - // Sampler to consult for this Span. If provided, it is always consulted. - // - // If not provided, then the behavior differs based on whether - // the parent of this Span is remote, local, or there is no parent. - // In the case of a remote parent or no parent, the - // default sampler (see Config) will be consulted. Otherwise, - // when there is a non-remote parent, no new sampling decision will be made: - // we will preserve the sampling of the parent. - Sampler Sampler - - // SpanKind represents the kind of a span. If none is set, - // SpanKindUnspecified is used. - SpanKind int -} - -// StartOption apply changes to StartOptions. -type StartOption func(*StartOptions) - -// WithSpanKind makes new spans to be created with the given kind. -func WithSpanKind(spanKind int) StartOption { - return func(o *StartOptions) { - o.SpanKind = spanKind - } -} - -// WithSampler makes new spans to be be created with a custom sampler. -// Otherwise, the global sampler is used. -func WithSampler(sampler Sampler) StartOption { - return func(o *StartOptions) { - o.Sampler = sampler - } -} - -// StartSpan starts a new child span of the current span in the context. If -// there is no span in the context, creates a new trace and span. -// -// Returned context contains the newly created span. You can use it to -// propagate the returned span in process. -func StartSpan(ctx context.Context, name string, o ...StartOption) (context.Context, *Span) { - var opts StartOptions - var parent SpanContext - if p := FromContext(ctx); p != nil { - p.addChild() - parent = p.spanContext - } - for _, op := range o { - op(&opts) - } - span := startSpanInternal(name, parent != SpanContext{}, parent, false, opts) - - ctx, end := startExecutionTracerTask(ctx, name) - span.executionTracerTaskEnd = end - return NewContext(ctx, span), span -} - -// StartSpanWithRemoteParent starts a new child span of the span from the given parent. -// -// If the incoming context contains a parent, it ignores. StartSpanWithRemoteParent is -// preferred for cases where the parent is propagated via an incoming request. -// -// Returned context contains the newly created span. You can use it to -// propagate the returned span in process. -func StartSpanWithRemoteParent(ctx context.Context, name string, parent SpanContext, o ...StartOption) (context.Context, *Span) { - var opts StartOptions - for _, op := range o { - op(&opts) - } - span := startSpanInternal(name, parent != SpanContext{}, parent, true, opts) - ctx, end := startExecutionTracerTask(ctx, name) - span.executionTracerTaskEnd = end - return NewContext(ctx, span), span -} - -func startSpanInternal(name string, hasParent bool, parent SpanContext, remoteParent bool, o StartOptions) *Span { - span := &Span{} - span.spanContext = parent - - cfg := config.Load().(*Config) - - if !hasParent { - span.spanContext.TraceID = cfg.IDGenerator.NewTraceID() - } - span.spanContext.SpanID = cfg.IDGenerator.NewSpanID() - sampler := cfg.DefaultSampler - - if !hasParent || remoteParent || o.Sampler != nil { - // If this span is the child of a local span and no Sampler is set in the - // options, keep the parent's TraceOptions. - // - // Otherwise, consult the Sampler in the options if it is non-nil, otherwise - // the default sampler. - if o.Sampler != nil { - sampler = o.Sampler - } - span.spanContext.setIsSampled(sampler(SamplingParameters{ - ParentContext: parent, - TraceID: span.spanContext.TraceID, - SpanID: span.spanContext.SpanID, - Name: name, - HasRemoteParent: remoteParent}).Sample) - } - - if !internal.LocalSpanStoreEnabled && !span.spanContext.IsSampled() { - return span - } - - span.data = &SpanData{ - SpanContext: span.spanContext, - StartTime: time.Now(), - SpanKind: o.SpanKind, - Name: name, - HasRemoteParent: remoteParent, - } - span.lruAttributes = newLruMap(cfg.MaxAttributesPerSpan) - span.annotations = newEvictedQueue(cfg.MaxAnnotationEventsPerSpan) - span.messageEvents = newEvictedQueue(cfg.MaxMessageEventsPerSpan) - span.links = newEvictedQueue(cfg.MaxLinksPerSpan) - - if hasParent { - span.data.ParentSpanID = parent.SpanID - } - if internal.LocalSpanStoreEnabled { - var ss *spanStore - ss = spanStoreForNameCreateIfNew(name) - if ss != nil { - span.spanStore = ss - ss.add(span) - } - } - - return span -} - -// End ends the span. -func (s *Span) End() { - if s == nil { - return - } - if s.executionTracerTaskEnd != nil { - s.executionTracerTaskEnd() - } - if !s.IsRecordingEvents() { - return - } - s.endOnce.Do(func() { - exp, _ := exporters.Load().(exportersMap) - mustExport := s.spanContext.IsSampled() && len(exp) > 0 - if s.spanStore != nil || mustExport { - sd := s.makeSpanData() - sd.EndTime = internal.MonotonicEndTime(sd.StartTime) - if s.spanStore != nil { - s.spanStore.finished(s, sd) - } - if mustExport { - for e := range exp { - e.ExportSpan(sd) - } - } - } - }) -} - -// makeSpanData produces a SpanData representing the current state of the Span. -// It requires that s.data is non-nil. -func (s *Span) makeSpanData() *SpanData { - var sd SpanData - s.mu.Lock() - sd = *s.data - if s.lruAttributes.len() > 0 { - sd.Attributes = s.lruAttributesToAttributeMap() - sd.DroppedAttributeCount = s.lruAttributes.droppedCount - } - if len(s.annotations.queue) > 0 { - sd.Annotations = s.interfaceArrayToAnnotationArray() - sd.DroppedAnnotationCount = s.annotations.droppedCount - } - if len(s.messageEvents.queue) > 0 { - sd.MessageEvents = s.interfaceArrayToMessageEventArray() - sd.DroppedMessageEventCount = s.messageEvents.droppedCount - } - if len(s.links.queue) > 0 { - sd.Links = s.interfaceArrayToLinksArray() - sd.DroppedLinkCount = s.links.droppedCount - } - s.mu.Unlock() - return &sd -} - -// SpanContext returns the SpanContext of the span. -func (s *Span) SpanContext() SpanContext { - if s == nil { - return SpanContext{} - } - return s.spanContext -} - -// SetName sets the name of the span, if it is recording events. -func (s *Span) SetName(name string) { - if !s.IsRecordingEvents() { - return - } - s.mu.Lock() - s.data.Name = name - s.mu.Unlock() -} - -// SetStatus sets the status of the span, if it is recording events. -func (s *Span) SetStatus(status Status) { - if !s.IsRecordingEvents() { - return - } - s.mu.Lock() - s.data.Status = status - s.mu.Unlock() -} - -func (s *Span) interfaceArrayToLinksArray() []Link { - linksArr := make([]Link, 0) - for _, value := range s.links.queue { - linksArr = append(linksArr, value.(Link)) - } - return linksArr -} - -func (s *Span) interfaceArrayToMessageEventArray() []MessageEvent { - messageEventArr := make([]MessageEvent, 0) - for _, value := range s.messageEvents.queue { - messageEventArr = append(messageEventArr, value.(MessageEvent)) - } - return messageEventArr -} - -func (s *Span) interfaceArrayToAnnotationArray() []Annotation { - annotationArr := make([]Annotation, 0) - for _, value := range s.annotations.queue { - annotationArr = append(annotationArr, value.(Annotation)) - } - return annotationArr -} - -func (s *Span) lruAttributesToAttributeMap() map[string]interface{} { - attributes := make(map[string]interface{}) - for _, key := range s.lruAttributes.keys() { - value, ok := s.lruAttributes.get(key) - if ok { - keyStr := key.(string) - attributes[keyStr] = value - } - } - return attributes -} - -func (s *Span) copyToCappedAttributes(attributes []Attribute) { - for _, a := range attributes { - s.lruAttributes.add(a.key, a.value) - } -} - -func (s *Span) addChild() { - if !s.IsRecordingEvents() { - return - } - s.mu.Lock() - s.data.ChildSpanCount++ - s.mu.Unlock() -} - -// AddAttributes sets attributes in the span. -// -// Existing attributes whose keys appear in the attributes parameter are overwritten. -func (s *Span) AddAttributes(attributes ...Attribute) { - if !s.IsRecordingEvents() { - return - } - s.mu.Lock() - s.copyToCappedAttributes(attributes) - s.mu.Unlock() -} - -// copyAttributes copies a slice of Attributes into a map. -func copyAttributes(m map[string]interface{}, attributes []Attribute) { - for _, a := range attributes { - m[a.key] = a.value - } -} - -func (s *Span) lazyPrintfInternal(attributes []Attribute, format string, a ...interface{}) { - now := time.Now() - msg := fmt.Sprintf(format, a...) - var m map[string]interface{} - s.mu.Lock() - if len(attributes) != 0 { - m = make(map[string]interface{}) - copyAttributes(m, attributes) - } - s.annotations.add(Annotation{ - Time: now, - Message: msg, - Attributes: m, - }) - s.mu.Unlock() -} - -func (s *Span) printStringInternal(attributes []Attribute, str string) { - now := time.Now() - var a map[string]interface{} - s.mu.Lock() - if len(attributes) != 0 { - a = make(map[string]interface{}) - copyAttributes(a, attributes) - } - s.annotations.add(Annotation{ - Time: now, - Message: str, - Attributes: a, - }) - s.mu.Unlock() -} - -// Annotate adds an annotation with attributes. -// Attributes can be nil. -func (s *Span) Annotate(attributes []Attribute, str string) { - if !s.IsRecordingEvents() { - return - } - s.printStringInternal(attributes, str) -} - -// Annotatef adds an annotation with attributes. -func (s *Span) Annotatef(attributes []Attribute, format string, a ...interface{}) { - if !s.IsRecordingEvents() { - return - } - s.lazyPrintfInternal(attributes, format, a...) -} - -// AddMessageSendEvent adds a message send event to the span. -// -// messageID is an identifier for the message, which is recommended to be -// unique in this span and the same between the send event and the receive -// event (this allows to identify a message between the sender and receiver). -// For example, this could be a sequence id. -func (s *Span) AddMessageSendEvent(messageID, uncompressedByteSize, compressedByteSize int64) { - if !s.IsRecordingEvents() { - return - } - now := time.Now() - s.mu.Lock() - s.messageEvents.add(MessageEvent{ - Time: now, - EventType: MessageEventTypeSent, - MessageID: messageID, - UncompressedByteSize: uncompressedByteSize, - CompressedByteSize: compressedByteSize, - }) - s.mu.Unlock() -} - -// AddMessageReceiveEvent adds a message receive event to the span. -// -// messageID is an identifier for the message, which is recommended to be -// unique in this span and the same between the send event and the receive -// event (this allows to identify a message between the sender and receiver). -// For example, this could be a sequence id. -func (s *Span) AddMessageReceiveEvent(messageID, uncompressedByteSize, compressedByteSize int64) { - if !s.IsRecordingEvents() { - return - } - now := time.Now() - s.mu.Lock() - s.messageEvents.add(MessageEvent{ - Time: now, - EventType: MessageEventTypeRecv, - MessageID: messageID, - UncompressedByteSize: uncompressedByteSize, - CompressedByteSize: compressedByteSize, - }) - s.mu.Unlock() -} - -// AddLink adds a link to the span. -func (s *Span) AddLink(l Link) { - if !s.IsRecordingEvents() { - return - } - s.mu.Lock() - s.links.add(l) - s.mu.Unlock() -} - -func (s *Span) String() string { - if s == nil { - return "" - } - if s.data == nil { - return fmt.Sprintf("span %s", s.spanContext.SpanID) - } - s.mu.Lock() - str := fmt.Sprintf("span %s %q", s.spanContext.SpanID, s.data.Name) - s.mu.Unlock() - return str -} - -var config atomic.Value // access atomically - -func init() { - gen := &defaultIDGenerator{} - // initialize traceID and spanID generators. - var rngSeed int64 - for _, p := range []interface{}{ - &rngSeed, &gen.traceIDAdd, &gen.nextSpanID, &gen.spanIDInc, - } { - binary.Read(crand.Reader, binary.LittleEndian, p) - } - gen.traceIDRand = rand.New(rand.NewSource(rngSeed)) - gen.spanIDInc |= 1 - - config.Store(&Config{ - DefaultSampler: ProbabilitySampler(defaultSamplingProbability), - IDGenerator: gen, - MaxAttributesPerSpan: DefaultMaxAttributesPerSpan, - MaxAnnotationEventsPerSpan: DefaultMaxAnnotationEventsPerSpan, - MaxMessageEventsPerSpan: DefaultMaxMessageEventsPerSpan, - MaxLinksPerSpan: DefaultMaxLinksPerSpan, - }) -} - -type defaultIDGenerator struct { - sync.Mutex - - // Please keep these as the first fields - // so that these 8 byte fields will be aligned on addresses - // divisible by 8, on both 32-bit and 64-bit machines when - // performing atomic increments and accesses. - // See: - // * https://github.com/census-instrumentation/opencensus-go/issues/587 - // * https://github.com/census-instrumentation/opencensus-go/issues/865 - // * https://golang.org/pkg/sync/atomic/#pkg-note-BUG - nextSpanID uint64 - spanIDInc uint64 - - traceIDAdd [2]uint64 - traceIDRand *rand.Rand -} - -// NewSpanID returns a non-zero span ID from a randomly-chosen sequence. -func (gen *defaultIDGenerator) NewSpanID() [8]byte { - var id uint64 - for id == 0 { - id = atomic.AddUint64(&gen.nextSpanID, gen.spanIDInc) - } - var sid [8]byte - binary.LittleEndian.PutUint64(sid[:], id) - return sid -} - -// NewTraceID returns a non-zero trace ID from a randomly-chosen sequence. -// mu should be held while this function is called. -func (gen *defaultIDGenerator) NewTraceID() [16]byte { - var tid [16]byte - // Construct the trace ID from two outputs of traceIDRand, with a constant - // added to each half for additional entropy. - gen.Lock() - binary.LittleEndian.PutUint64(tid[0:8], gen.traceIDRand.Uint64()+gen.traceIDAdd[0]) - binary.LittleEndian.PutUint64(tid[8:16], gen.traceIDRand.Uint64()+gen.traceIDAdd[1]) - gen.Unlock() - return tid -} diff --git a/vendor/go.opencensus.io/trace/trace_go11.go b/vendor/go.opencensus.io/trace/trace_go11.go deleted file mode 100644 index b7d8aaf28..000000000 --- a/vendor/go.opencensus.io/trace/trace_go11.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build go1.11 - -package trace - -import ( - "context" - t "runtime/trace" -) - -func startExecutionTracerTask(ctx context.Context, name string) (context.Context, func()) { - if !t.IsEnabled() { - // Avoid additional overhead if - // runtime/trace is not enabled. - return ctx, func() {} - } - nctx, task := t.NewTask(ctx, name) - return nctx, task.End -} diff --git a/vendor/go.opencensus.io/trace/trace_nongo11.go b/vendor/go.opencensus.io/trace/trace_nongo11.go deleted file mode 100644 index e25419859..000000000 --- a/vendor/go.opencensus.io/trace/trace_nongo11.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build !go1.11 - -package trace - -import ( - "context" -) - -func startExecutionTracerTask(ctx context.Context, name string) (context.Context, func()) { - return ctx, func() {} -} diff --git a/vendor/go.opencensus.io/trace/tracestate/tracestate.go b/vendor/go.opencensus.io/trace/tracestate/tracestate.go deleted file mode 100644 index 2d6c713eb..000000000 --- a/vendor/go.opencensus.io/trace/tracestate/tracestate.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package tracestate implements support for the Tracestate header of the -// W3C TraceContext propagation format. -package tracestate - -import ( - "fmt" - "regexp" -) - -const ( - keyMaxSize = 256 - valueMaxSize = 256 - maxKeyValuePairs = 32 -) - -const ( - keyWithoutVendorFormat = `[a-z][_0-9a-z\-\*\/]{0,255}` - keyWithVendorFormat = `[a-z][_0-9a-z\-\*\/]{0,240}@[a-z][_0-9a-z\-\*\/]{0,13}` - keyFormat = `(` + keyWithoutVendorFormat + `)|(` + keyWithVendorFormat + `)` - valueFormat = `[\x20-\x2b\x2d-\x3c\x3e-\x7e]{0,255}[\x21-\x2b\x2d-\x3c\x3e-\x7e]` -) - -var keyValidationRegExp = regexp.MustCompile(`^(` + keyFormat + `)$`) -var valueValidationRegExp = regexp.MustCompile(`^(` + valueFormat + `)$`) - -// Tracestate represents tracing-system specific context in a list of key-value pairs. Tracestate allows different -// vendors propagate additional information and inter-operate with their legacy Id formats. -type Tracestate struct { - entries []Entry -} - -// Entry represents one key-value pair in a list of key-value pair of Tracestate. -type Entry struct { - // Key is an opaque string up to 256 characters printable. It MUST begin with a lowercase letter, - // and can only contain lowercase letters a-z, digits 0-9, underscores _, dashes -, asterisks *, and - // forward slashes /. - Key string - - // Value is an opaque string up to 256 characters printable ASCII RFC0020 characters (i.e., the - // range 0x20 to 0x7E) except comma , and =. - Value string -} - -// Entries returns a slice of Entry. -func (ts *Tracestate) Entries() []Entry { - if ts == nil { - return nil - } - return ts.entries -} - -func (ts *Tracestate) remove(key string) *Entry { - for index, entry := range ts.entries { - if entry.Key == key { - ts.entries = append(ts.entries[:index], ts.entries[index+1:]...) - return &entry - } - } - return nil -} - -func (ts *Tracestate) add(entries []Entry) error { - for _, entry := range entries { - ts.remove(entry.Key) - } - if len(ts.entries)+len(entries) > maxKeyValuePairs { - return fmt.Errorf("adding %d key-value pairs to current %d pairs exceeds the limit of %d", - len(entries), len(ts.entries), maxKeyValuePairs) - } - ts.entries = append(entries, ts.entries...) - return nil -} - -func isValid(entry Entry) bool { - return keyValidationRegExp.MatchString(entry.Key) && - valueValidationRegExp.MatchString(entry.Value) -} - -func containsDuplicateKey(entries ...Entry) (string, bool) { - keyMap := make(map[string]int) - for _, entry := range entries { - if _, ok := keyMap[entry.Key]; ok { - return entry.Key, true - } - keyMap[entry.Key] = 1 - } - return "", false -} - -func areEntriesValid(entries ...Entry) (*Entry, bool) { - for _, entry := range entries { - if !isValid(entry) { - return &entry, false - } - } - return nil, true -} - -// New creates a Tracestate object from a parent and/or entries (key-value pair). -// Entries from the parent are copied if present. The entries passed to this function -// are inserted in front of those copied from the parent. If an entry copied from the -// parent contains the same key as one of the entry in entries then the entry copied -// from the parent is removed. See add func. -// -// An error is returned with nil Tracestate if -// 1. one or more entry in entries is invalid. -// 2. two or more entries in the input entries have the same key. -// 3. the number of entries combined from the parent and the input entries exceeds maxKeyValuePairs. -// (duplicate entry is counted only once). -func New(parent *Tracestate, entries ...Entry) (*Tracestate, error) { - if parent == nil && len(entries) == 0 { - return nil, nil - } - if entry, ok := areEntriesValid(entries...); !ok { - return nil, fmt.Errorf("key-value pair {%s, %s} is invalid", entry.Key, entry.Value) - } - - if key, duplicate := containsDuplicateKey(entries...); duplicate { - return nil, fmt.Errorf("contains duplicate keys (%s)", key) - } - - tracestate := Tracestate{} - - if parent != nil && len(parent.entries) > 0 { - tracestate.entries = append([]Entry{}, parent.entries...) - } - - err := tracestate.add(entries) - if err != nil { - return nil, err - } - return &tracestate, nil -} diff --git a/vendor/go.opencensus.io/zpages/internal/gen.go b/vendor/go.opencensus.io/zpages/internal/gen.go deleted file mode 100644 index 453e21754..000000000 --- a/vendor/go.opencensus.io/zpages/internal/gen.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2018, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package internal // import "go.opencensus.io/zpages/internal" - -// go get https://github.com/mjibson/esc.git -//go:generate esc -pkg internal -o resources.go public/ templates/ diff --git a/vendor/go.opencensus.io/zpages/internal/resources.go b/vendor/go.opencensus.io/zpages/internal/resources.go deleted file mode 100644 index 5b7fc76b2..000000000 --- a/vendor/go.opencensus.io/zpages/internal/resources.go +++ /dev/null @@ -1,284 +0,0 @@ -// Code generated by "esc -pkg resources -o resources.go public/ templates/"; DO NOT EDIT. - -package internal - -import ( - "bytes" - "compress/gzip" - "encoding/base64" - "io/ioutil" - "net/http" - "os" - "path" - "sync" - "time" -) - -type _escLocalFS struct{} - -var _escLocal _escLocalFS - -type _escStaticFS struct{} - -var _escStatic _escStaticFS - -type _escDirectory struct { - fs http.FileSystem - name string -} - -type _escFile struct { - compressed string - size int64 - modtime int64 - local string - isDir bool - - once sync.Once - data []byte - name string -} - -func (_escLocalFS) Open(name string) (http.File, error) { - f, present := _escData[path.Clean(name)] - if !present { - return nil, os.ErrNotExist - } - return os.Open(f.local) -} - -func (_escStaticFS) prepare(name string) (*_escFile, error) { - f, present := _escData[path.Clean(name)] - if !present { - return nil, os.ErrNotExist - } - var err error - f.once.Do(func() { - f.name = path.Base(name) - if f.size == 0 { - return - } - var gr *gzip.Reader - b64 := base64.NewDecoder(base64.StdEncoding, bytes.NewBufferString(f.compressed)) - gr, err = gzip.NewReader(b64) - if err != nil { - return - } - f.data, err = ioutil.ReadAll(gr) - }) - if err != nil { - return nil, err - } - return f, nil -} - -func (fs _escStaticFS) Open(name string) (http.File, error) { - f, err := fs.prepare(name) - if err != nil { - return nil, err - } - return f.File() -} - -func (dir _escDirectory) Open(name string) (http.File, error) { - return dir.fs.Open(dir.name + name) -} - -func (f *_escFile) File() (http.File, error) { - type httpFile struct { - *bytes.Reader - *_escFile - } - return &httpFile{ - Reader: bytes.NewReader(f.data), - _escFile: f, - }, nil -} - -func (f *_escFile) Close() error { - return nil -} - -func (f *_escFile) Readdir(count int) ([]os.FileInfo, error) { - return nil, nil -} - -func (f *_escFile) Stat() (os.FileInfo, error) { - return f, nil -} - -func (f *_escFile) Name() string { - return f.name -} - -func (f *_escFile) Size() int64 { - return f.size -} - -func (f *_escFile) Mode() os.FileMode { - return 0 -} - -func (f *_escFile) ModTime() time.Time { - return time.Unix(f.modtime, 0) -} - -func (f *_escFile) IsDir() bool { - return f.isDir -} - -func (f *_escFile) Sys() interface{} { - return f -} - -// FS returns a http.Filesystem for the embedded assets. If useLocal is true, -// the filesystem's contents are instead used. -func FS(useLocal bool) http.FileSystem { - if useLocal { - return _escLocal - } - return _escStatic -} - -// Dir returns a http.Filesystem for the embedded assets on a given prefix dir. -// If useLocal is true, the filesystem's contents are instead used. -func Dir(useLocal bool, name string) http.FileSystem { - if useLocal { - return _escDirectory{fs: _escLocal, name: name} - } - return _escDirectory{fs: _escStatic, name: name} -} - -// FSByte returns the named file from the embedded assets. If useLocal is -// true, the filesystem's contents are instead used. -func FSByte(useLocal bool, name string) ([]byte, error) { - if useLocal { - f, err := _escLocal.Open(name) - if err != nil { - return nil, err - } - b, err := ioutil.ReadAll(f) - _ = f.Close() - return b, err - } - f, err := _escStatic.prepare(name) - if err != nil { - return nil, err - } - return f.data, nil -} - -// FSMustByte is the same as FSByte, but panics if name is not present. -func FSMustByte(useLocal bool, name string) []byte { - b, err := FSByte(useLocal, name) - if err != nil { - panic(err) - } - return b -} - -// FSString is the string version of FSByte. -func FSString(useLocal bool, name string) (string, error) { - b, err := FSByte(useLocal, name) - return string(b), err -} - -// FSMustString is the string version of FSMustByte. -func FSMustString(useLocal bool, name string) string { - return string(FSMustByte(useLocal, name)) -} - -var _escData = map[string]*_escFile{ - - "/public/opencensus.css": { - local: "public/opencensus.css", - size: 0, - modtime: 1519153040, - compressed: ` -H4sIAAAAAAAC/wEAAP//AAAAAAAAAAA= -`, - }, - - "/templates/footer.html": { - local: "templates/footer.html", - size: 16, - modtime: 1519153248, - compressed: ` -H4sIAAAAAAAC/7LRT8pPqbTjstHPKMnNseMCBAAA//8ATCBFEAAAAA== -`, - }, - - "/templates/header.html": { - local: "templates/header.html", - size: 523, - modtime: 1519164535, - compressed: ` -H4sIAAAAAAAC/5TRv07rMBQG8D1P4ev1qvat7oKQEwZgYEAwdGF0nZP4UP+JfE6oqqrvjkyKBGIpky0f -+6fP+syfu6fbzcvzvfAcQ9eYuohg09hKSLIzHmzfNUIIYSKwFc7bQsCtnHlYXcnziJEDdMej2tTN6WT0 -crJMA6adKBBaST4XdjMLdDlJ4QsMrdR6v9+rPEFykGgmhVkP9q1eUeiy1D8ZPgQgD8CfxjRvAzr9BXFE -F730zBNdaz3kxKTGnMcAdkJSLkddM9wMNmI4tI+WoaANfx9cTiR/QbvcgxqBYx/q39bqv/qn45lTmHoc -82rCtFMR00fwM06u4MSihwGKoOIuJSvzSrIzehG6xuilSLPN/aHWvP7Wll93zXsAAAD//6iqQ1ULAgAA -`, - }, - - "/templates/rpcz.html": { - local: "templates/rpcz.html", - size: 2626, - modtime: 1519164559, - compressed: ` -H4sIAAAAAAAC/+yW3WrbMBTH7/0UwmUjYyxJU3o1W1C6sQ4WNrq+gCwdfzBFMtJx9+Hl3cex3DhNCrOz -XfbGxFZ+5/8D+Ry5bZ0wBbD5VxT4wdmm9tttlNQ8QZFpYFkhrbYuPQMAyHP2vVJYpufL5QueoGNCV4VJ -JRgExxNUPMmtQearX5C+XvG2nb+rHEisrNlukwUt8mRB/1ugowuF8GRR8+ggMD7L8/wSIGa5ExtIM/uD -SdDa10JWpkiX3V0tlKK7FY8ixhgjp6ECAFwqiHm3FJZLCi2DKnnsLzGphfdprM9jJi0lmfSCX9vG4FTo -6r5gWiAY+ZPNNv7VVP5WILCZq+ViOvvR1A2y2bfsBPZzg6fD752zzndU2Aza47H70r9KGnLka8DSql38 -S5P5+u3x9Vgr1HBVUSJfV2bel3i8cOOefn5ncf6c+Zz5XzKfaADyGLrlYn9UvlnxB52DERlFw4Q2oval -RRrQDyX3zBVPMhq4oXlo2mZHjXvcyqrXjzv/mAp0A29dmQbht6TfVGscdWMbN5W5syj0I2ik59V98SmM -2F5240elDlynO5kKwjtspO3tl2sa6r2qEwijYnusM50KBdE9aqRqd4DsySqBYnT2Du6UT0OD+AE7Uj6c -YKfaD/R0/YH9F/9wiE5uv4BN7L8A/a0BwxxqWzCKPg37b7bdgz8BAAD//6NjPmJCCgAA -`, - }, - - "/templates/summary.html": { - local: "templates/summary.html", - size: 1619, - modtime: 1519164559, - compressed: ` -H4sIAAAAAAAC/6yVPW/bMBCG9/yKg2p4qu2kW12JRQtkCzok3YoOlHSWBdMngaSc2iz/e8EP+Stqi8Re -DIo63t3zvjwr1TwXCEpvBWZJ3sgS5US1vKipmsNtwm4AAFItwyI8lFA0QrWcsjvgoq4oE7jQLM3ZU8sJ -vvE1prOcpTNdnhxjY8pV+yn8/j5+8KFDiZMCSaNMXPLHjqim6i2pB5v/OFDjgWukYgtPfN0KVFerNcRz -L2Ujhyuls17xv0t/pcbelsYYyalCmEbBvnbFCrVzXlmb6uU/wX8YM7X2Z0ReMmOQSmuviRIENGbEYZ7B -9LvkBap7KtumJm2teyNqWin/9sGt/GaAGsnmuaYSf733Sx/z2DyHkAmMiK/RbzreuFkvADdIh7NOBrkf -LF6sKtl0VM7hHSImjlko9EGBHyZRAUdvTMzdD8b/9IgtRKijVC/k57CUuMgSp421n3dOOgeUGePBrB3v -9LbF7NY1Of1S6HrjG+HsUMr1ft7wIXIfdUb1aoa9Ib0bGy66IH28d07ACxjvxjvV5X5pzCj65rhDpSPs -/o6e0J9Pge+G+dv98tClYlxs6IcDbPDW/wGpE8cGfB2Iiij9kHnIdOY/JezmTwAAAP//Dz6TJ1MGAAA= -`, - }, - - "/templates/traces.html": { - local: "templates/traces.html", - size: 420, - modtime: 1519164578, - compressed: ` -H4sIAAAAAAAC/4yQsU70MBCEez/FKtIv3RW/w6WgOIw7kGgoDiRqO14gwnGM1xEgs++OnKMA5Qq2ssYz -I82nolZW30UT4NaMuIdSZH0wg2qtVm3UQkVd1XlkhgO+zkiZvj8SavHwjAFO35U3kdDBhrDfiv9/PFFK -MuEJQR6mN2IuJaYh5Edo/nXn1MBmCA7fQV4P6B3B2ZYZfnh23dqzO3p+i12tlp85mR4HxyxKweCYVbvs -UjYt25UFyh8eL5t+8lPaWz/jRaPva+zGVUowogkEZMbo0UE6MpKiIlinTf9yMh6mvKpYMH8FAAD//yQs -JUakAQAA -`, - }, - - "/": { - isDir: true, - local: "", - }, - - "/public": { - isDir: true, - local: "public", - }, - - "/templates": { - isDir: true, - local: "templates", - }, -} diff --git a/vendor/go.opencensus.io/zpages/rpcz.go b/vendor/go.opencensus.io/zpages/rpcz.go deleted file mode 100644 index ef4dd15b3..000000000 --- a/vendor/go.opencensus.io/zpages/rpcz.go +++ /dev/null @@ -1,333 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package zpages - -import ( - "fmt" - "io" - "log" - "math" - "net/http" - "sort" - "sync" - "text/tabwriter" - "time" - - "go.opencensus.io/plugin/ocgrpc" - "go.opencensus.io/stats/view" -) - -const bytesPerKb = 1024 - -var ( - programStartTime = time.Now() - mu sync.Mutex // protects snaps - snaps = make(map[methodKey]*statSnapshot) - - // viewType lists the views we are interested in for RPC stats. - // A view's map value indicates whether that view contains data for received - // RPCs. - viewType = map[*view.View]bool{ - ocgrpc.ClientCompletedRPCsView: false, - ocgrpc.ClientSentBytesPerRPCView: false, - ocgrpc.ClientSentMessagesPerRPCView: false, - ocgrpc.ClientReceivedBytesPerRPCView: false, - ocgrpc.ClientReceivedMessagesPerRPCView: false, - ocgrpc.ClientRoundtripLatencyView: false, - ocgrpc.ServerCompletedRPCsView: true, - ocgrpc.ServerReceivedBytesPerRPCView: true, - ocgrpc.ServerReceivedMessagesPerRPCView: true, - ocgrpc.ServerSentBytesPerRPCView: true, - ocgrpc.ServerSentMessagesPerRPCView: true, - ocgrpc.ServerLatencyView: true, - } -) - -func registerRPCViews() { - views := make([]*view.View, 0, len(viewType)) - for v := range viewType { - views = append(views, v) - } - if err := view.Register(views...); err != nil { - log.Printf("error subscribing to views: %v", err) - } - view.RegisterExporter(snapExporter{}) -} - -func rpczHandler(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "text/html; charset=utf-8") - WriteHTMLRpczPage(w) -} - -// WriteHTMLRpczPage writes an HTML document to w containing per-method RPC stats. -func WriteHTMLRpczPage(w io.Writer) { - if err := headerTemplate.Execute(w, headerData{Title: "RPC Stats"}); err != nil { - log.Printf("zpages: executing template: %v", err) - } - WriteHTMLRpczSummary(w) - if err := footerTemplate.Execute(w, nil); err != nil { - log.Printf("zpages: executing template: %v", err) - } -} - -// WriteHTMLRpczSummary writes HTML to w containing per-method RPC stats. -// -// It includes neither a header nor footer, so you can embed this data in other pages. -func WriteHTMLRpczSummary(w io.Writer) { - mu.Lock() - if err := statsTemplate.Execute(w, getStatsPage()); err != nil { - log.Printf("zpages: executing template: %v", err) - } - mu.Unlock() -} - -// WriteTextRpczPage writes formatted text to w containing per-method RPC stats. -func WriteTextRpczPage(w io.Writer) { - mu.Lock() - defer mu.Unlock() - page := getStatsPage() - - for i, sg := range page.StatGroups { - switch i { - case 0: - fmt.Fprint(w, "Sent:\n") - case 1: - fmt.Fprint(w, "\nReceived:\n") - } - tw := tabwriter.NewWriter(w, 6, 8, 1, ' ', 0) - fmt.Fprint(tw, "Method\tCount\t\t\tAvgLat\t\t\tMaxLat\t\t\tRate\t\t\tIn (MiB/s)\t\t\tOut (MiB/s)\t\t\tErrors\t\t\n") - fmt.Fprint(tw, "\tMin\tHr\tTot\tMin\tHr\tTot\tMin\tHr\tTot\tMin\tHr\tTot\tMin\tHr\tTot\tMin\tHr\tTot\tMin\tHr\tTot\n") - for _, s := range sg.Snapshots { - fmt.Fprintf(tw, "%s\t%d\t%d\t%d\t%v\t%v\t%v\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d\t%d\t%d\n", - s.Method, - s.CountMinute, - s.CountHour, - s.CountTotal, - s.AvgLatencyMinute, - s.AvgLatencyHour, - s.AvgLatencyTotal, - s.RPCRateMinute, - s.RPCRateHour, - s.RPCRateTotal, - s.InputRateMinute/bytesPerKb, - s.InputRateHour/bytesPerKb, - s.InputRateTotal/bytesPerKb, - s.OutputRateMinute/bytesPerKb, - s.OutputRateHour/bytesPerKb, - s.OutputRateTotal/bytesPerKb, - s.ErrorsMinute, - s.ErrorsHour, - s.ErrorsTotal) - } - tw.Flush() - } -} - -// headerData contains data for the header template. -type headerData struct { - Title string -} - -// statsPage aggregates stats on the page for 'sent' and 'received' categories -type statsPage struct { - StatGroups []*statGroup -} - -// statGroup aggregates snapshots for a directional category -type statGroup struct { - Direction string - Snapshots []*statSnapshot -} - -func (s *statGroup) Len() int { - return len(s.Snapshots) -} - -func (s *statGroup) Swap(i, j int) { - s.Snapshots[i], s.Snapshots[j] = s.Snapshots[j], s.Snapshots[i] -} - -func (s *statGroup) Less(i, j int) bool { - return s.Snapshots[i].Method < s.Snapshots[j].Method -} - -// statSnapshot holds the data items that are presented in a single row of RPC -// stat information. -type statSnapshot struct { - // TODO: compute hour/minute values from cumulative - Method string - Received bool - CountMinute uint64 - CountHour uint64 - CountTotal uint64 - AvgLatencyMinute time.Duration - AvgLatencyHour time.Duration - AvgLatencyTotal time.Duration - RPCRateMinute float64 - RPCRateHour float64 - RPCRateTotal float64 - InputRateMinute float64 - InputRateHour float64 - InputRateTotal float64 - OutputRateMinute float64 - OutputRateHour float64 - OutputRateTotal float64 - ErrorsMinute uint64 - ErrorsHour uint64 - ErrorsTotal uint64 -} - -type methodKey struct { - method string - received bool -} - -type snapExporter struct{} - -func (s snapExporter) ExportView(vd *view.Data) { - received, ok := viewType[vd.View] - if !ok { - return - } - if len(vd.Rows) == 0 { - return - } - ageSec := float64(time.Since(programStartTime)) / float64(time.Second) - - computeRate := func(maxSec, x float64) float64 { - dur := ageSec - if maxSec > 0 && dur > maxSec { - dur = maxSec - } - return x / dur - } - - convertTime := func(ms float64) time.Duration { - if math.IsInf(ms, 0) || math.IsNaN(ms) { - return 0 - } - return time.Duration(float64(time.Millisecond) * ms) - } - - haveResetErrors := make(map[string]struct{}) - - mu.Lock() - defer mu.Unlock() - for _, row := range vd.Rows { - var method string - for _, tag := range row.Tags { - if tag.Key == ocgrpc.KeyClientMethod || tag.Key == ocgrpc.KeyServerMethod { - method = tag.Value - break - } - } - - key := methodKey{method: method, received: received} - s := snaps[key] - if s == nil { - s = &statSnapshot{Method: method, Received: received} - snaps[key] = s - } - - var ( - sum float64 - count float64 - ) - switch v := row.Data.(type) { - case *view.CountData: - sum = float64(v.Value) - count = float64(v.Value) - case *view.DistributionData: - sum = v.Sum() - count = float64(v.Count) - case *view.SumData: - sum = v.Value - count = v.Value - } - - // Update field of s corresponding to the view. - switch vd.View { - case ocgrpc.ClientCompletedRPCsView: - if _, ok := haveResetErrors[method]; !ok { - haveResetErrors[method] = struct{}{} - s.ErrorsTotal = 0 - } - for _, tag := range row.Tags { - if tag.Key == ocgrpc.KeyClientStatus && tag.Value != "OK" { - s.ErrorsTotal += uint64(count) - } - } - - case ocgrpc.ClientRoundtripLatencyView: - s.AvgLatencyTotal = convertTime(sum / count) - - case ocgrpc.ClientSentBytesPerRPCView: - s.OutputRateTotal = computeRate(0, sum) - - case ocgrpc.ClientReceivedBytesPerRPCView: - s.InputRateTotal = computeRate(0, sum) - - case ocgrpc.ClientSentMessagesPerRPCView: - s.CountTotal = uint64(count) - s.RPCRateTotal = computeRate(0, count) - - case ocgrpc.ClientReceivedMessagesPerRPCView: - // currently unused - - case ocgrpc.ServerCompletedRPCsView: - if _, ok := haveResetErrors[method]; !ok { - haveResetErrors[method] = struct{}{} - s.ErrorsTotal = 0 - } - for _, tag := range row.Tags { - if tag.Key == ocgrpc.KeyServerStatus && tag.Value != "OK" { - s.ErrorsTotal += uint64(count) - } - } - - case ocgrpc.ServerLatencyView: - s.AvgLatencyTotal = convertTime(sum / count) - - case ocgrpc.ServerSentBytesPerRPCView: - s.OutputRateTotal = computeRate(0, sum) - - case ocgrpc.ServerReceivedMessagesPerRPCView: - s.CountTotal = uint64(count) - s.RPCRateTotal = computeRate(0, count) - - case ocgrpc.ServerSentMessagesPerRPCView: - // currently unused - } - } -} - -func getStatsPage() *statsPage { - sentStats := statGroup{Direction: "Sent"} - receivedStats := statGroup{Direction: "Received"} - for key, sg := range snaps { - if key.received { - receivedStats.Snapshots = append(receivedStats.Snapshots, sg) - } else { - sentStats.Snapshots = append(sentStats.Snapshots, sg) - } - } - sort.Sort(&sentStats) - sort.Sort(&receivedStats) - - return &statsPage{ - StatGroups: []*statGroup{&sentStats, &receivedStats}, - } -} diff --git a/vendor/go.opencensus.io/zpages/templates.go b/vendor/go.opencensus.io/zpages/templates.go deleted file mode 100644 index 6675b0ab0..000000000 --- a/vendor/go.opencensus.io/zpages/templates.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package zpages - -import ( - "fmt" - "html/template" - "io/ioutil" - "log" - "strconv" - "time" - - "go.opencensus.io/trace" - "go.opencensus.io/zpages/internal" -) - -var ( - fs = internal.FS(false) - templateFunctions = template.FuncMap{ - "count": countFormatter, - "ms": msFormatter, - "rate": rateFormatter, - "datarate": dataRateFormatter, - "even": even, - "traceid": traceIDFormatter, - } - headerTemplate = parseTemplate("header") - summaryTableTemplate = parseTemplate("summary") - statsTemplate = parseTemplate("rpcz") - tracesTableTemplate = parseTemplate("traces") - footerTemplate = parseTemplate("footer") -) - -func parseTemplate(name string) *template.Template { - f, err := fs.Open("/templates/" + name + ".html") - if err != nil { - log.Panicf("%v: %v", name, err) - } - defer f.Close() - text, err := ioutil.ReadAll(f) - if err != nil { - log.Panicf("%v: %v", name, err) - } - return template.Must(template.New(name).Funcs(templateFunctions).Parse(string(text))) -} - -func countFormatter(num uint64) string { - if num <= 0 { - return " " - } - var floatVal float64 - var suffix string - - if num >= 1e18 { - floatVal = float64(num) / 1e18 - suffix = " E " - } else if num >= 1e15 { - floatVal = float64(num) / 1e15 - suffix = " P " - } else if num >= 1e12 { - floatVal = float64(num) / 1e12 - suffix = " T " - } else if num >= 1e9 { - floatVal = float64(num) / 1e9 - suffix = " G " - } else if num >= 1e6 { - floatVal = float64(num) / 1e6 - suffix = " M " - } - - if floatVal != 0 { - return fmt.Sprintf("%1.3f%s", floatVal, suffix) - } - return fmt.Sprint(num) -} - -func msFormatter(d time.Duration) string { - if d == 0 { - return "0" - } - if d < 10*time.Millisecond { - return fmt.Sprintf("%.3f", float64(d)*1e-6) - } - return strconv.Itoa(int(d / time.Millisecond)) -} - -func rateFormatter(r float64) string { - return fmt.Sprintf("%.3f", r) -} - -func dataRateFormatter(b float64) string { - return fmt.Sprintf("%.3f", b/1e6) -} - -func traceIDFormatter(r traceRow) template.HTML { - sc := r.SpanContext - if sc == (trace.SpanContext{}) { - return "" - } - col := "black" - if sc.TraceOptions.IsSampled() { - col = "blue" - } - if r.ParentSpanID != (trace.SpanID{}) { - return template.HTML(fmt.Sprintf(`trace_id: %s span_id: %s parent_span_id: %s`, col, sc.TraceID, sc.SpanID, r.ParentSpanID)) - } - return template.HTML(fmt.Sprintf(`trace_id: %s span_id: %s`, col, sc.TraceID, sc.SpanID)) -} - -func even(x int) bool { - return x%2 == 0 -} diff --git a/vendor/go.opencensus.io/zpages/tracez.go b/vendor/go.opencensus.io/zpages/tracez.go deleted file mode 100644 index 330022c23..000000000 --- a/vendor/go.opencensus.io/zpages/tracez.go +++ /dev/null @@ -1,442 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -package zpages - -import ( - "fmt" - "io" - "log" - "net/http" - "sort" - "strconv" - "strings" - "text/tabwriter" - "time" - - "go.opencensus.io/internal" - "go.opencensus.io/trace" -) - -const ( - // spanNameQueryField is the header for span name. - spanNameQueryField = "zspanname" - // spanTypeQueryField is the header for type (running = 0, latency = 1, error = 2) to display. - spanTypeQueryField = "ztype" - // spanSubtypeQueryField is the header for sub-type: - // * for latency based samples [0, 8] representing the latency buckets, where 0 is the first one; - // * for error based samples, 0 means all, otherwise the error code; - spanSubtypeQueryField = "zsubtype" - // maxTraceMessageLength is the maximum length of a message in tracez output. - maxTraceMessageLength = 1024 -) - -var ( - defaultLatencies = [...]time.Duration{ - 10 * time.Microsecond, - 100 * time.Microsecond, - time.Millisecond, - 10 * time.Millisecond, - 100 * time.Millisecond, - time.Second, - 10 * time.Second, - 100 * time.Second, - } - canonicalCodes = [...]string{ - "OK", - "CANCELLED", - "UNKNOWN", - "INVALID_ARGUMENT", - "DEADLINE_EXCEEDED", - "NOT_FOUND", - "ALREADY_EXISTS", - "PERMISSION_DENIED", - "RESOURCE_EXHAUSTED", - "FAILED_PRECONDITION", - "ABORTED", - "OUT_OF_RANGE", - "UNIMPLEMENTED", - "INTERNAL", - "UNAVAILABLE", - "DATA_LOSS", - "UNAUTHENTICATED", - } -) - -func canonicalCodeString(code int32) string { - if code < 0 || int(code) >= len(canonicalCodes) { - return "error code " + strconv.FormatInt(int64(code), 10) - } - return canonicalCodes[code] -} - -func tracezHandler(w http.ResponseWriter, r *http.Request) { - r.ParseForm() - w.Header().Set("Content-Type", "text/html; charset=utf-8") - name := r.Form.Get(spanNameQueryField) - t, _ := strconv.Atoi(r.Form.Get(spanTypeQueryField)) - st, _ := strconv.Atoi(r.Form.Get(spanSubtypeQueryField)) - WriteHTMLTracezPage(w, name, t, st) -} - -// WriteHTMLTracezPage writes an HTML document to w containing locally-sampled trace spans. -func WriteHTMLTracezPage(w io.Writer, spanName string, spanType, spanSubtype int) { - if err := headerTemplate.Execute(w, headerData{Title: "Trace Spans"}); err != nil { - log.Printf("zpages: executing template: %v", err) - } - WriteHTMLTracezSummary(w) - WriteHTMLTracezSpans(w, spanName, spanType, spanSubtype) - if err := footerTemplate.Execute(w, nil); err != nil { - log.Printf("zpages: executing template: %v", err) - } -} - -// WriteHTMLTracezSummary writes HTML to w containing a summary of locally-sampled trace spans. -// -// It includes neither a header nor footer, so you can embed this data in other pages. -func WriteHTMLTracezSummary(w io.Writer) { - if err := summaryTableTemplate.Execute(w, getSummaryPageData()); err != nil { - log.Printf("zpages: executing template: %v", err) - } -} - -// WriteHTMLTracezSpans writes HTML to w containing locally-sampled trace spans. -// -// It includes neither a header nor footer, so you can embed this data in other pages. -func WriteHTMLTracezSpans(w io.Writer, spanName string, spanType, spanSubtype int) { - if spanName == "" { - return - } - if err := tracesTableTemplate.Execute(w, traceDataFromSpans(spanName, traceSpans(spanName, spanType, spanSubtype))); err != nil { - log.Printf("zpages: executing template: %v", err) - } -} - -// WriteTextTracezSpans writes formatted text to w containing locally-sampled trace spans. -func WriteTextTracezSpans(w io.Writer, spanName string, spanType, spanSubtype int) { - spans := traceSpans(spanName, spanType, spanSubtype) - data := traceDataFromSpans(spanName, spans) - writeTextTraces(w, data) -} - -// WriteTextTracezSummary writes formatted text to w containing a summary of locally-sampled trace spans. -func WriteTextTracezSummary(w io.Writer) { - w.Write([]byte("Locally sampled spans summary\n\n")) - - data := getSummaryPageData() - if len(data.Rows) == 0 { - return - } - - tw := tabwriter.NewWriter(w, 8, 8, 1, ' ', 0) - - for i, s := range data.Header { - if i != 0 { - tw.Write([]byte("\t")) - } - tw.Write([]byte(s)) - } - tw.Write([]byte("\n")) - - put := func(x int) { - if x == 0 { - tw.Write([]byte(".\t")) - return - } - fmt.Fprintf(tw, "%d\t", x) - } - for _, r := range data.Rows { - tw.Write([]byte(r.Name)) - tw.Write([]byte("\t")) - put(r.Active) - for _, l := range r.Latency { - put(l) - } - put(r.Errors) - tw.Write([]byte("\n")) - } - tw.Flush() -} - -// traceData contains data for the trace data template. -type traceData struct { - Name string - Num int - Rows []traceRow -} - -type traceRow struct { - Fields [3]string - trace.SpanContext - ParentSpanID trace.SpanID -} - -type events []interface{} - -func (e events) Len() int { return len(e) } -func (e events) Less(i, j int) bool { - var ti time.Time - switch x := e[i].(type) { - case *trace.Annotation: - ti = x.Time - case *trace.MessageEvent: - ti = x.Time - } - switch x := e[j].(type) { - case *trace.Annotation: - return ti.Before(x.Time) - case *trace.MessageEvent: - return ti.Before(x.Time) - } - return false -} - -func (e events) Swap(i, j int) { e[i], e[j] = e[j], e[i] } - -func traceRows(s *trace.SpanData) []traceRow { - start := s.StartTime - - lasty, lastm, lastd := start.Date() - wholeTime := func(t time.Time) string { - return t.Format("2006/01/02-15:04:05") + fmt.Sprintf(".%06d", t.Nanosecond()/1000) - } - formatTime := func(t time.Time) string { - y, m, d := t.Date() - if y == lasty && m == lastm && d == lastd { - return t.Format(" 15:04:05") + fmt.Sprintf(".%06d", t.Nanosecond()/1000) - } - lasty, lastm, lastd = y, m, d - return wholeTime(t) - } - - lastTime := start - formatElapsed := func(t time.Time) string { - d := t.Sub(lastTime) - lastTime = t - u := int64(d / 1000) - // There are five cases for duration printing: - // -1234567890s - // -1234.123456 - // .123456 - // 12345.123456 - // 12345678901s - switch { - case u < -9999999999: - return fmt.Sprintf("%11ds", u/1e6) - case u < 0: - sec := u / 1e6 - u -= sec * 1e6 - return fmt.Sprintf("%5d.%06d", sec, -u) - case u < 1e6: - return fmt.Sprintf(" .%6d", u) - case u <= 99999999999: - sec := u / 1e6 - u -= sec * 1e6 - return fmt.Sprintf("%5d.%06d", sec, u) - default: - return fmt.Sprintf("%11ds", u/1e6) - } - } - - firstRow := traceRow{Fields: [3]string{wholeTime(start), "", ""}, SpanContext: s.SpanContext, ParentSpanID: s.ParentSpanID} - if s.EndTime.IsZero() { - firstRow.Fields[1] = " " - } else { - firstRow.Fields[1] = formatElapsed(s.EndTime) - lastTime = start - } - out := []traceRow{firstRow} - - formatAttributes := func(a map[string]interface{}) string { - if len(a) == 0 { - return "" - } - var keys []string - for key := range a { - keys = append(keys, key) - } - sort.Strings(keys) - var s []string - for _, key := range keys { - val := a[key] - switch val.(type) { - case string: - s = append(s, fmt.Sprintf("%s=%q", key, val)) - default: - s = append(s, fmt.Sprintf("%s=%v", key, val)) - } - } - return "Attributes:{" + strings.Join(s, ", ") + "}" - } - - if s.Status != (trace.Status{}) { - msg := fmt.Sprintf("Status{canonicalCode=%s, description=%q}", - canonicalCodeString(s.Status.Code), s.Status.Message) - out = append(out, traceRow{Fields: [3]string{"", "", msg}}) - } - - if len(s.Attributes) != 0 { - out = append(out, traceRow{Fields: [3]string{"", "", formatAttributes(s.Attributes)}}) - } - - var es events - for i := range s.Annotations { - es = append(es, &s.Annotations[i]) - } - for i := range s.MessageEvents { - es = append(es, &s.MessageEvents[i]) - } - sort.Sort(es) - for _, e := range es { - switch e := e.(type) { - case *trace.Annotation: - msg := e.Message - if len(e.Attributes) != 0 { - msg = msg + " " + formatAttributes(e.Attributes) - } - row := traceRow{Fields: [3]string{ - formatTime(e.Time), - formatElapsed(e.Time), - msg, - }} - out = append(out, row) - case *trace.MessageEvent: - row := traceRow{Fields: [3]string{formatTime(e.Time), formatElapsed(e.Time)}} - switch e.EventType { - case trace.MessageEventTypeSent: - row.Fields[2] = fmt.Sprintf("sent message [%d bytes, %d compressed bytes]", e.UncompressedByteSize, e.CompressedByteSize) - case trace.MessageEventTypeRecv: - row.Fields[2] = fmt.Sprintf("received message [%d bytes, %d compressed bytes]", e.UncompressedByteSize, e.CompressedByteSize) - } - out = append(out, row) - } - } - for i := range out { - if len(out[i].Fields[2]) > maxTraceMessageLength { - out[i].Fields[2] = out[i].Fields[2][:maxTraceMessageLength] - } - } - return out -} - -func traceSpans(spanName string, spanType, spanSubtype int) []*trace.SpanData { - internalTrace := internal.Trace.(interface { - ReportActiveSpans(name string) []*trace.SpanData - ReportSpansByError(name string, code int32) []*trace.SpanData - ReportSpansByLatency(name string, minLatency, maxLatency time.Duration) []*trace.SpanData - }) - var spans []*trace.SpanData - switch spanType { - case 0: // active - spans = internalTrace.ReportActiveSpans(spanName) - case 1: // latency - var min, max time.Duration - n := len(defaultLatencies) - if spanSubtype == 0 { - max = defaultLatencies[0] - } else if spanSubtype == n { - min, max = defaultLatencies[spanSubtype-1], (1<<63)-1 - } else if 0 < spanSubtype && spanSubtype < n { - min, max = defaultLatencies[spanSubtype-1], defaultLatencies[spanSubtype] - } - spans = internalTrace.ReportSpansByLatency(spanName, min, max) - case 2: // error - spans = internalTrace.ReportSpansByError(spanName, 0) - } - return spans -} - -func traceDataFromSpans(name string, spans []*trace.SpanData) traceData { - data := traceData{ - Name: name, - Num: len(spans), - } - for _, s := range spans { - data.Rows = append(data.Rows, traceRows(s)...) - } - return data -} - -func writeTextTraces(w io.Writer, data traceData) { - tw := tabwriter.NewWriter(w, 1, 8, 1, ' ', 0) - fmt.Fprint(tw, "When\tElapsed(s)\tType\n") - for _, r := range data.Rows { - tw.Write([]byte(r.Fields[0])) - tw.Write([]byte("\t")) - tw.Write([]byte(r.Fields[1])) - tw.Write([]byte("\t")) - tw.Write([]byte(r.Fields[2])) - if sc := r.SpanContext; sc != (trace.SpanContext{}) { - fmt.Fprintf(tw, "trace_id: %s span_id: %s", sc.TraceID, sc.SpanID) - if r.ParentSpanID != (trace.SpanID{}) { - fmt.Fprintf(tw, " parent_span_id: %s", r.ParentSpanID) - } - } - tw.Write([]byte("\n")) - } - tw.Flush() -} - -type summaryPageData struct { - Header []string - LatencyBucketNames []string - Links bool - TracesEndpoint string - Rows []summaryPageRow -} - -type summaryPageRow struct { - Name string - Active int - Latency []int - Errors int -} - -func getSummaryPageData() summaryPageData { - data := summaryPageData{ - Links: true, - TracesEndpoint: "tracez", - } - internalTrace := internal.Trace.(interface { - ReportSpansPerMethod() map[string]internal.PerMethodSummary - }) - for name, s := range internalTrace.ReportSpansPerMethod() { - if len(data.Header) == 0 { - data.Header = []string{"Name", "Active"} - for _, b := range s.LatencyBuckets { - l := b.MinLatency - s := fmt.Sprintf(">%v", l) - if l == 100*time.Second { - s = ">100s" - } - data.Header = append(data.Header, s) - data.LatencyBucketNames = append(data.LatencyBucketNames, s) - } - data.Header = append(data.Header, "Errors") - } - row := summaryPageRow{Name: name, Active: s.Active} - for _, l := range s.LatencyBuckets { - row.Latency = append(row.Latency, l.Size) - } - for _, e := range s.ErrorBuckets { - row.Errors += e.Size - } - data.Rows = append(data.Rows, row) - } - sort.Slice(data.Rows, func(i, j int) bool { - return data.Rows[i].Name < data.Rows[j].Name - }) - return data -} diff --git a/vendor/go.opencensus.io/zpages/zpages.go b/vendor/go.opencensus.io/zpages/zpages.go deleted file mode 100644 index 5929d1fe7..000000000 --- a/vendor/go.opencensus.io/zpages/zpages.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2017, OpenCensus Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -// Package zpages implements a collection of HTML pages that display RPC stats -// and trace data, and also functions to write that same data in plain text to -// an io.Writer. -// -// Users can also embed the HTML for stats and traces in custom status pages. -// -// zpages are currrently work-in-process and cannot display minutely and -// hourly stats correctly. -// -// Performance -// -// Installing the zpages has a performance overhead because additional traces -// and stats will be collected in-process. In most cases, we expect this -// overhead will not be significant but it depends on many factors, including -// how many spans your process creates and how richly annotated they are. -package zpages // import "go.opencensus.io/zpages" - -import ( - "net/http" - "path" - "sync" - - "go.opencensus.io/internal" -) - -// TODO(ramonza): Remove Handler to make initialization lazy. - -// Handler is deprecated: Use Handle. -var Handler http.Handler - -func init() { - mux := http.NewServeMux() - Handle(mux, "/") - Handler = mux -} - -// Handle adds the z-pages to the given ServeMux rooted at pathPrefix. -func Handle(mux *http.ServeMux, pathPrefix string) { - enable() - if mux == nil { - mux = http.DefaultServeMux - } - mux.HandleFunc(path.Join(pathPrefix, "rpcz"), rpczHandler) - mux.HandleFunc(path.Join(pathPrefix, "tracez"), tracezHandler) - mux.Handle(path.Join(pathPrefix, "public/"), http.FileServer(fs)) -} - -var enableOnce sync.Once - -func enable() { - enableOnce.Do(func() { - internal.LocalSpanStoreEnabled = true - registerRPCViews() - }) -} diff --git a/vendor/golang.org/x/net/context/context.go b/vendor/golang.org/x/net/context/context.go deleted file mode 100644 index a3c021d3f..000000000 --- a/vendor/golang.org/x/net/context/context.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package context defines the Context type, which carries deadlines, -// cancelation signals, and other request-scoped values across API boundaries -// and between processes. -// As of Go 1.7 this package is available in the standard library under the -// name context. https://golang.org/pkg/context. -// -// Incoming requests to a server should create a Context, and outgoing calls to -// servers should accept a Context. The chain of function calls between must -// propagate the Context, optionally replacing it with a modified copy created -// using WithDeadline, WithTimeout, WithCancel, or WithValue. -// -// Programs that use Contexts should follow these rules to keep interfaces -// consistent across packages and enable static analysis tools to check context -// propagation: -// -// Do not store Contexts inside a struct type; instead, pass a Context -// explicitly to each function that needs it. The Context should be the first -// parameter, typically named ctx: -// -// func DoSomething(ctx context.Context, arg Arg) error { -// // ... use ctx ... -// } -// -// Do not pass a nil Context, even if a function permits it. Pass context.TODO -// if you are unsure about which Context to use. -// -// Use context Values only for request-scoped data that transits processes and -// APIs, not for passing optional parameters to functions. -// -// The same Context may be passed to functions running in different goroutines; -// Contexts are safe for simultaneous use by multiple goroutines. -// -// See http://blog.golang.org/context for example code for a server that uses -// Contexts. -package context // import "golang.org/x/net/context" - -// Background returns a non-nil, empty Context. It is never canceled, has no -// values, and has no deadline. It is typically used by the main function, -// initialization, and tests, and as the top-level Context for incoming -// requests. -func Background() Context { - return background -} - -// TODO returns a non-nil, empty Context. Code should use context.TODO when -// it's unclear which Context to use or it is not yet available (because the -// surrounding function has not yet been extended to accept a Context -// parameter). TODO is recognized by static analysis tools that determine -// whether Contexts are propagated correctly in a program. -func TODO() Context { - return todo -} diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go deleted file mode 100644 index 37dc0cfdb..000000000 --- a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ctxhttp provides helper functions for performing context-aware HTTP requests. -package ctxhttp // import "golang.org/x/net/context/ctxhttp" - -import ( - "context" - "io" - "net/http" - "net/url" - "strings" -) - -// Do sends an HTTP request with the provided http.Client and returns -// an HTTP response. -// -// If the client is nil, http.DefaultClient is used. -// -// The provided ctx must be non-nil. If it is canceled or times out, -// ctx.Err() will be returned. -func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { - if client == nil { - client = http.DefaultClient - } - resp, err := client.Do(req.WithContext(ctx)) - // If we got an error, and the context has been canceled, - // the context's error is probably more useful. - if err != nil { - select { - case <-ctx.Done(): - err = ctx.Err() - default: - } - } - return resp, err -} - -// Get issues a GET request via the Do function. -func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) { - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return nil, err - } - return Do(ctx, client, req) -} - -// Head issues a HEAD request via the Do function. -func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) { - req, err := http.NewRequest("HEAD", url, nil) - if err != nil { - return nil, err - } - return Do(ctx, client, req) -} - -// Post issues a POST request via the Do function. -func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) { - req, err := http.NewRequest("POST", url, body) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", bodyType) - return Do(ctx, client, req) -} - -// PostForm issues a POST request via the Do function. -func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) { - return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) -} diff --git a/vendor/golang.org/x/net/context/go17.go b/vendor/golang.org/x/net/context/go17.go deleted file mode 100644 index d20f52b7d..000000000 --- a/vendor/golang.org/x/net/context/go17.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.7 - -package context - -import ( - "context" // standard library's context, as of Go 1.7 - "time" -) - -var ( - todo = context.TODO() - background = context.Background() -) - -// Canceled is the error returned by Context.Err when the context is canceled. -var Canceled = context.Canceled - -// DeadlineExceeded is the error returned by Context.Err when the context's -// deadline passes. -var DeadlineExceeded = context.DeadlineExceeded - -// WithCancel returns a copy of parent with a new Done channel. The returned -// context's Done channel is closed when the returned cancel function is called -// or when the parent context's Done channel is closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { - ctx, f := context.WithCancel(parent) - return ctx, CancelFunc(f) -} - -// WithDeadline returns a copy of the parent context with the deadline adjusted -// to be no later than d. If the parent's deadline is already earlier than d, -// WithDeadline(parent, d) is semantically equivalent to parent. The returned -// context's Done channel is closed when the deadline expires, when the returned -// cancel function is called, or when the parent context's Done channel is -// closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { - ctx, f := context.WithDeadline(parent, deadline) - return ctx, CancelFunc(f) -} - -// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete: -// -// func slowOperationWithTimeout(ctx context.Context) (Result, error) { -// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) -// defer cancel() // releases resources if slowOperation completes before timeout elapses -// return slowOperation(ctx) -// } -func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { - return WithDeadline(parent, time.Now().Add(timeout)) -} - -// WithValue returns a copy of parent in which the value associated with key is -// val. -// -// Use context Values only for request-scoped data that transits processes and -// APIs, not for passing optional parameters to functions. -func WithValue(parent Context, key interface{}, val interface{}) Context { - return context.WithValue(parent, key, val) -} diff --git a/vendor/golang.org/x/net/context/go19.go b/vendor/golang.org/x/net/context/go19.go deleted file mode 100644 index d88bd1db1..000000000 --- a/vendor/golang.org/x/net/context/go19.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.9 - -package context - -import "context" // standard library's context, as of Go 1.7 - -// A Context carries a deadline, a cancelation signal, and other values across -// API boundaries. -// -// Context's methods may be called by multiple goroutines simultaneously. -type Context = context.Context - -// A CancelFunc tells an operation to abandon its work. -// A CancelFunc does not wait for the work to stop. -// After the first call, subsequent calls to a CancelFunc do nothing. -type CancelFunc = context.CancelFunc diff --git a/vendor/golang.org/x/net/context/pre_go17.go b/vendor/golang.org/x/net/context/pre_go17.go deleted file mode 100644 index 0f35592df..000000000 --- a/vendor/golang.org/x/net/context/pre_go17.go +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.7 - -package context - -import ( - "errors" - "fmt" - "sync" - "time" -) - -// An emptyCtx is never canceled, has no values, and has no deadline. It is not -// struct{}, since vars of this type must have distinct addresses. -type emptyCtx int - -func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { - return -} - -func (*emptyCtx) Done() <-chan struct{} { - return nil -} - -func (*emptyCtx) Err() error { - return nil -} - -func (*emptyCtx) Value(key interface{}) interface{} { - return nil -} - -func (e *emptyCtx) String() string { - switch e { - case background: - return "context.Background" - case todo: - return "context.TODO" - } - return "unknown empty Context" -} - -var ( - background = new(emptyCtx) - todo = new(emptyCtx) -) - -// Canceled is the error returned by Context.Err when the context is canceled. -var Canceled = errors.New("context canceled") - -// DeadlineExceeded is the error returned by Context.Err when the context's -// deadline passes. -var DeadlineExceeded = errors.New("context deadline exceeded") - -// WithCancel returns a copy of parent with a new Done channel. The returned -// context's Done channel is closed when the returned cancel function is called -// or when the parent context's Done channel is closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { - c := newCancelCtx(parent) - propagateCancel(parent, c) - return c, func() { c.cancel(true, Canceled) } -} - -// newCancelCtx returns an initialized cancelCtx. -func newCancelCtx(parent Context) *cancelCtx { - return &cancelCtx{ - Context: parent, - done: make(chan struct{}), - } -} - -// propagateCancel arranges for child to be canceled when parent is. -func propagateCancel(parent Context, child canceler) { - if parent.Done() == nil { - return // parent is never canceled - } - if p, ok := parentCancelCtx(parent); ok { - p.mu.Lock() - if p.err != nil { - // parent has already been canceled - child.cancel(false, p.err) - } else { - if p.children == nil { - p.children = make(map[canceler]bool) - } - p.children[child] = true - } - p.mu.Unlock() - } else { - go func() { - select { - case <-parent.Done(): - child.cancel(false, parent.Err()) - case <-child.Done(): - } - }() - } -} - -// parentCancelCtx follows a chain of parent references until it finds a -// *cancelCtx. This function understands how each of the concrete types in this -// package represents its parent. -func parentCancelCtx(parent Context) (*cancelCtx, bool) { - for { - switch c := parent.(type) { - case *cancelCtx: - return c, true - case *timerCtx: - return c.cancelCtx, true - case *valueCtx: - parent = c.Context - default: - return nil, false - } - } -} - -// removeChild removes a context from its parent. -func removeChild(parent Context, child canceler) { - p, ok := parentCancelCtx(parent) - if !ok { - return - } - p.mu.Lock() - if p.children != nil { - delete(p.children, child) - } - p.mu.Unlock() -} - -// A canceler is a context type that can be canceled directly. The -// implementations are *cancelCtx and *timerCtx. -type canceler interface { - cancel(removeFromParent bool, err error) - Done() <-chan struct{} -} - -// A cancelCtx can be canceled. When canceled, it also cancels any children -// that implement canceler. -type cancelCtx struct { - Context - - done chan struct{} // closed by the first cancel call. - - mu sync.Mutex - children map[canceler]bool // set to nil by the first cancel call - err error // set to non-nil by the first cancel call -} - -func (c *cancelCtx) Done() <-chan struct{} { - return c.done -} - -func (c *cancelCtx) Err() error { - c.mu.Lock() - defer c.mu.Unlock() - return c.err -} - -func (c *cancelCtx) String() string { - return fmt.Sprintf("%v.WithCancel", c.Context) -} - -// cancel closes c.done, cancels each of c's children, and, if -// removeFromParent is true, removes c from its parent's children. -func (c *cancelCtx) cancel(removeFromParent bool, err error) { - if err == nil { - panic("context: internal error: missing cancel error") - } - c.mu.Lock() - if c.err != nil { - c.mu.Unlock() - return // already canceled - } - c.err = err - close(c.done) - for child := range c.children { - // NOTE: acquiring the child's lock while holding parent's lock. - child.cancel(false, err) - } - c.children = nil - c.mu.Unlock() - - if removeFromParent { - removeChild(c.Context, c) - } -} - -// WithDeadline returns a copy of the parent context with the deadline adjusted -// to be no later than d. If the parent's deadline is already earlier than d, -// WithDeadline(parent, d) is semantically equivalent to parent. The returned -// context's Done channel is closed when the deadline expires, when the returned -// cancel function is called, or when the parent context's Done channel is -// closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { - if cur, ok := parent.Deadline(); ok && cur.Before(deadline) { - // The current deadline is already sooner than the new one. - return WithCancel(parent) - } - c := &timerCtx{ - cancelCtx: newCancelCtx(parent), - deadline: deadline, - } - propagateCancel(parent, c) - d := deadline.Sub(time.Now()) - if d <= 0 { - c.cancel(true, DeadlineExceeded) // deadline has already passed - return c, func() { c.cancel(true, Canceled) } - } - c.mu.Lock() - defer c.mu.Unlock() - if c.err == nil { - c.timer = time.AfterFunc(d, func() { - c.cancel(true, DeadlineExceeded) - }) - } - return c, func() { c.cancel(true, Canceled) } -} - -// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to -// implement Done and Err. It implements cancel by stopping its timer then -// delegating to cancelCtx.cancel. -type timerCtx struct { - *cancelCtx - timer *time.Timer // Under cancelCtx.mu. - - deadline time.Time -} - -func (c *timerCtx) Deadline() (deadline time.Time, ok bool) { - return c.deadline, true -} - -func (c *timerCtx) String() string { - return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, c.deadline.Sub(time.Now())) -} - -func (c *timerCtx) cancel(removeFromParent bool, err error) { - c.cancelCtx.cancel(false, err) - if removeFromParent { - // Remove this timerCtx from its parent cancelCtx's children. - removeChild(c.cancelCtx.Context, c) - } - c.mu.Lock() - if c.timer != nil { - c.timer.Stop() - c.timer = nil - } - c.mu.Unlock() -} - -// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete: -// -// func slowOperationWithTimeout(ctx context.Context) (Result, error) { -// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) -// defer cancel() // releases resources if slowOperation completes before timeout elapses -// return slowOperation(ctx) -// } -func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { - return WithDeadline(parent, time.Now().Add(timeout)) -} - -// WithValue returns a copy of parent in which the value associated with key is -// val. -// -// Use context Values only for request-scoped data that transits processes and -// APIs, not for passing optional parameters to functions. -func WithValue(parent Context, key interface{}, val interface{}) Context { - return &valueCtx{parent, key, val} -} - -// A valueCtx carries a key-value pair. It implements Value for that key and -// delegates all other calls to the embedded Context. -type valueCtx struct { - Context - key, val interface{} -} - -func (c *valueCtx) String() string { - return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val) -} - -func (c *valueCtx) Value(key interface{}) interface{} { - if c.key == key { - return c.val - } - return c.Context.Value(key) -} diff --git a/vendor/golang.org/x/net/context/pre_go19.go b/vendor/golang.org/x/net/context/pre_go19.go deleted file mode 100644 index b105f80be..000000000 --- a/vendor/golang.org/x/net/context/pre_go19.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.9 - -package context - -import "time" - -// A Context carries a deadline, a cancelation signal, and other values across -// API boundaries. -// -// Context's methods may be called by multiple goroutines simultaneously. -type Context interface { - // Deadline returns the time when work done on behalf of this context - // should be canceled. Deadline returns ok==false when no deadline is - // set. Successive calls to Deadline return the same results. - Deadline() (deadline time.Time, ok bool) - - // Done returns a channel that's closed when work done on behalf of this - // context should be canceled. Done may return nil if this context can - // never be canceled. Successive calls to Done return the same value. - // - // WithCancel arranges for Done to be closed when cancel is called; - // WithDeadline arranges for Done to be closed when the deadline - // expires; WithTimeout arranges for Done to be closed when the timeout - // elapses. - // - // Done is provided for use in select statements: - // - // // Stream generates values with DoSomething and sends them to out - // // until DoSomething returns an error or ctx.Done is closed. - // func Stream(ctx context.Context, out chan<- Value) error { - // for { - // v, err := DoSomething(ctx) - // if err != nil { - // return err - // } - // select { - // case <-ctx.Done(): - // return ctx.Err() - // case out <- v: - // } - // } - // } - // - // See http://blog.golang.org/pipelines for more examples of how to use - // a Done channel for cancelation. - Done() <-chan struct{} - - // Err returns a non-nil error value after Done is closed. Err returns - // Canceled if the context was canceled or DeadlineExceeded if the - // context's deadline passed. No other values for Err are defined. - // After Done is closed, successive calls to Err return the same value. - Err() error - - // Value returns the value associated with this context for key, or nil - // if no value is associated with key. Successive calls to Value with - // the same key returns the same result. - // - // Use context values only for request-scoped data that transits - // processes and API boundaries, not for passing optional parameters to - // functions. - // - // A key identifies a specific value in a Context. Functions that wish - // to store values in Context typically allocate a key in a global - // variable then use that key as the argument to context.WithValue and - // Context.Value. A key can be any type that supports equality; - // packages should define keys as an unexported type to avoid - // collisions. - // - // Packages that define a Context key should provide type-safe accessors - // for the values stores using that key: - // - // // Package user defines a User type that's stored in Contexts. - // package user - // - // import "golang.org/x/net/context" - // - // // User is the type of value stored in the Contexts. - // type User struct {...} - // - // // key is an unexported type for keys defined in this package. - // // This prevents collisions with keys defined in other packages. - // type key int - // - // // userKey is the key for user.User values in Contexts. It is - // // unexported; clients use user.NewContext and user.FromContext - // // instead of using this key directly. - // var userKey key = 0 - // - // // NewContext returns a new Context that carries value u. - // func NewContext(ctx context.Context, u *User) context.Context { - // return context.WithValue(ctx, userKey, u) - // } - // - // // FromContext returns the User value stored in ctx, if any. - // func FromContext(ctx context.Context) (*User, bool) { - // u, ok := ctx.Value(userKey).(*User) - // return u, ok - // } - Value(key interface{}) interface{} -} - -// A CancelFunc tells an operation to abandon its work. -// A CancelFunc does not wait for the work to stop. -// After the first call, subsequent calls to a CancelFunc do nothing. -type CancelFunc func() diff --git a/vendor/golang.org/x/oauth2/.travis.yml b/vendor/golang.org/x/oauth2/.travis.yml deleted file mode 100644 index fa139db22..000000000 --- a/vendor/golang.org/x/oauth2/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go - -go: - - tip - -install: - - export GOPATH="$HOME/gopath" - - mkdir -p "$GOPATH/src/golang.org/x" - - mv "$TRAVIS_BUILD_DIR" "$GOPATH/src/golang.org/x/oauth2" - - go get -v -t -d golang.org/x/oauth2/... - -script: - - go test -v golang.org/x/oauth2/... diff --git a/vendor/golang.org/x/oauth2/AUTHORS b/vendor/golang.org/x/oauth2/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/oauth2/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/oauth2/CONTRIBUTING.md b/vendor/golang.org/x/oauth2/CONTRIBUTING.md deleted file mode 100644 index dfbed62cf..000000000 --- a/vendor/golang.org/x/oauth2/CONTRIBUTING.md +++ /dev/null @@ -1,26 +0,0 @@ -# Contributing to Go - -Go is an open source project. - -It is the work of hundreds of contributors. We appreciate your help! - -## Filing issues - -When [filing an issue](https://github.com/golang/oauth2/issues), make sure to answer these five questions: - -1. What version of Go are you using (`go version`)? -2. What operating system and processor architecture are you using? -3. What did you do? -4. What did you expect to see? -5. What did you see instead? - -General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. -The gophers there will answer or ask you to file an issue if you've tripped over a bug. - -## Contributing code - -Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) -before sending patches. - -Unless otherwise noted, the Go source files are distributed under -the BSD-style license found in the LICENSE file. diff --git a/vendor/golang.org/x/oauth2/CONTRIBUTORS b/vendor/golang.org/x/oauth2/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/oauth2/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/oauth2/LICENSE b/vendor/golang.org/x/oauth2/LICENSE deleted file mode 100644 index 6a66aea5e..000000000 --- a/vendor/golang.org/x/oauth2/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/oauth2/README.md b/vendor/golang.org/x/oauth2/README.md deleted file mode 100644 index 0f443e693..000000000 --- a/vendor/golang.org/x/oauth2/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# OAuth2 for Go - -[![Build Status](https://travis-ci.org/golang/oauth2.svg?branch=master)](https://travis-ci.org/golang/oauth2) -[![GoDoc](https://godoc.org/golang.org/x/oauth2?status.svg)](https://godoc.org/golang.org/x/oauth2) - -oauth2 package contains a client implementation for OAuth 2.0 spec. - -## Installation - -~~~~ -go get golang.org/x/oauth2 -~~~~ - -Or you can manually git clone the repository to -`$(go env GOPATH)/src/golang.org/x/oauth2`. - -See godoc for further documentation and examples. - -* [godoc.org/golang.org/x/oauth2](http://godoc.org/golang.org/x/oauth2) -* [godoc.org/golang.org/x/oauth2/google](http://godoc.org/golang.org/x/oauth2/google) - -## Policy for new packages - -We no longer accept new provider-specific packages in this repo. For -defining provider endpoints and provider-specific OAuth2 behavior, we -encourage you to create packages elsewhere. We'll keep the existing -packages for compatibility. - -## Report Issues / Send Patches - -This repository uses Gerrit for code changes. To learn how to submit changes to -this repository, see https://golang.org/doc/contribute.html. - -The main issue tracker for the oauth2 repository is located at -https://github.com/golang/oauth2/issues. diff --git a/vendor/golang.org/x/oauth2/go.mod b/vendor/golang.org/x/oauth2/go.mod deleted file mode 100644 index b34578155..000000000 --- a/vendor/golang.org/x/oauth2/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module golang.org/x/oauth2 - -go 1.11 - -require ( - cloud.google.com/go v0.34.0 - golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e - golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect - google.golang.org/appengine v1.4.0 -) diff --git a/vendor/golang.org/x/oauth2/go.sum b/vendor/golang.org/x/oauth2/go.sum deleted file mode 100644 index 6f0079b0d..000000000 --- a/vendor/golang.org/x/oauth2/go.sum +++ /dev/null @@ -1,12 +0,0 @@ -cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/vendor/golang.org/x/oauth2/google/appengine.go b/vendor/golang.org/x/oauth2/google/appengine.go deleted file mode 100644 index feb1157b1..000000000 --- a/vendor/golang.org/x/oauth2/google/appengine.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package google - -import ( - "context" - "time" - - "golang.org/x/oauth2" -) - -// Set at init time by appengine_gen1.go. If nil, we're not on App Engine standard first generation (<= Go 1.9) or App Engine flexible. -var appengineTokenFunc func(c context.Context, scopes ...string) (token string, expiry time.Time, err error) - -// Set at init time by appengine_gen1.go. If nil, we're not on App Engine standard first generation (<= Go 1.9) or App Engine flexible. -var appengineAppIDFunc func(c context.Context) string - -// AppEngineTokenSource returns a token source that fetches tokens from either -// the current application's service account or from the metadata server, -// depending on the App Engine environment. See below for environment-specific -// details. If you are implementing a 3-legged OAuth 2.0 flow on App Engine that -// involves user accounts, see oauth2.Config instead. -// -// First generation App Engine runtimes (<= Go 1.9): -// AppEngineTokenSource returns a token source that fetches tokens issued to the -// current App Engine application's service account. The provided context must have -// come from appengine.NewContext. -// -// Second generation App Engine runtimes (>= Go 1.11) and App Engine flexible: -// AppEngineTokenSource is DEPRECATED on second generation runtimes and on the -// flexible environment. It delegates to ComputeTokenSource, and the provided -// context and scopes are not used. Please use DefaultTokenSource (or ComputeTokenSource, -// which DefaultTokenSource will use in this case) instead. -func AppEngineTokenSource(ctx context.Context, scope ...string) oauth2.TokenSource { - return appEngineTokenSource(ctx, scope...) -} diff --git a/vendor/golang.org/x/oauth2/google/appengine_gen1.go b/vendor/golang.org/x/oauth2/google/appengine_gen1.go deleted file mode 100644 index 83dacac32..000000000 --- a/vendor/golang.org/x/oauth2/google/appengine_gen1.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build appengine - -// This file applies to App Engine first generation runtimes (<= Go 1.9). - -package google - -import ( - "context" - "sort" - "strings" - "sync" - - "golang.org/x/oauth2" - "google.golang.org/appengine" -) - -func init() { - appengineTokenFunc = appengine.AccessToken - appengineAppIDFunc = appengine.AppID -} - -// See comment on AppEngineTokenSource in appengine.go. -func appEngineTokenSource(ctx context.Context, scope ...string) oauth2.TokenSource { - scopes := append([]string{}, scope...) - sort.Strings(scopes) - return &gaeTokenSource{ - ctx: ctx, - scopes: scopes, - key: strings.Join(scopes, " "), - } -} - -// aeTokens helps the fetched tokens to be reused until their expiration. -var ( - aeTokensMu sync.Mutex - aeTokens = make(map[string]*tokenLock) // key is space-separated scopes -) - -type tokenLock struct { - mu sync.Mutex // guards t; held while fetching or updating t - t *oauth2.Token -} - -type gaeTokenSource struct { - ctx context.Context - scopes []string - key string // to aeTokens map; space-separated scopes -} - -func (ts *gaeTokenSource) Token() (*oauth2.Token, error) { - aeTokensMu.Lock() - tok, ok := aeTokens[ts.key] - if !ok { - tok = &tokenLock{} - aeTokens[ts.key] = tok - } - aeTokensMu.Unlock() - - tok.mu.Lock() - defer tok.mu.Unlock() - if tok.t.Valid() { - return tok.t, nil - } - access, exp, err := appengineTokenFunc(ts.ctx, ts.scopes...) - if err != nil { - return nil, err - } - tok.t = &oauth2.Token{ - AccessToken: access, - Expiry: exp, - } - return tok.t, nil -} diff --git a/vendor/golang.org/x/oauth2/google/appengine_gen2_flex.go b/vendor/golang.org/x/oauth2/google/appengine_gen2_flex.go deleted file mode 100644 index 04c2c2216..000000000 --- a/vendor/golang.org/x/oauth2/google/appengine_gen2_flex.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !appengine - -// This file applies to App Engine second generation runtimes (>= Go 1.11) and App Engine flexible. - -package google - -import ( - "context" - "log" - "sync" - - "golang.org/x/oauth2" -) - -var logOnce sync.Once // only spam about deprecation once - -// See comment on AppEngineTokenSource in appengine.go. -func appEngineTokenSource(ctx context.Context, scope ...string) oauth2.TokenSource { - logOnce.Do(func() { - log.Print("google: AppEngineTokenSource is deprecated on App Engine standard second generation runtimes (>= Go 1.11) and App Engine flexible. Please use DefaultTokenSource or ComputeTokenSource.") - }) - return ComputeTokenSource("") -} diff --git a/vendor/golang.org/x/oauth2/google/default.go b/vendor/golang.org/x/oauth2/google/default.go deleted file mode 100644 index ad2c09236..000000000 --- a/vendor/golang.org/x/oauth2/google/default.go +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package google - -import ( - "context" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "os" - "path/filepath" - "runtime" - - "cloud.google.com/go/compute/metadata" - "golang.org/x/oauth2" -) - -// Credentials holds Google credentials, including "Application Default Credentials". -// For more details, see: -// https://developers.google.com/accounts/docs/application-default-credentials -type Credentials struct { - ProjectID string // may be empty - TokenSource oauth2.TokenSource - - // JSON contains the raw bytes from a JSON credentials file. - // This field may be nil if authentication is provided by the - // environment and not with a credentials file, e.g. when code is - // running on Google Cloud Platform. - JSON []byte -} - -// DefaultCredentials is the old name of Credentials. -// -// Deprecated: use Credentials instead. -type DefaultCredentials = Credentials - -// DefaultClient returns an HTTP Client that uses the -// DefaultTokenSource to obtain authentication credentials. -func DefaultClient(ctx context.Context, scope ...string) (*http.Client, error) { - ts, err := DefaultTokenSource(ctx, scope...) - if err != nil { - return nil, err - } - return oauth2.NewClient(ctx, ts), nil -} - -// DefaultTokenSource returns the token source for -// "Application Default Credentials". -// It is a shortcut for FindDefaultCredentials(ctx, scope).TokenSource. -func DefaultTokenSource(ctx context.Context, scope ...string) (oauth2.TokenSource, error) { - creds, err := FindDefaultCredentials(ctx, scope...) - if err != nil { - return nil, err - } - return creds.TokenSource, nil -} - -// FindDefaultCredentials searches for "Application Default Credentials". -// -// It looks for credentials in the following places, -// preferring the first location found: -// -// 1. A JSON file whose path is specified by the -// GOOGLE_APPLICATION_CREDENTIALS environment variable. -// 2. A JSON file in a location known to the gcloud command-line tool. -// On Windows, this is %APPDATA%/gcloud/application_default_credentials.json. -// On other systems, $HOME/.config/gcloud/application_default_credentials.json. -// 3. On Google App Engine standard first generation runtimes (<= Go 1.9) it uses -// the appengine.AccessToken function. -// 4. On Google Compute Engine, Google App Engine standard second generation runtimes -// (>= Go 1.11), and Google App Engine flexible environment, it fetches -// credentials from the metadata server. -func FindDefaultCredentials(ctx context.Context, scopes ...string) (*Credentials, error) { - // First, try the environment variable. - const envVar = "GOOGLE_APPLICATION_CREDENTIALS" - if filename := os.Getenv(envVar); filename != "" { - creds, err := readCredentialsFile(ctx, filename, scopes) - if err != nil { - return nil, fmt.Errorf("google: error getting credentials using %v environment variable: %v", envVar, err) - } - return creds, nil - } - - // Second, try a well-known file. - filename := wellKnownFile() - if creds, err := readCredentialsFile(ctx, filename, scopes); err == nil { - return creds, nil - } else if !os.IsNotExist(err) { - return nil, fmt.Errorf("google: error getting credentials using well-known file (%v): %v", filename, err) - } - - // Third, if we're on a Google App Engine standard first generation runtime (<= Go 1.9) - // use those credentials. App Engine standard second generation runtimes (>= Go 1.11) - // and App Engine flexible use ComputeTokenSource and the metadata server. - if appengineTokenFunc != nil { - return &DefaultCredentials{ - ProjectID: appengineAppIDFunc(ctx), - TokenSource: AppEngineTokenSource(ctx, scopes...), - }, nil - } - - // Fourth, if we're on Google Compute Engine, an App Engine standard second generation runtime, - // or App Engine flexible, use the metadata server. - if metadata.OnGCE() { - id, _ := metadata.ProjectID() - return &DefaultCredentials{ - ProjectID: id, - TokenSource: ComputeTokenSource("", scopes...), - }, nil - } - - // None are found; return helpful error. - const url = "https://developers.google.com/accounts/docs/application-default-credentials" - return nil, fmt.Errorf("google: could not find default credentials. See %v for more information.", url) -} - -// CredentialsFromJSON obtains Google credentials from a JSON value. The JSON can -// represent either a Google Developers Console client_credentials.json file (as in -// ConfigFromJSON) or a Google Developers service account key file (as in -// JWTConfigFromJSON). -func CredentialsFromJSON(ctx context.Context, jsonData []byte, scopes ...string) (*Credentials, error) { - var f credentialsFile - if err := json.Unmarshal(jsonData, &f); err != nil { - return nil, err - } - ts, err := f.tokenSource(ctx, append([]string(nil), scopes...)) - if err != nil { - return nil, err - } - return &DefaultCredentials{ - ProjectID: f.ProjectID, - TokenSource: ts, - JSON: jsonData, - }, nil -} - -func wellKnownFile() string { - const f = "application_default_credentials.json" - if runtime.GOOS == "windows" { - return filepath.Join(os.Getenv("APPDATA"), "gcloud", f) - } - return filepath.Join(guessUnixHomeDir(), ".config", "gcloud", f) -} - -func readCredentialsFile(ctx context.Context, filename string, scopes []string) (*DefaultCredentials, error) { - b, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return CredentialsFromJSON(ctx, b, scopes...) -} diff --git a/vendor/golang.org/x/oauth2/google/doc.go b/vendor/golang.org/x/oauth2/google/doc.go deleted file mode 100644 index 73be62903..000000000 --- a/vendor/golang.org/x/oauth2/google/doc.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package google provides support for making OAuth2 authorized and authenticated -// HTTP requests to Google APIs. It supports the Web server flow, client-side -// credentials, service accounts, Google Compute Engine service accounts, and Google -// App Engine service accounts. -// -// A brief overview of the package follows. For more information, please read -// https://developers.google.com/accounts/docs/OAuth2 -// and -// https://developers.google.com/accounts/docs/application-default-credentials. -// -// OAuth2 Configs -// -// Two functions in this package return golang.org/x/oauth2.Config values from Google credential -// data. Google supports two JSON formats for OAuth2 credentials: one is handled by ConfigFromJSON, -// the other by JWTConfigFromJSON. The returned Config can be used to obtain a TokenSource or -// create an http.Client. -// -// -// Credentials -// -// The Credentials type represents Google credentials, including Application Default -// Credentials. -// -// Use FindDefaultCredentials to obtain Application Default Credentials. -// FindDefaultCredentials looks in some well-known places for a credentials file, and -// will call AppEngineTokenSource or ComputeTokenSource as needed. -// -// DefaultClient and DefaultTokenSource are convenience methods. They first call FindDefaultCredentials, -// then use the credentials to construct an http.Client or an oauth2.TokenSource. -// -// Use CredentialsFromJSON to obtain credentials from either of the two JSON formats -// described in OAuth2 Configs, above. The TokenSource in the returned value is the -// same as the one obtained from the oauth2.Config returned from ConfigFromJSON or -// JWTConfigFromJSON, but the Credentials may contain additional information -// that is useful is some circumstances. -package google // import "golang.org/x/oauth2/google" diff --git a/vendor/golang.org/x/oauth2/google/google.go b/vendor/golang.org/x/oauth2/google/google.go deleted file mode 100644 index 81de32b36..000000000 --- a/vendor/golang.org/x/oauth2/google/google.go +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package google - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "net/url" - "strings" - "time" - - "cloud.google.com/go/compute/metadata" - "golang.org/x/oauth2" - "golang.org/x/oauth2/jwt" -) - -// Endpoint is Google's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://accounts.google.com/o/oauth2/auth", - TokenURL: "https://oauth2.googleapis.com/token", - AuthStyle: oauth2.AuthStyleInParams, -} - -// JWTTokenURL is Google's OAuth 2.0 token URL to use with the JWT flow. -const JWTTokenURL = "https://oauth2.googleapis.com/token" - -// ConfigFromJSON uses a Google Developers Console client_credentials.json -// file to construct a config. -// client_credentials.json can be downloaded from -// https://console.developers.google.com, under "Credentials". Download the Web -// application credentials in the JSON format and provide the contents of the -// file as jsonKey. -func ConfigFromJSON(jsonKey []byte, scope ...string) (*oauth2.Config, error) { - type cred struct { - ClientID string `json:"client_id"` - ClientSecret string `json:"client_secret"` - RedirectURIs []string `json:"redirect_uris"` - AuthURI string `json:"auth_uri"` - TokenURI string `json:"token_uri"` - } - var j struct { - Web *cred `json:"web"` - Installed *cred `json:"installed"` - } - if err := json.Unmarshal(jsonKey, &j); err != nil { - return nil, err - } - var c *cred - switch { - case j.Web != nil: - c = j.Web - case j.Installed != nil: - c = j.Installed - default: - return nil, fmt.Errorf("oauth2/google: no credentials found") - } - if len(c.RedirectURIs) < 1 { - return nil, errors.New("oauth2/google: missing redirect URL in the client_credentials.json") - } - return &oauth2.Config{ - ClientID: c.ClientID, - ClientSecret: c.ClientSecret, - RedirectURL: c.RedirectURIs[0], - Scopes: scope, - Endpoint: oauth2.Endpoint{ - AuthURL: c.AuthURI, - TokenURL: c.TokenURI, - }, - }, nil -} - -// JWTConfigFromJSON uses a Google Developers service account JSON key file to read -// the credentials that authorize and authenticate the requests. -// Create a service account on "Credentials" for your project at -// https://console.developers.google.com to download a JSON key file. -func JWTConfigFromJSON(jsonKey []byte, scope ...string) (*jwt.Config, error) { - var f credentialsFile - if err := json.Unmarshal(jsonKey, &f); err != nil { - return nil, err - } - if f.Type != serviceAccountKey { - return nil, fmt.Errorf("google: read JWT from JSON credentials: 'type' field is %q (expected %q)", f.Type, serviceAccountKey) - } - scope = append([]string(nil), scope...) // copy - return f.jwtConfig(scope), nil -} - -// JSON key file types. -const ( - serviceAccountKey = "service_account" - userCredentialsKey = "authorized_user" -) - -// credentialsFile is the unmarshalled representation of a credentials file. -type credentialsFile struct { - Type string `json:"type"` // serviceAccountKey or userCredentialsKey - - // Service Account fields - ClientEmail string `json:"client_email"` - PrivateKeyID string `json:"private_key_id"` - PrivateKey string `json:"private_key"` - TokenURL string `json:"token_uri"` - ProjectID string `json:"project_id"` - - // User Credential fields - // (These typically come from gcloud auth.) - ClientSecret string `json:"client_secret"` - ClientID string `json:"client_id"` - RefreshToken string `json:"refresh_token"` -} - -func (f *credentialsFile) jwtConfig(scopes []string) *jwt.Config { - cfg := &jwt.Config{ - Email: f.ClientEmail, - PrivateKey: []byte(f.PrivateKey), - PrivateKeyID: f.PrivateKeyID, - Scopes: scopes, - TokenURL: f.TokenURL, - } - if cfg.TokenURL == "" { - cfg.TokenURL = JWTTokenURL - } - return cfg -} - -func (f *credentialsFile) tokenSource(ctx context.Context, scopes []string) (oauth2.TokenSource, error) { - switch f.Type { - case serviceAccountKey: - cfg := f.jwtConfig(scopes) - return cfg.TokenSource(ctx), nil - case userCredentialsKey: - cfg := &oauth2.Config{ - ClientID: f.ClientID, - ClientSecret: f.ClientSecret, - Scopes: scopes, - Endpoint: Endpoint, - } - tok := &oauth2.Token{RefreshToken: f.RefreshToken} - return cfg.TokenSource(ctx, tok), nil - case "": - return nil, errors.New("missing 'type' field in credentials") - default: - return nil, fmt.Errorf("unknown credential type: %q", f.Type) - } -} - -// ComputeTokenSource returns a token source that fetches access tokens -// from Google Compute Engine (GCE)'s metadata server. It's only valid to use -// this token source if your program is running on a GCE instance. -// If no account is specified, "default" is used. -// If no scopes are specified, a set of default scopes are automatically granted. -// Further information about retrieving access tokens from the GCE metadata -// server can be found at https://cloud.google.com/compute/docs/authentication. -func ComputeTokenSource(account string, scope ...string) oauth2.TokenSource { - return oauth2.ReuseTokenSource(nil, computeSource{account: account, scopes: scope}) -} - -type computeSource struct { - account string - scopes []string -} - -func (cs computeSource) Token() (*oauth2.Token, error) { - if !metadata.OnGCE() { - return nil, errors.New("oauth2/google: can't get a token from the metadata service; not running on GCE") - } - acct := cs.account - if acct == "" { - acct = "default" - } - tokenURI := "instance/service-accounts/" + acct + "/token" - if len(cs.scopes) > 0 { - v := url.Values{} - v.Set("scopes", strings.Join(cs.scopes, ",")) - tokenURI = tokenURI + "?" + v.Encode() - } - tokenJSON, err := metadata.Get(tokenURI) - if err != nil { - return nil, err - } - var res struct { - AccessToken string `json:"access_token"` - ExpiresInSec int `json:"expires_in"` - TokenType string `json:"token_type"` - } - err = json.NewDecoder(strings.NewReader(tokenJSON)).Decode(&res) - if err != nil { - return nil, fmt.Errorf("oauth2/google: invalid token JSON from metadata: %v", err) - } - if res.ExpiresInSec == 0 || res.AccessToken == "" { - return nil, fmt.Errorf("oauth2/google: incomplete token received from metadata") - } - tok := &oauth2.Token{ - AccessToken: res.AccessToken, - TokenType: res.TokenType, - Expiry: time.Now().Add(time.Duration(res.ExpiresInSec) * time.Second), - } - // NOTE(cbro): add hidden metadata about where the token is from. - // This is needed for detection by client libraries to know that credentials come from the metadata server. - // This may be removed in a future version of this library. - return tok.WithExtra(map[string]interface{}{ - "oauth2.google.tokenSource": "compute-metadata", - "oauth2.google.serviceAccount": acct, - }), nil -} diff --git a/vendor/golang.org/x/oauth2/google/jwt.go b/vendor/golang.org/x/oauth2/google/jwt.go deleted file mode 100644 index b0fdb3a88..000000000 --- a/vendor/golang.org/x/oauth2/google/jwt.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package google - -import ( - "crypto/rsa" - "fmt" - "time" - - "golang.org/x/oauth2" - "golang.org/x/oauth2/internal" - "golang.org/x/oauth2/jws" -) - -// JWTAccessTokenSourceFromJSON uses a Google Developers service account JSON -// key file to read the credentials that authorize and authenticate the -// requests, and returns a TokenSource that does not use any OAuth2 flow but -// instead creates a JWT and sends that as the access token. -// The audience is typically a URL that specifies the scope of the credentials. -// -// Note that this is not a standard OAuth flow, but rather an -// optimization supported by a few Google services. -// Unless you know otherwise, you should use JWTConfigFromJSON instead. -func JWTAccessTokenSourceFromJSON(jsonKey []byte, audience string) (oauth2.TokenSource, error) { - cfg, err := JWTConfigFromJSON(jsonKey) - if err != nil { - return nil, fmt.Errorf("google: could not parse JSON key: %v", err) - } - pk, err := internal.ParseKey(cfg.PrivateKey) - if err != nil { - return nil, fmt.Errorf("google: could not parse key: %v", err) - } - ts := &jwtAccessTokenSource{ - email: cfg.Email, - audience: audience, - pk: pk, - pkID: cfg.PrivateKeyID, - } - tok, err := ts.Token() - if err != nil { - return nil, err - } - return oauth2.ReuseTokenSource(tok, ts), nil -} - -type jwtAccessTokenSource struct { - email, audience string - pk *rsa.PrivateKey - pkID string -} - -func (ts *jwtAccessTokenSource) Token() (*oauth2.Token, error) { - iat := time.Now() - exp := iat.Add(time.Hour) - cs := &jws.ClaimSet{ - Iss: ts.email, - Sub: ts.email, - Aud: ts.audience, - Iat: iat.Unix(), - Exp: exp.Unix(), - } - hdr := &jws.Header{ - Algorithm: "RS256", - Typ: "JWT", - KeyID: string(ts.pkID), - } - msg, err := jws.Encode(hdr, cs, ts.pk) - if err != nil { - return nil, fmt.Errorf("google: could not encode JWT: %v", err) - } - return &oauth2.Token{AccessToken: msg, TokenType: "Bearer", Expiry: exp}, nil -} diff --git a/vendor/golang.org/x/oauth2/google/sdk.go b/vendor/golang.org/x/oauth2/google/sdk.go deleted file mode 100644 index 456224bc7..000000000 --- a/vendor/golang.org/x/oauth2/google/sdk.go +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package google - -import ( - "bufio" - "context" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "os" - "os/user" - "path/filepath" - "runtime" - "strings" - "time" - - "golang.org/x/oauth2" -) - -type sdkCredentials struct { - Data []struct { - Credential struct { - ClientID string `json:"client_id"` - ClientSecret string `json:"client_secret"` - AccessToken string `json:"access_token"` - RefreshToken string `json:"refresh_token"` - TokenExpiry *time.Time `json:"token_expiry"` - } `json:"credential"` - Key struct { - Account string `json:"account"` - Scope string `json:"scope"` - } `json:"key"` - } -} - -// An SDKConfig provides access to tokens from an account already -// authorized via the Google Cloud SDK. -type SDKConfig struct { - conf oauth2.Config - initialToken *oauth2.Token -} - -// NewSDKConfig creates an SDKConfig for the given Google Cloud SDK -// account. If account is empty, the account currently active in -// Google Cloud SDK properties is used. -// Google Cloud SDK credentials must be created by running `gcloud auth` -// before using this function. -// The Google Cloud SDK is available at https://cloud.google.com/sdk/. -func NewSDKConfig(account string) (*SDKConfig, error) { - configPath, err := sdkConfigPath() - if err != nil { - return nil, fmt.Errorf("oauth2/google: error getting SDK config path: %v", err) - } - credentialsPath := filepath.Join(configPath, "credentials") - f, err := os.Open(credentialsPath) - if err != nil { - return nil, fmt.Errorf("oauth2/google: failed to load SDK credentials: %v", err) - } - defer f.Close() - - var c sdkCredentials - if err := json.NewDecoder(f).Decode(&c); err != nil { - return nil, fmt.Errorf("oauth2/google: failed to decode SDK credentials from %q: %v", credentialsPath, err) - } - if len(c.Data) == 0 { - return nil, fmt.Errorf("oauth2/google: no credentials found in %q, run `gcloud auth login` to create one", credentialsPath) - } - if account == "" { - propertiesPath := filepath.Join(configPath, "properties") - f, err := os.Open(propertiesPath) - if err != nil { - return nil, fmt.Errorf("oauth2/google: failed to load SDK properties: %v", err) - } - defer f.Close() - ini, err := parseINI(f) - if err != nil { - return nil, fmt.Errorf("oauth2/google: failed to parse SDK properties %q: %v", propertiesPath, err) - } - core, ok := ini["core"] - if !ok { - return nil, fmt.Errorf("oauth2/google: failed to find [core] section in %v", ini) - } - active, ok := core["account"] - if !ok { - return nil, fmt.Errorf("oauth2/google: failed to find %q attribute in %v", "account", core) - } - account = active - } - - for _, d := range c.Data { - if account == "" || d.Key.Account == account { - if d.Credential.AccessToken == "" && d.Credential.RefreshToken == "" { - return nil, fmt.Errorf("oauth2/google: no token available for account %q", account) - } - var expiry time.Time - if d.Credential.TokenExpiry != nil { - expiry = *d.Credential.TokenExpiry - } - return &SDKConfig{ - conf: oauth2.Config{ - ClientID: d.Credential.ClientID, - ClientSecret: d.Credential.ClientSecret, - Scopes: strings.Split(d.Key.Scope, " "), - Endpoint: Endpoint, - RedirectURL: "oob", - }, - initialToken: &oauth2.Token{ - AccessToken: d.Credential.AccessToken, - RefreshToken: d.Credential.RefreshToken, - Expiry: expiry, - }, - }, nil - } - } - return nil, fmt.Errorf("oauth2/google: no such credentials for account %q", account) -} - -// Client returns an HTTP client using Google Cloud SDK credentials to -// authorize requests. The token will auto-refresh as necessary. The -// underlying http.RoundTripper will be obtained using the provided -// context. The returned client and its Transport should not be -// modified. -func (c *SDKConfig) Client(ctx context.Context) *http.Client { - return &http.Client{ - Transport: &oauth2.Transport{ - Source: c.TokenSource(ctx), - }, - } -} - -// TokenSource returns an oauth2.TokenSource that retrieve tokens from -// Google Cloud SDK credentials using the provided context. -// It will returns the current access token stored in the credentials, -// and refresh it when it expires, but it won't update the credentials -// with the new access token. -func (c *SDKConfig) TokenSource(ctx context.Context) oauth2.TokenSource { - return c.conf.TokenSource(ctx, c.initialToken) -} - -// Scopes are the OAuth 2.0 scopes the current account is authorized for. -func (c *SDKConfig) Scopes() []string { - return c.conf.Scopes -} - -func parseINI(ini io.Reader) (map[string]map[string]string, error) { - result := map[string]map[string]string{ - "": {}, // root section - } - scanner := bufio.NewScanner(ini) - currentSection := "" - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - if strings.HasPrefix(line, ";") { - // comment. - continue - } - if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") { - currentSection = strings.TrimSpace(line[1 : len(line)-1]) - result[currentSection] = map[string]string{} - continue - } - parts := strings.SplitN(line, "=", 2) - if len(parts) == 2 && parts[0] != "" { - result[currentSection][strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1]) - } - } - if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("error scanning ini: %v", err) - } - return result, nil -} - -// sdkConfigPath tries to guess where the gcloud config is located. -// It can be overridden during tests. -var sdkConfigPath = func() (string, error) { - if runtime.GOOS == "windows" { - return filepath.Join(os.Getenv("APPDATA"), "gcloud"), nil - } - homeDir := guessUnixHomeDir() - if homeDir == "" { - return "", errors.New("unable to get current user home directory: os/user lookup failed; $HOME is empty") - } - return filepath.Join(homeDir, ".config", "gcloud"), nil -} - -func guessUnixHomeDir() string { - // Prefer $HOME over user.Current due to glibc bug: golang.org/issue/13470 - if v := os.Getenv("HOME"); v != "" { - return v - } - // Else, fall back to user.Current: - if u, err := user.Current(); err == nil { - return u.HomeDir - } - return "" -} diff --git a/vendor/golang.org/x/oauth2/internal/client_appengine.go b/vendor/golang.org/x/oauth2/internal/client_appengine.go deleted file mode 100644 index 743487188..000000000 --- a/vendor/golang.org/x/oauth2/internal/client_appengine.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build appengine - -package internal - -import "google.golang.org/appengine/urlfetch" - -func init() { - appengineClientHook = urlfetch.Client -} diff --git a/vendor/golang.org/x/oauth2/internal/doc.go b/vendor/golang.org/x/oauth2/internal/doc.go deleted file mode 100644 index 03265e888..000000000 --- a/vendor/golang.org/x/oauth2/internal/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package internal contains support packages for oauth2 package. -package internal diff --git a/vendor/golang.org/x/oauth2/internal/oauth2.go b/vendor/golang.org/x/oauth2/internal/oauth2.go deleted file mode 100644 index c0ab196cf..000000000 --- a/vendor/golang.org/x/oauth2/internal/oauth2.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package internal - -import ( - "crypto/rsa" - "crypto/x509" - "encoding/pem" - "errors" - "fmt" -) - -// ParseKey converts the binary contents of a private key file -// to an *rsa.PrivateKey. It detects whether the private key is in a -// PEM container or not. If so, it extracts the the private key -// from PEM container before conversion. It only supports PEM -// containers with no passphrase. -func ParseKey(key []byte) (*rsa.PrivateKey, error) { - block, _ := pem.Decode(key) - if block != nil { - key = block.Bytes - } - parsedKey, err := x509.ParsePKCS8PrivateKey(key) - if err != nil { - parsedKey, err = x509.ParsePKCS1PrivateKey(key) - if err != nil { - return nil, fmt.Errorf("private key should be a PEM or plain PKCS1 or PKCS8; parse error: %v", err) - } - } - parsed, ok := parsedKey.(*rsa.PrivateKey) - if !ok { - return nil, errors.New("private key is invalid") - } - return parsed, nil -} diff --git a/vendor/golang.org/x/oauth2/internal/token.go b/vendor/golang.org/x/oauth2/internal/token.go deleted file mode 100644 index 355c38696..000000000 --- a/vendor/golang.org/x/oauth2/internal/token.go +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package internal - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "math" - "mime" - "net/http" - "net/url" - "strconv" - "strings" - "sync" - "time" - - "golang.org/x/net/context/ctxhttp" -) - -// Token represents the credentials used to authorize -// the requests to access protected resources on the OAuth 2.0 -// provider's backend. -// -// This type is a mirror of oauth2.Token and exists to break -// an otherwise-circular dependency. Other internal packages -// should convert this Token into an oauth2.Token before use. -type Token struct { - // AccessToken is the token that authorizes and authenticates - // the requests. - AccessToken string - - // TokenType is the type of token. - // The Type method returns either this or "Bearer", the default. - TokenType string - - // RefreshToken is a token that's used by the application - // (as opposed to the user) to refresh the access token - // if it expires. - RefreshToken string - - // Expiry is the optional expiration time of the access token. - // - // If zero, TokenSource implementations will reuse the same - // token forever and RefreshToken or equivalent - // mechanisms for that TokenSource will not be used. - Expiry time.Time - - // Raw optionally contains extra metadata from the server - // when updating a token. - Raw interface{} -} - -// tokenJSON is the struct representing the HTTP response from OAuth2 -// providers returning a token in JSON form. -type tokenJSON struct { - AccessToken string `json:"access_token"` - TokenType string `json:"token_type"` - RefreshToken string `json:"refresh_token"` - ExpiresIn expirationTime `json:"expires_in"` // at least PayPal returns string, while most return number -} - -func (e *tokenJSON) expiry() (t time.Time) { - if v := e.ExpiresIn; v != 0 { - return time.Now().Add(time.Duration(v) * time.Second) - } - return -} - -type expirationTime int32 - -func (e *expirationTime) UnmarshalJSON(b []byte) error { - if len(b) == 0 || string(b) == "null" { - return nil - } - var n json.Number - err := json.Unmarshal(b, &n) - if err != nil { - return err - } - i, err := n.Int64() - if err != nil { - return err - } - if i > math.MaxInt32 { - i = math.MaxInt32 - } - *e = expirationTime(i) - return nil -} - -// RegisterBrokenAuthHeaderProvider previously did something. It is now a no-op. -// -// Deprecated: this function no longer does anything. Caller code that -// wants to avoid potential extra HTTP requests made during -// auto-probing of the provider's auth style should set -// Endpoint.AuthStyle. -func RegisterBrokenAuthHeaderProvider(tokenURL string) {} - -// AuthStyle is a copy of the golang.org/x/oauth2 package's AuthStyle type. -type AuthStyle int - -const ( - AuthStyleUnknown AuthStyle = 0 - AuthStyleInParams AuthStyle = 1 - AuthStyleInHeader AuthStyle = 2 -) - -// authStyleCache is the set of tokenURLs we've successfully used via -// RetrieveToken and which style auth we ended up using. -// It's called a cache, but it doesn't (yet?) shrink. It's expected that -// the set of OAuth2 servers a program contacts over time is fixed and -// small. -var authStyleCache struct { - sync.Mutex - m map[string]AuthStyle // keyed by tokenURL -} - -// ResetAuthCache resets the global authentication style cache used -// for AuthStyleUnknown token requests. -func ResetAuthCache() { - authStyleCache.Lock() - defer authStyleCache.Unlock() - authStyleCache.m = nil -} - -// lookupAuthStyle reports which auth style we last used with tokenURL -// when calling RetrieveToken and whether we have ever done so. -func lookupAuthStyle(tokenURL string) (style AuthStyle, ok bool) { - authStyleCache.Lock() - defer authStyleCache.Unlock() - style, ok = authStyleCache.m[tokenURL] - return -} - -// setAuthStyle adds an entry to authStyleCache, documented above. -func setAuthStyle(tokenURL string, v AuthStyle) { - authStyleCache.Lock() - defer authStyleCache.Unlock() - if authStyleCache.m == nil { - authStyleCache.m = make(map[string]AuthStyle) - } - authStyleCache.m[tokenURL] = v -} - -// newTokenRequest returns a new *http.Request to retrieve a new token -// from tokenURL using the provided clientID, clientSecret, and POST -// body parameters. -// -// inParams is whether the clientID & clientSecret should be encoded -// as the POST body. An 'inParams' value of true means to send it in -// the POST body (along with any values in v); false means to send it -// in the Authorization header. -func newTokenRequest(tokenURL, clientID, clientSecret string, v url.Values, authStyle AuthStyle) (*http.Request, error) { - if authStyle == AuthStyleInParams { - v = cloneURLValues(v) - if clientID != "" { - v.Set("client_id", clientID) - } - if clientSecret != "" { - v.Set("client_secret", clientSecret) - } - } - req, err := http.NewRequest("POST", tokenURL, strings.NewReader(v.Encode())) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - if authStyle == AuthStyleInHeader { - req.SetBasicAuth(url.QueryEscape(clientID), url.QueryEscape(clientSecret)) - } - return req, nil -} - -func cloneURLValues(v url.Values) url.Values { - v2 := make(url.Values, len(v)) - for k, vv := range v { - v2[k] = append([]string(nil), vv...) - } - return v2 -} - -func RetrieveToken(ctx context.Context, clientID, clientSecret, tokenURL string, v url.Values, authStyle AuthStyle) (*Token, error) { - needsAuthStyleProbe := authStyle == 0 - if needsAuthStyleProbe { - if style, ok := lookupAuthStyle(tokenURL); ok { - authStyle = style - needsAuthStyleProbe = false - } else { - authStyle = AuthStyleInHeader // the first way we'll try - } - } - req, err := newTokenRequest(tokenURL, clientID, clientSecret, v, authStyle) - if err != nil { - return nil, err - } - token, err := doTokenRoundTrip(ctx, req) - if err != nil && needsAuthStyleProbe { - // If we get an error, assume the server wants the - // clientID & clientSecret in a different form. - // See https://code.google.com/p/goauth2/issues/detail?id=31 for background. - // In summary: - // - Reddit only accepts client secret in the Authorization header - // - Dropbox accepts either it in URL param or Auth header, but not both. - // - Google only accepts URL param (not spec compliant?), not Auth header - // - Stripe only accepts client secret in Auth header with Bearer method, not Basic - // - // We used to maintain a big table in this code of all the sites and which way - // they went, but maintaining it didn't scale & got annoying. - // So just try both ways. - authStyle = AuthStyleInParams // the second way we'll try - req, _ = newTokenRequest(tokenURL, clientID, clientSecret, v, authStyle) - token, err = doTokenRoundTrip(ctx, req) - } - if needsAuthStyleProbe && err == nil { - setAuthStyle(tokenURL, authStyle) - } - // Don't overwrite `RefreshToken` with an empty value - // if this was a token refreshing request. - if token != nil && token.RefreshToken == "" { - token.RefreshToken = v.Get("refresh_token") - } - return token, err -} - -func doTokenRoundTrip(ctx context.Context, req *http.Request) (*Token, error) { - r, err := ctxhttp.Do(ctx, ContextClient(ctx), req) - if err != nil { - return nil, err - } - body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1<<20)) - r.Body.Close() - if err != nil { - return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) - } - if code := r.StatusCode; code < 200 || code > 299 { - return nil, &RetrieveError{ - Response: r, - Body: body, - } - } - - var token *Token - content, _, _ := mime.ParseMediaType(r.Header.Get("Content-Type")) - switch content { - case "application/x-www-form-urlencoded", "text/plain": - vals, err := url.ParseQuery(string(body)) - if err != nil { - return nil, err - } - token = &Token{ - AccessToken: vals.Get("access_token"), - TokenType: vals.Get("token_type"), - RefreshToken: vals.Get("refresh_token"), - Raw: vals, - } - e := vals.Get("expires_in") - expires, _ := strconv.Atoi(e) - if expires != 0 { - token.Expiry = time.Now().Add(time.Duration(expires) * time.Second) - } - default: - var tj tokenJSON - if err = json.Unmarshal(body, &tj); err != nil { - return nil, err - } - token = &Token{ - AccessToken: tj.AccessToken, - TokenType: tj.TokenType, - RefreshToken: tj.RefreshToken, - Expiry: tj.expiry(), - Raw: make(map[string]interface{}), - } - json.Unmarshal(body, &token.Raw) // no error checks for optional fields - } - if token.AccessToken == "" { - return nil, errors.New("oauth2: server response missing access_token") - } - return token, nil -} - -type RetrieveError struct { - Response *http.Response - Body []byte -} - -func (r *RetrieveError) Error() string { - return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body) -} diff --git a/vendor/golang.org/x/oauth2/internal/transport.go b/vendor/golang.org/x/oauth2/internal/transport.go deleted file mode 100644 index 572074a63..000000000 --- a/vendor/golang.org/x/oauth2/internal/transport.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package internal - -import ( - "context" - "net/http" -) - -// HTTPClient is the context key to use with golang.org/x/net/context's -// WithValue function to associate an *http.Client value with a context. -var HTTPClient ContextKey - -// ContextKey is just an empty struct. It exists so HTTPClient can be -// an immutable public variable with a unique type. It's immutable -// because nobody else can create a ContextKey, being unexported. -type ContextKey struct{} - -var appengineClientHook func(context.Context) *http.Client - -func ContextClient(ctx context.Context) *http.Client { - if ctx != nil { - if hc, ok := ctx.Value(HTTPClient).(*http.Client); ok { - return hc - } - } - if appengineClientHook != nil { - return appengineClientHook(ctx) - } - return http.DefaultClient -} diff --git a/vendor/golang.org/x/oauth2/jws/jws.go b/vendor/golang.org/x/oauth2/jws/jws.go deleted file mode 100644 index 683d2d271..000000000 --- a/vendor/golang.org/x/oauth2/jws/jws.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package jws provides a partial implementation -// of JSON Web Signature encoding and decoding. -// It exists to support the golang.org/x/oauth2 package. -// -// See RFC 7515. -// -// Deprecated: this package is not intended for public use and might be -// removed in the future. It exists for internal use only. -// Please switch to another JWS package or copy this package into your own -// source tree. -package jws // import "golang.org/x/oauth2/jws" - -import ( - "bytes" - "crypto" - "crypto/rand" - "crypto/rsa" - "crypto/sha256" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "strings" - "time" -) - -// ClaimSet contains information about the JWT signature including the -// permissions being requested (scopes), the target of the token, the issuer, -// the time the token was issued, and the lifetime of the token. -type ClaimSet struct { - Iss string `json:"iss"` // email address of the client_id of the application making the access token request - Scope string `json:"scope,omitempty"` // space-delimited list of the permissions the application requests - Aud string `json:"aud"` // descriptor of the intended target of the assertion (Optional). - Exp int64 `json:"exp"` // the expiration time of the assertion (seconds since Unix epoch) - Iat int64 `json:"iat"` // the time the assertion was issued (seconds since Unix epoch) - Typ string `json:"typ,omitempty"` // token type (Optional). - - // Email for which the application is requesting delegated access (Optional). - Sub string `json:"sub,omitempty"` - - // The old name of Sub. Client keeps setting Prn to be - // complaint with legacy OAuth 2.0 providers. (Optional) - Prn string `json:"prn,omitempty"` - - // See http://tools.ietf.org/html/draft-jones-json-web-token-10#section-4.3 - // This array is marshalled using custom code (see (c *ClaimSet) encode()). - PrivateClaims map[string]interface{} `json:"-"` -} - -func (c *ClaimSet) encode() (string, error) { - // Reverting time back for machines whose time is not perfectly in sync. - // If client machine's time is in the future according - // to Google servers, an access token will not be issued. - now := time.Now().Add(-10 * time.Second) - if c.Iat == 0 { - c.Iat = now.Unix() - } - if c.Exp == 0 { - c.Exp = now.Add(time.Hour).Unix() - } - if c.Exp < c.Iat { - return "", fmt.Errorf("jws: invalid Exp = %v; must be later than Iat = %v", c.Exp, c.Iat) - } - - b, err := json.Marshal(c) - if err != nil { - return "", err - } - - if len(c.PrivateClaims) == 0 { - return base64.RawURLEncoding.EncodeToString(b), nil - } - - // Marshal private claim set and then append it to b. - prv, err := json.Marshal(c.PrivateClaims) - if err != nil { - return "", fmt.Errorf("jws: invalid map of private claims %v", c.PrivateClaims) - } - - // Concatenate public and private claim JSON objects. - if !bytes.HasSuffix(b, []byte{'}'}) { - return "", fmt.Errorf("jws: invalid JSON %s", b) - } - if !bytes.HasPrefix(prv, []byte{'{'}) { - return "", fmt.Errorf("jws: invalid JSON %s", prv) - } - b[len(b)-1] = ',' // Replace closing curly brace with a comma. - b = append(b, prv[1:]...) // Append private claims. - return base64.RawURLEncoding.EncodeToString(b), nil -} - -// Header represents the header for the signed JWS payloads. -type Header struct { - // The algorithm used for signature. - Algorithm string `json:"alg"` - - // Represents the token type. - Typ string `json:"typ"` - - // The optional hint of which key is being used. - KeyID string `json:"kid,omitempty"` -} - -func (h *Header) encode() (string, error) { - b, err := json.Marshal(h) - if err != nil { - return "", err - } - return base64.RawURLEncoding.EncodeToString(b), nil -} - -// Decode decodes a claim set from a JWS payload. -func Decode(payload string) (*ClaimSet, error) { - // decode returned id token to get expiry - s := strings.Split(payload, ".") - if len(s) < 2 { - // TODO(jbd): Provide more context about the error. - return nil, errors.New("jws: invalid token received") - } - decoded, err := base64.RawURLEncoding.DecodeString(s[1]) - if err != nil { - return nil, err - } - c := &ClaimSet{} - err = json.NewDecoder(bytes.NewBuffer(decoded)).Decode(c) - return c, err -} - -// Signer returns a signature for the given data. -type Signer func(data []byte) (sig []byte, err error) - -// EncodeWithSigner encodes a header and claim set with the provided signer. -func EncodeWithSigner(header *Header, c *ClaimSet, sg Signer) (string, error) { - head, err := header.encode() - if err != nil { - return "", err - } - cs, err := c.encode() - if err != nil { - return "", err - } - ss := fmt.Sprintf("%s.%s", head, cs) - sig, err := sg([]byte(ss)) - if err != nil { - return "", err - } - return fmt.Sprintf("%s.%s", ss, base64.RawURLEncoding.EncodeToString(sig)), nil -} - -// Encode encodes a signed JWS with provided header and claim set. -// This invokes EncodeWithSigner using crypto/rsa.SignPKCS1v15 with the given RSA private key. -func Encode(header *Header, c *ClaimSet, key *rsa.PrivateKey) (string, error) { - sg := func(data []byte) (sig []byte, err error) { - h := sha256.New() - h.Write(data) - return rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, h.Sum(nil)) - } - return EncodeWithSigner(header, c, sg) -} - -// Verify tests whether the provided JWT token's signature was produced by the private key -// associated with the supplied public key. -func Verify(token string, key *rsa.PublicKey) error { - parts := strings.Split(token, ".") - if len(parts) != 3 { - return errors.New("jws: invalid token received, token must have 3 parts") - } - - signedContent := parts[0] + "." + parts[1] - signatureString, err := base64.RawURLEncoding.DecodeString(parts[2]) - if err != nil { - return err - } - - h := sha256.New() - h.Write([]byte(signedContent)) - return rsa.VerifyPKCS1v15(key, crypto.SHA256, h.Sum(nil), []byte(signatureString)) -} diff --git a/vendor/golang.org/x/oauth2/jwt/jwt.go b/vendor/golang.org/x/oauth2/jwt/jwt.go deleted file mode 100644 index b2bf18298..000000000 --- a/vendor/golang.org/x/oauth2/jwt/jwt.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package jwt implements the OAuth 2.0 JSON Web Token flow, commonly -// known as "two-legged OAuth 2.0". -// -// See: https://tools.ietf.org/html/draft-ietf-oauth-jwt-bearer-12 -package jwt - -import ( - "context" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "strings" - "time" - - "golang.org/x/oauth2" - "golang.org/x/oauth2/internal" - "golang.org/x/oauth2/jws" -) - -var ( - defaultGrantType = "urn:ietf:params:oauth:grant-type:jwt-bearer" - defaultHeader = &jws.Header{Algorithm: "RS256", Typ: "JWT"} -) - -// Config is the configuration for using JWT to fetch tokens, -// commonly known as "two-legged OAuth 2.0". -type Config struct { - // Email is the OAuth client identifier used when communicating with - // the configured OAuth provider. - Email string - - // PrivateKey contains the contents of an RSA private key or the - // contents of a PEM file that contains a private key. The provided - // private key is used to sign JWT payloads. - // PEM containers with a passphrase are not supported. - // Use the following command to convert a PKCS 12 file into a PEM. - // - // $ openssl pkcs12 -in key.p12 -out key.pem -nodes - // - PrivateKey []byte - - // PrivateKeyID contains an optional hint indicating which key is being - // used. - PrivateKeyID string - - // Subject is the optional user to impersonate. - Subject string - - // Scopes optionally specifies a list of requested permission scopes. - Scopes []string - - // TokenURL is the endpoint required to complete the 2-legged JWT flow. - TokenURL string - - // Expires optionally specifies how long the token is valid for. - Expires time.Duration - - // Audience optionally specifies the intended audience of the - // request. If empty, the value of TokenURL is used as the - // intended audience. - Audience string - - // PrivateClaims optionally specifies custom private claims in the JWT. - // See http://tools.ietf.org/html/draft-jones-json-web-token-10#section-4.3 - PrivateClaims map[string]interface{} - - // UseIDToken optionally specifies whether ID token should be used instead - // of access token when the server returns both. - UseIDToken bool -} - -// TokenSource returns a JWT TokenSource using the configuration -// in c and the HTTP client from the provided context. -func (c *Config) TokenSource(ctx context.Context) oauth2.TokenSource { - return oauth2.ReuseTokenSource(nil, jwtSource{ctx, c}) -} - -// Client returns an HTTP client wrapping the context's -// HTTP transport and adding Authorization headers with tokens -// obtained from c. -// -// The returned client and its Transport should not be modified. -func (c *Config) Client(ctx context.Context) *http.Client { - return oauth2.NewClient(ctx, c.TokenSource(ctx)) -} - -// jwtSource is a source that always does a signed JWT request for a token. -// It should typically be wrapped with a reuseTokenSource. -type jwtSource struct { - ctx context.Context - conf *Config -} - -func (js jwtSource) Token() (*oauth2.Token, error) { - pk, err := internal.ParseKey(js.conf.PrivateKey) - if err != nil { - return nil, err - } - hc := oauth2.NewClient(js.ctx, nil) - claimSet := &jws.ClaimSet{ - Iss: js.conf.Email, - Scope: strings.Join(js.conf.Scopes, " "), - Aud: js.conf.TokenURL, - PrivateClaims: js.conf.PrivateClaims, - } - if subject := js.conf.Subject; subject != "" { - claimSet.Sub = subject - // prn is the old name of sub. Keep setting it - // to be compatible with legacy OAuth 2.0 providers. - claimSet.Prn = subject - } - if t := js.conf.Expires; t > 0 { - claimSet.Exp = time.Now().Add(t).Unix() - } - if aud := js.conf.Audience; aud != "" { - claimSet.Aud = aud - } - h := *defaultHeader - h.KeyID = js.conf.PrivateKeyID - payload, err := jws.Encode(&h, claimSet, pk) - if err != nil { - return nil, err - } - v := url.Values{} - v.Set("grant_type", defaultGrantType) - v.Set("assertion", payload) - resp, err := hc.PostForm(js.conf.TokenURL, v) - if err != nil { - return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20)) - if err != nil { - return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) - } - if c := resp.StatusCode; c < 200 || c > 299 { - return nil, &oauth2.RetrieveError{ - Response: resp, - Body: body, - } - } - // tokenRes is the JSON response body. - var tokenRes struct { - AccessToken string `json:"access_token"` - TokenType string `json:"token_type"` - IDToken string `json:"id_token"` - ExpiresIn int64 `json:"expires_in"` // relative seconds from now - } - if err := json.Unmarshal(body, &tokenRes); err != nil { - return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) - } - token := &oauth2.Token{ - AccessToken: tokenRes.AccessToken, - TokenType: tokenRes.TokenType, - } - raw := make(map[string]interface{}) - json.Unmarshal(body, &raw) // no error checks for optional fields - token = token.WithExtra(raw) - - if secs := tokenRes.ExpiresIn; secs > 0 { - token.Expiry = time.Now().Add(time.Duration(secs) * time.Second) - } - if v := tokenRes.IDToken; v != "" { - // decode returned id token to get expiry - claimSet, err := jws.Decode(v) - if err != nil { - return nil, fmt.Errorf("oauth2: error decoding JWT token: %v", err) - } - token.Expiry = time.Unix(claimSet.Exp, 0) - } - if js.conf.UseIDToken { - if tokenRes.IDToken == "" { - return nil, fmt.Errorf("oauth2: response doesn't have JWT token") - } - token.AccessToken = tokenRes.IDToken - } - return token, nil -} diff --git a/vendor/golang.org/x/oauth2/oauth2.go b/vendor/golang.org/x/oauth2/oauth2.go deleted file mode 100644 index 291df5c83..000000000 --- a/vendor/golang.org/x/oauth2/oauth2.go +++ /dev/null @@ -1,381 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package oauth2 provides support for making -// OAuth2 authorized and authenticated HTTP requests, -// as specified in RFC 6749. -// It can additionally grant authorization with Bearer JWT. -package oauth2 // import "golang.org/x/oauth2" - -import ( - "bytes" - "context" - "errors" - "net/http" - "net/url" - "strings" - "sync" - - "golang.org/x/oauth2/internal" -) - -// NoContext is the default context you should supply if not using -// your own context.Context (see https://golang.org/x/net/context). -// -// Deprecated: Use context.Background() or context.TODO() instead. -var NoContext = context.TODO() - -// RegisterBrokenAuthHeaderProvider previously did something. It is now a no-op. -// -// Deprecated: this function no longer does anything. Caller code that -// wants to avoid potential extra HTTP requests made during -// auto-probing of the provider's auth style should set -// Endpoint.AuthStyle. -func RegisterBrokenAuthHeaderProvider(tokenURL string) {} - -// Config describes a typical 3-legged OAuth2 flow, with both the -// client application information and the server's endpoint URLs. -// For the client credentials 2-legged OAuth2 flow, see the clientcredentials -// package (https://golang.org/x/oauth2/clientcredentials). -type Config struct { - // ClientID is the application's ID. - ClientID string - - // ClientSecret is the application's secret. - ClientSecret string - - // Endpoint contains the resource server's token endpoint - // URLs. These are constants specific to each server and are - // often available via site-specific packages, such as - // google.Endpoint or github.Endpoint. - Endpoint Endpoint - - // RedirectURL is the URL to redirect users going through - // the OAuth flow, after the resource owner's URLs. - RedirectURL string - - // Scope specifies optional requested permissions. - Scopes []string -} - -// A TokenSource is anything that can return a token. -type TokenSource interface { - // Token returns a token or an error. - // Token must be safe for concurrent use by multiple goroutines. - // The returned Token must not be modified. - Token() (*Token, error) -} - -// Endpoint represents an OAuth 2.0 provider's authorization and token -// endpoint URLs. -type Endpoint struct { - AuthURL string - TokenURL string - - // AuthStyle optionally specifies how the endpoint wants the - // client ID & client secret sent. The zero value means to - // auto-detect. - AuthStyle AuthStyle -} - -// AuthStyle represents how requests for tokens are authenticated -// to the server. -type AuthStyle int - -const ( - // AuthStyleAutoDetect means to auto-detect which authentication - // style the provider wants by trying both ways and caching - // the successful way for the future. - AuthStyleAutoDetect AuthStyle = 0 - - // AuthStyleInParams sends the "client_id" and "client_secret" - // in the POST body as application/x-www-form-urlencoded parameters. - AuthStyleInParams AuthStyle = 1 - - // AuthStyleInHeader sends the client_id and client_password - // using HTTP Basic Authorization. This is an optional style - // described in the OAuth2 RFC 6749 section 2.3.1. - AuthStyleInHeader AuthStyle = 2 -) - -var ( - // AccessTypeOnline and AccessTypeOffline are options passed - // to the Options.AuthCodeURL method. They modify the - // "access_type" field that gets sent in the URL returned by - // AuthCodeURL. - // - // Online is the default if neither is specified. If your - // application needs to refresh access tokens when the user - // is not present at the browser, then use offline. This will - // result in your application obtaining a refresh token the - // first time your application exchanges an authorization - // code for a user. - AccessTypeOnline AuthCodeOption = SetAuthURLParam("access_type", "online") - AccessTypeOffline AuthCodeOption = SetAuthURLParam("access_type", "offline") - - // ApprovalForce forces the users to view the consent dialog - // and confirm the permissions request at the URL returned - // from AuthCodeURL, even if they've already done so. - ApprovalForce AuthCodeOption = SetAuthURLParam("prompt", "consent") -) - -// An AuthCodeOption is passed to Config.AuthCodeURL. -type AuthCodeOption interface { - setValue(url.Values) -} - -type setParam struct{ k, v string } - -func (p setParam) setValue(m url.Values) { m.Set(p.k, p.v) } - -// SetAuthURLParam builds an AuthCodeOption which passes key/value parameters -// to a provider's authorization endpoint. -func SetAuthURLParam(key, value string) AuthCodeOption { - return setParam{key, value} -} - -// AuthCodeURL returns a URL to OAuth 2.0 provider's consent page -// that asks for permissions for the required scopes explicitly. -// -// State is a token to protect the user from CSRF attacks. You must -// always provide a non-empty string and validate that it matches the -// the state query parameter on your redirect callback. -// See http://tools.ietf.org/html/rfc6749#section-10.12 for more info. -// -// Opts may include AccessTypeOnline or AccessTypeOffline, as well -// as ApprovalForce. -// It can also be used to pass the PKCE challenge. -// See https://www.oauth.com/oauth2-servers/pkce/ for more info. -func (c *Config) AuthCodeURL(state string, opts ...AuthCodeOption) string { - var buf bytes.Buffer - buf.WriteString(c.Endpoint.AuthURL) - v := url.Values{ - "response_type": {"code"}, - "client_id": {c.ClientID}, - } - if c.RedirectURL != "" { - v.Set("redirect_uri", c.RedirectURL) - } - if len(c.Scopes) > 0 { - v.Set("scope", strings.Join(c.Scopes, " ")) - } - if state != "" { - // TODO(light): Docs say never to omit state; don't allow empty. - v.Set("state", state) - } - for _, opt := range opts { - opt.setValue(v) - } - if strings.Contains(c.Endpoint.AuthURL, "?") { - buf.WriteByte('&') - } else { - buf.WriteByte('?') - } - buf.WriteString(v.Encode()) - return buf.String() -} - -// PasswordCredentialsToken converts a resource owner username and password -// pair into a token. -// -// Per the RFC, this grant type should only be used "when there is a high -// degree of trust between the resource owner and the client (e.g., the client -// is part of the device operating system or a highly privileged application), -// and when other authorization grant types are not available." -// See https://tools.ietf.org/html/rfc6749#section-4.3 for more info. -// -// The provided context optionally controls which HTTP client is used. See the HTTPClient variable. -func (c *Config) PasswordCredentialsToken(ctx context.Context, username, password string) (*Token, error) { - v := url.Values{ - "grant_type": {"password"}, - "username": {username}, - "password": {password}, - } - if len(c.Scopes) > 0 { - v.Set("scope", strings.Join(c.Scopes, " ")) - } - return retrieveToken(ctx, c, v) -} - -// Exchange converts an authorization code into a token. -// -// It is used after a resource provider redirects the user back -// to the Redirect URI (the URL obtained from AuthCodeURL). -// -// The provided context optionally controls which HTTP client is used. See the HTTPClient variable. -// -// The code will be in the *http.Request.FormValue("code"). Before -// calling Exchange, be sure to validate FormValue("state"). -// -// Opts may include the PKCE verifier code if previously used in AuthCodeURL. -// See https://www.oauth.com/oauth2-servers/pkce/ for more info. -func (c *Config) Exchange(ctx context.Context, code string, opts ...AuthCodeOption) (*Token, error) { - v := url.Values{ - "grant_type": {"authorization_code"}, - "code": {code}, - } - if c.RedirectURL != "" { - v.Set("redirect_uri", c.RedirectURL) - } - for _, opt := range opts { - opt.setValue(v) - } - return retrieveToken(ctx, c, v) -} - -// Client returns an HTTP client using the provided token. -// The token will auto-refresh as necessary. The underlying -// HTTP transport will be obtained using the provided context. -// The returned client and its Transport should not be modified. -func (c *Config) Client(ctx context.Context, t *Token) *http.Client { - return NewClient(ctx, c.TokenSource(ctx, t)) -} - -// TokenSource returns a TokenSource that returns t until t expires, -// automatically refreshing it as necessary using the provided context. -// -// Most users will use Config.Client instead. -func (c *Config) TokenSource(ctx context.Context, t *Token) TokenSource { - tkr := &tokenRefresher{ - ctx: ctx, - conf: c, - } - if t != nil { - tkr.refreshToken = t.RefreshToken - } - return &reuseTokenSource{ - t: t, - new: tkr, - } -} - -// tokenRefresher is a TokenSource that makes "grant_type"=="refresh_token" -// HTTP requests to renew a token using a RefreshToken. -type tokenRefresher struct { - ctx context.Context // used to get HTTP requests - conf *Config - refreshToken string -} - -// WARNING: Token is not safe for concurrent access, as it -// updates the tokenRefresher's refreshToken field. -// Within this package, it is used by reuseTokenSource which -// synchronizes calls to this method with its own mutex. -func (tf *tokenRefresher) Token() (*Token, error) { - if tf.refreshToken == "" { - return nil, errors.New("oauth2: token expired and refresh token is not set") - } - - tk, err := retrieveToken(tf.ctx, tf.conf, url.Values{ - "grant_type": {"refresh_token"}, - "refresh_token": {tf.refreshToken}, - }) - - if err != nil { - return nil, err - } - if tf.refreshToken != tk.RefreshToken { - tf.refreshToken = tk.RefreshToken - } - return tk, err -} - -// reuseTokenSource is a TokenSource that holds a single token in memory -// and validates its expiry before each call to retrieve it with -// Token. If it's expired, it will be auto-refreshed using the -// new TokenSource. -type reuseTokenSource struct { - new TokenSource // called when t is expired. - - mu sync.Mutex // guards t - t *Token -} - -// Token returns the current token if it's still valid, else will -// refresh the current token (using r.Context for HTTP client -// information) and return the new one. -func (s *reuseTokenSource) Token() (*Token, error) { - s.mu.Lock() - defer s.mu.Unlock() - if s.t.Valid() { - return s.t, nil - } - t, err := s.new.Token() - if err != nil { - return nil, err - } - s.t = t - return t, nil -} - -// StaticTokenSource returns a TokenSource that always returns the same token. -// Because the provided token t is never refreshed, StaticTokenSource is only -// useful for tokens that never expire. -func StaticTokenSource(t *Token) TokenSource { - return staticTokenSource{t} -} - -// staticTokenSource is a TokenSource that always returns the same Token. -type staticTokenSource struct { - t *Token -} - -func (s staticTokenSource) Token() (*Token, error) { - return s.t, nil -} - -// HTTPClient is the context key to use with golang.org/x/net/context's -// WithValue function to associate an *http.Client value with a context. -var HTTPClient internal.ContextKey - -// NewClient creates an *http.Client from a Context and TokenSource. -// The returned client is not valid beyond the lifetime of the context. -// -// Note that if a custom *http.Client is provided via the Context it -// is used only for token acquisition and is not used to configure the -// *http.Client returned from NewClient. -// -// As a special case, if src is nil, a non-OAuth2 client is returned -// using the provided context. This exists to support related OAuth2 -// packages. -func NewClient(ctx context.Context, src TokenSource) *http.Client { - if src == nil { - return internal.ContextClient(ctx) - } - return &http.Client{ - Transport: &Transport{ - Base: internal.ContextClient(ctx).Transport, - Source: ReuseTokenSource(nil, src), - }, - } -} - -// ReuseTokenSource returns a TokenSource which repeatedly returns the -// same token as long as it's valid, starting with t. -// When its cached token is invalid, a new token is obtained from src. -// -// ReuseTokenSource is typically used to reuse tokens from a cache -// (such as a file on disk) between runs of a program, rather than -// obtaining new tokens unnecessarily. -// -// The initial token t may be nil, in which case the TokenSource is -// wrapped in a caching version if it isn't one already. This also -// means it's always safe to wrap ReuseTokenSource around any other -// TokenSource without adverse effects. -func ReuseTokenSource(t *Token, src TokenSource) TokenSource { - // Don't wrap a reuseTokenSource in itself. That would work, - // but cause an unnecessary number of mutex operations. - // Just build the equivalent one. - if rt, ok := src.(*reuseTokenSource); ok { - if t == nil { - // Just use it directly. - return rt - } - src = rt.new - } - return &reuseTokenSource{ - t: t, - new: src, - } -} diff --git a/vendor/golang.org/x/oauth2/token.go b/vendor/golang.org/x/oauth2/token.go deleted file mode 100644 index 822720341..000000000 --- a/vendor/golang.org/x/oauth2/token.go +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package oauth2 - -import ( - "context" - "fmt" - "net/http" - "net/url" - "strconv" - "strings" - "time" - - "golang.org/x/oauth2/internal" -) - -// expiryDelta determines how earlier a token should be considered -// expired than its actual expiration time. It is used to avoid late -// expirations due to client-server time mismatches. -const expiryDelta = 10 * time.Second - -// Token represents the credentials used to authorize -// the requests to access protected resources on the OAuth 2.0 -// provider's backend. -// -// Most users of this package should not access fields of Token -// directly. They're exported mostly for use by related packages -// implementing derivative OAuth2 flows. -type Token struct { - // AccessToken is the token that authorizes and authenticates - // the requests. - AccessToken string `json:"access_token"` - - // TokenType is the type of token. - // The Type method returns either this or "Bearer", the default. - TokenType string `json:"token_type,omitempty"` - - // RefreshToken is a token that's used by the application - // (as opposed to the user) to refresh the access token - // if it expires. - RefreshToken string `json:"refresh_token,omitempty"` - - // Expiry is the optional expiration time of the access token. - // - // If zero, TokenSource implementations will reuse the same - // token forever and RefreshToken or equivalent - // mechanisms for that TokenSource will not be used. - Expiry time.Time `json:"expiry,omitempty"` - - // raw optionally contains extra metadata from the server - // when updating a token. - raw interface{} -} - -// Type returns t.TokenType if non-empty, else "Bearer". -func (t *Token) Type() string { - if strings.EqualFold(t.TokenType, "bearer") { - return "Bearer" - } - if strings.EqualFold(t.TokenType, "mac") { - return "MAC" - } - if strings.EqualFold(t.TokenType, "basic") { - return "Basic" - } - if t.TokenType != "" { - return t.TokenType - } - return "Bearer" -} - -// SetAuthHeader sets the Authorization header to r using the access -// token in t. -// -// This method is unnecessary when using Transport or an HTTP Client -// returned by this package. -func (t *Token) SetAuthHeader(r *http.Request) { - r.Header.Set("Authorization", t.Type()+" "+t.AccessToken) -} - -// WithExtra returns a new Token that's a clone of t, but using the -// provided raw extra map. This is only intended for use by packages -// implementing derivative OAuth2 flows. -func (t *Token) WithExtra(extra interface{}) *Token { - t2 := new(Token) - *t2 = *t - t2.raw = extra - return t2 -} - -// Extra returns an extra field. -// Extra fields are key-value pairs returned by the server as a -// part of the token retrieval response. -func (t *Token) Extra(key string) interface{} { - if raw, ok := t.raw.(map[string]interface{}); ok { - return raw[key] - } - - vals, ok := t.raw.(url.Values) - if !ok { - return nil - } - - v := vals.Get(key) - switch s := strings.TrimSpace(v); strings.Count(s, ".") { - case 0: // Contains no "."; try to parse as int - if i, err := strconv.ParseInt(s, 10, 64); err == nil { - return i - } - case 1: // Contains a single "."; try to parse as float - if f, err := strconv.ParseFloat(s, 64); err == nil { - return f - } - } - - return v -} - -// timeNow is time.Now but pulled out as a variable for tests. -var timeNow = time.Now - -// expired reports whether the token is expired. -// t must be non-nil. -func (t *Token) expired() bool { - if t.Expiry.IsZero() { - return false - } - return t.Expiry.Round(0).Add(-expiryDelta).Before(timeNow()) -} - -// Valid reports whether t is non-nil, has an AccessToken, and is not expired. -func (t *Token) Valid() bool { - return t != nil && t.AccessToken != "" && !t.expired() -} - -// tokenFromInternal maps an *internal.Token struct into -// a *Token struct. -func tokenFromInternal(t *internal.Token) *Token { - if t == nil { - return nil - } - return &Token{ - AccessToken: t.AccessToken, - TokenType: t.TokenType, - RefreshToken: t.RefreshToken, - Expiry: t.Expiry, - raw: t.Raw, - } -} - -// retrieveToken takes a *Config and uses that to retrieve an *internal.Token. -// This token is then mapped from *internal.Token into an *oauth2.Token which is returned along -// with an error.. -func retrieveToken(ctx context.Context, c *Config, v url.Values) (*Token, error) { - tk, err := internal.RetrieveToken(ctx, c.ClientID, c.ClientSecret, c.Endpoint.TokenURL, v, internal.AuthStyle(c.Endpoint.AuthStyle)) - if err != nil { - if rErr, ok := err.(*internal.RetrieveError); ok { - return nil, (*RetrieveError)(rErr) - } - return nil, err - } - return tokenFromInternal(tk), nil -} - -// RetrieveError is the error returned when the token endpoint returns a -// non-2XX HTTP status code. -type RetrieveError struct { - Response *http.Response - // Body is the body that was consumed by reading Response.Body. - // It may be truncated. - Body []byte -} - -func (r *RetrieveError) Error() string { - return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body) -} diff --git a/vendor/golang.org/x/oauth2/transport.go b/vendor/golang.org/x/oauth2/transport.go deleted file mode 100644 index aa0d34f1e..000000000 --- a/vendor/golang.org/x/oauth2/transport.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package oauth2 - -import ( - "errors" - "io" - "net/http" - "sync" -) - -// Transport is an http.RoundTripper that makes OAuth 2.0 HTTP requests, -// wrapping a base RoundTripper and adding an Authorization header -// with a token from the supplied Sources. -// -// Transport is a low-level mechanism. Most code will use the -// higher-level Config.Client method instead. -type Transport struct { - // Source supplies the token to add to outgoing requests' - // Authorization headers. - Source TokenSource - - // Base is the base RoundTripper used to make HTTP requests. - // If nil, http.DefaultTransport is used. - Base http.RoundTripper - - mu sync.Mutex // guards modReq - modReq map[*http.Request]*http.Request // original -> modified -} - -// RoundTrip authorizes and authenticates the request with an -// access token from Transport's Source. -func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { - reqBodyClosed := false - if req.Body != nil { - defer func() { - if !reqBodyClosed { - req.Body.Close() - } - }() - } - - if t.Source == nil { - return nil, errors.New("oauth2: Transport's Source is nil") - } - token, err := t.Source.Token() - if err != nil { - return nil, err - } - - req2 := cloneRequest(req) // per RoundTripper contract - token.SetAuthHeader(req2) - t.setModReq(req, req2) - res, err := t.base().RoundTrip(req2) - - // req.Body is assumed to have been closed by the base RoundTripper. - reqBodyClosed = true - - if err != nil { - t.setModReq(req, nil) - return nil, err - } - res.Body = &onEOFReader{ - rc: res.Body, - fn: func() { t.setModReq(req, nil) }, - } - return res, nil -} - -// CancelRequest cancels an in-flight request by closing its connection. -func (t *Transport) CancelRequest(req *http.Request) { - type canceler interface { - CancelRequest(*http.Request) - } - if cr, ok := t.base().(canceler); ok { - t.mu.Lock() - modReq := t.modReq[req] - delete(t.modReq, req) - t.mu.Unlock() - cr.CancelRequest(modReq) - } -} - -func (t *Transport) base() http.RoundTripper { - if t.Base != nil { - return t.Base - } - return http.DefaultTransport -} - -func (t *Transport) setModReq(orig, mod *http.Request) { - t.mu.Lock() - defer t.mu.Unlock() - if t.modReq == nil { - t.modReq = make(map[*http.Request]*http.Request) - } - if mod == nil { - delete(t.modReq, orig) - } else { - t.modReq[orig] = mod - } -} - -// cloneRequest returns a clone of the provided *http.Request. -// The clone is a shallow copy of the struct and its Header map. -func cloneRequest(r *http.Request) *http.Request { - // shallow copy of the struct - r2 := new(http.Request) - *r2 = *r - // deep copy of the Header - r2.Header = make(http.Header, len(r.Header)) - for k, s := range r.Header { - r2.Header[k] = append([]string(nil), s...) - } - return r2 -} - -type onEOFReader struct { - rc io.ReadCloser - fn func() -} - -func (r *onEOFReader) Read(p []byte) (n int, err error) { - n, err = r.rc.Read(p) - if err == io.EOF { - r.runFunc() - } - return -} - -func (r *onEOFReader) Close() error { - err := r.rc.Close() - r.runFunc() - return err -} - -func (r *onEOFReader) runFunc() { - if fn := r.fn; fn != nil { - fn() - r.fn = nil - } -} diff --git a/vendor/golang.org/x/sync/AUTHORS b/vendor/golang.org/x/sync/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/sync/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/sync/CONTRIBUTORS b/vendor/golang.org/x/sync/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/sync/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/sync/LICENSE b/vendor/golang.org/x/sync/LICENSE deleted file mode 100644 index 6a66aea5e..000000000 --- a/vendor/golang.org/x/sync/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/sync/PATENTS b/vendor/golang.org/x/sync/PATENTS deleted file mode 100644 index 733099041..000000000 --- a/vendor/golang.org/x/sync/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google hereby grants to You a perpetual, worldwide, non-exclusive, -no-charge, royalty-free, irrevocable (except as stated in this section) -patent license to make, have made, use, offer to sell, sell, import, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/sync/semaphore/semaphore.go b/vendor/golang.org/x/sync/semaphore/semaphore.go deleted file mode 100644 index 7f096fef0..000000000 --- a/vendor/golang.org/x/sync/semaphore/semaphore.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package semaphore provides a weighted semaphore implementation. -package semaphore // import "golang.org/x/sync/semaphore" - -import ( - "container/list" - "context" - "sync" -) - -type waiter struct { - n int64 - ready chan<- struct{} // Closed when semaphore acquired. -} - -// NewWeighted creates a new weighted semaphore with the given -// maximum combined weight for concurrent access. -func NewWeighted(n int64) *Weighted { - w := &Weighted{size: n} - return w -} - -// Weighted provides a way to bound concurrent access to a resource. -// The callers can request access with a given weight. -type Weighted struct { - size int64 - cur int64 - mu sync.Mutex - waiters list.List -} - -// Acquire acquires the semaphore with a weight of n, blocking until resources -// are available or ctx is done. On success, returns nil. On failure, returns -// ctx.Err() and leaves the semaphore unchanged. -// -// If ctx is already done, Acquire may still succeed without blocking. -func (s *Weighted) Acquire(ctx context.Context, n int64) error { - s.mu.Lock() - if s.size-s.cur >= n && s.waiters.Len() == 0 { - s.cur += n - s.mu.Unlock() - return nil - } - - if n > s.size { - // Don't make other Acquire calls block on one that's doomed to fail. - s.mu.Unlock() - <-ctx.Done() - return ctx.Err() - } - - ready := make(chan struct{}) - w := waiter{n: n, ready: ready} - elem := s.waiters.PushBack(w) - s.mu.Unlock() - - select { - case <-ctx.Done(): - err := ctx.Err() - s.mu.Lock() - select { - case <-ready: - // Acquired the semaphore after we were canceled. Rather than trying to - // fix up the queue, just pretend we didn't notice the cancelation. - err = nil - default: - s.waiters.Remove(elem) - } - s.mu.Unlock() - return err - - case <-ready: - return nil - } -} - -// TryAcquire acquires the semaphore with a weight of n without blocking. -// On success, returns true. On failure, returns false and leaves the semaphore unchanged. -func (s *Weighted) TryAcquire(n int64) bool { - s.mu.Lock() - success := s.size-s.cur >= n && s.waiters.Len() == 0 - if success { - s.cur += n - } - s.mu.Unlock() - return success -} - -// Release releases the semaphore with a weight of n. -func (s *Weighted) Release(n int64) { - s.mu.Lock() - s.cur -= n - if s.cur < 0 { - s.mu.Unlock() - panic("semaphore: released more than held") - } - for { - next := s.waiters.Front() - if next == nil { - break // No more waiters blocked. - } - - w := next.Value.(waiter) - if s.size-s.cur < w.n { - // Not enough tokens for the next waiter. We could keep going (to try to - // find a waiter with a smaller request), but under load that could cause - // starvation for large requests; instead, we leave all remaining waiters - // blocked. - // - // Consider a semaphore used as a read-write lock, with N tokens, N - // readers, and one writer. Each reader can Acquire(1) to obtain a read - // lock. The writer can Acquire(N) to obtain a write lock, excluding all - // of the readers. If we allow the readers to jump ahead in the queue, - // the writer will starve — there is always one token available for every - // reader. - break - } - - s.cur += w.n - s.waiters.Remove(next) - close(w.ready) - } - s.mu.Unlock() -} diff --git a/vendor/google.golang.org/api/AUTHORS b/vendor/google.golang.org/api/AUTHORS deleted file mode 100644 index f73b72574..000000000 --- a/vendor/google.golang.org/api/AUTHORS +++ /dev/null @@ -1,10 +0,0 @@ -# This is the official list of authors for copyright purposes. -# This file is distinct from the CONTRIBUTORS files. -# See the latter for an explanation. - -# Names should be added to this file as -# Name or Organization -# The email address is not required for organizations. - -# Please keep the list sorted. -Google Inc. diff --git a/vendor/google.golang.org/api/CONTRIBUTORS b/vendor/google.golang.org/api/CONTRIBUTORS deleted file mode 100644 index fe55ebff0..000000000 --- a/vendor/google.golang.org/api/CONTRIBUTORS +++ /dev/null @@ -1,55 +0,0 @@ -# This is the official list of people who can contribute -# (and typically have contributed) code to the repository. -# The AUTHORS file lists the copyright holders; this file -# lists people. For example, Google employees are listed here -# but not in AUTHORS, because Google holds the copyright. -# -# The submission process automatically checks to make sure -# that people submitting code are listed in this file (by email address). -# -# Names should be added to this file only after verifying that -# the individual or the individual's organization has agreed to -# the appropriate Contributor License Agreement, found here: -# -# https://cla.developers.google.com/about/google-individual -# https://cla.developers.google.com/about/google-corporate -# -# The CLA can be filled out on the web: -# -# https://cla.developers.google.com/ -# -# When adding J Random Contributor's name to this file, -# either J's name or J's organization's name should be -# added to the AUTHORS file, depending on whether the -# individual or corporate CLA was used. - -# Names should be added to this file like so: -# Name -# -# An entry with two email addresses specifies that the -# first address should be used in the submit logs and -# that the second address should be recognized as the -# same person when interacting with Rietveld. - -# Please keep the list sorted. - -Alain Vongsouvanhalainv -Andrew Gerrand -Brad Fitzpatrick -Eric Koleda -Francesc Campoy -Garrick Evans -Glenn Lewis -Ivan Krasin -Jason Hall -Johan Euphrosine -Kostik Shtoyk -Kunpei Sakai -Matthew Whisenhunt -Michael McGreevy -Nick Craig-Wood -Robbie Trencheny -Ross Light -Sarah Adams -Scott Van Woudenberg -Takashi Matsuo diff --git a/vendor/google.golang.org/api/LICENSE b/vendor/google.golang.org/api/LICENSE deleted file mode 100644 index 263aa7a0c..000000000 --- a/vendor/google.golang.org/api/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2011 Google Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/google.golang.org/api/googleapi/transport/apikey.go b/vendor/google.golang.org/api/googleapi/transport/apikey.go deleted file mode 100644 index eca1ea250..000000000 --- a/vendor/google.golang.org/api/googleapi/transport/apikey.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2012 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package transport contains HTTP transports used to make -// authenticated API requests. -package transport - -import ( - "errors" - "net/http" -) - -// APIKey is an HTTP Transport which wraps an underlying transport and -// appends an API Key "key" parameter to the URL of outgoing requests. -type APIKey struct { - // Key is the API Key to set on requests. - Key string - - // Transport is the underlying HTTP transport. - // If nil, http.DefaultTransport is used. - Transport http.RoundTripper -} - -func (t *APIKey) RoundTrip(req *http.Request) (*http.Response, error) { - rt := t.Transport - if rt == nil { - rt = http.DefaultTransport - if rt == nil { - return nil, errors.New("googleapi/transport: no Transport specified or available") - } - } - newReq := *req - args := newReq.URL.Query() - args.Set("key", t.Key) - newReq.URL.RawQuery = args.Encode() - return rt.RoundTrip(&newReq) -} diff --git a/vendor/google.golang.org/api/internal/creds.go b/vendor/google.golang.org/api/internal/creds.go deleted file mode 100644 index 69b8659fd..000000000 --- a/vendor/google.golang.org/api/internal/creds.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2017 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package internal - -import ( - "context" - "encoding/json" - "fmt" - "io/ioutil" - - "golang.org/x/oauth2" - - "golang.org/x/oauth2/google" -) - -// Creds returns credential information obtained from DialSettings, or if none, then -// it returns default credential information. -func Creds(ctx context.Context, ds *DialSettings) (*google.Credentials, error) { - if ds.Credentials != nil { - return ds.Credentials, nil - } - if ds.CredentialsJSON != nil { - return credentialsFromJSON(ctx, ds.CredentialsJSON, ds.Endpoint, ds.Scopes, ds.Audiences) - } - if ds.CredentialsFile != "" { - data, err := ioutil.ReadFile(ds.CredentialsFile) - if err != nil { - return nil, fmt.Errorf("cannot read credentials file: %v", err) - } - return credentialsFromJSON(ctx, data, ds.Endpoint, ds.Scopes, ds.Audiences) - } - if ds.TokenSource != nil { - return &google.Credentials{TokenSource: ds.TokenSource}, nil - } - cred, err := google.FindDefaultCredentials(ctx, ds.Scopes...) - if err != nil { - return nil, err - } - if len(cred.JSON) > 0 { - return credentialsFromJSON(ctx, cred.JSON, ds.Endpoint, ds.Scopes, ds.Audiences) - } - // For GAE and GCE, the JSON is empty so return the default credentials directly. - return cred, nil -} - -// JSON key file type. -const ( - serviceAccountKey = "service_account" -) - -// credentialsFromJSON returns a google.Credentials based on the input. -// -// - If the JSON is a service account and no scopes provided, returns self-signed JWT auth flow -// - Otherwise, returns OAuth 2.0 flow. -func credentialsFromJSON(ctx context.Context, data []byte, endpoint string, scopes []string, audiences []string) (*google.Credentials, error) { - cred, err := google.CredentialsFromJSON(ctx, data, scopes...) - if err != nil { - return nil, err - } - if len(data) > 0 && len(scopes) == 0 { - var f struct { - Type string `json:"type"` - // The rest JSON fields are omitted because they are not used. - } - if err := json.Unmarshal(cred.JSON, &f); err != nil { - return nil, err - } - if f.Type == serviceAccountKey { - ts, err := selfSignedJWTTokenSource(data, endpoint, audiences) - if err != nil { - return nil, err - } - cred.TokenSource = ts - } - } - return cred, err -} - -func selfSignedJWTTokenSource(data []byte, endpoint string, audiences []string) (oauth2.TokenSource, error) { - // Use the API endpoint as the default audience - audience := endpoint - if len(audiences) > 0 { - // TODO(shinfan): Update golang oauth to support multiple audiences. - if len(audiences) > 1 { - return nil, fmt.Errorf("multiple audiences support is not implemented") - } - audience = audiences[0] - } - return google.JWTAccessTokenSourceFromJSON(data, audience) -} diff --git a/vendor/google.golang.org/api/internal/pool.go b/vendor/google.golang.org/api/internal/pool.go deleted file mode 100644 index a4426dcb7..000000000 --- a/vendor/google.golang.org/api/internal/pool.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2016 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package internal - -import ( - "errors" - - "google.golang.org/grpc/naming" -) - -// PoolResolver provides a fixed list of addresses to load balance between -// and does not provide further updates. -type PoolResolver struct { - poolSize int - dialOpt *DialSettings - ch chan []*naming.Update -} - -// NewPoolResolver returns a PoolResolver -// This is an EXPERIMENTAL API and may be changed or removed in the future. -func NewPoolResolver(size int, o *DialSettings) *PoolResolver { - return &PoolResolver{poolSize: size, dialOpt: o} -} - -// Resolve returns a Watcher for the endpoint defined by the DialSettings -// provided to NewPoolResolver. -func (r *PoolResolver) Resolve(target string) (naming.Watcher, error) { - if r.dialOpt.Endpoint == "" { - return nil, errors.New("no endpoint configured") - } - addrs := make([]*naming.Update, 0, r.poolSize) - for i := 0; i < r.poolSize; i++ { - addrs = append(addrs, &naming.Update{Op: naming.Add, Addr: r.dialOpt.Endpoint, Metadata: i}) - } - r.ch = make(chan []*naming.Update, 1) - r.ch <- addrs - return r, nil -} - -// Next returns a static list of updates on the first call, -// and blocks indefinitely until Close is called on subsequent calls. -func (r *PoolResolver) Next() ([]*naming.Update, error) { - return <-r.ch, nil -} - -// Close releases resources associated with the pool and causes Next to unblock. -func (r *PoolResolver) Close() { - close(r.ch) -} diff --git a/vendor/google.golang.org/api/internal/service-account.json b/vendor/google.golang.org/api/internal/service-account.json deleted file mode 100644 index 6b36a9296..000000000 --- a/vendor/google.golang.org/api/internal/service-account.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "type": "service_account", - "project_id": "project_id", - "private_key_id": "private_key_id", - "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCzd9ZdbPLAR4/g\nj+Rodu15kEasMpxf/Mz+gKRb2fmgR2Y18Y/iRBYZ4SkmF2pBSfzvwE/aTCzSPBGl\njHhPzohXnSN029eWoItmxVONlqCbR29pD07aLzv08LGeIGdHIEdhVjhvRwTkYZIF\ndXmlHNDRUU/EbJN9D+3ahw22BNnC4PaDgfIWTs3xIlTCSf2rL39I4DSNLTS/LzxK\n/XrQfBMtfwMWwyQaemXbc7gRgzOy8L56wa1W1zyXx99th97j1bLnoAXBGplhB4Co\n25ohyDAuhxRm+XGMEaO0Mzo7u97kvhj48a569RH1QRhOf7EBf60jO4h5eOmfi5P5\nPV3l7041AgMBAAECggEAEZ0RTNoEeRqM5F067YW+iM/AH+ZXspP9Cn1VpC4gcbqQ\nLXsnw+0qvh97CmIB66Z3TJBzRdl0DK4YjUbcB/kdKHwjnrR01DOtesijCqJd4N+B\n762w73jzSXbV9872U+S3HLZ5k3JE6KUqz55X8fyCAgkY6w4862lEzs2yasrPFHEV\nRoQp3PM0Miif8R3hGDhOWcHxcobullthG6JHAQFfc1ctwEjZI4TK0iWqlzfWGyKN\nT9UgvjUDud5cGvS9el0AiLN6keAf77tcPn1zetUVhxN1KN4bVAm1Q+6O8esl63Rj\n7JXpHzxaRnit9S6/aH/twHsGGtLg5Puw6jey6xs4AQKBgQD2JNy1wzewCRkD+jug\n8CHbJ+LIJVRNIaWa/RK1QD8/UjmFPkIzRQSF3AKC5mRAWSa2FL3yVK3N/DD7hazW\n85XSBB7IDcnoJnA9SkUeWwqQGkDx3EntlU3gX8Kn/+ofF8O9jLXxAa901MAVXVuf\n5YDzrl4PNE3bFnPCdiNmSdRfhQKBgQC6p4DsCpwqbeTu9f5ak9VW/fQP47Fgt+Mf\nwGjBnKP5PbbNJpHCfamF7jqSRH83Xy0KNssH7jD/NZ2oT594sMmiQPUC5ni9VYY6\nsuYB0JbD5Mq+EjKIVhYtxaQJ76LzHreEI+G4z6k3H7/hRpr3/C48n9G/uVkT9DbJ\noplxxEx68QKBgQCdJ23vcwO0Firtmi/GEmtbVHz70rGfSXNFoHz4UlvPXv0wsE5u\nE4vOt2i3EMhDOWh46odYGG6bzH+tp2xyFTW70Dui+QLHgPs6dpfoyLHWzZxXj5F3\n6lK9hgZvYvqk/XRRKmzjwnK2wjsdqOyeC1covlR5mqh20D/6kZkKbur0TQKBgAwy\nCZBimRWEnKKoW/gbFKNccGfhXqONID/g2Hdd/rC4QYth68AjacIgcJ9B7nX1uAGk\n1tsryvPB0w0+NpMyKdp6GAgaeuUUA3MuYSzZLiCagEyu77JMvaI7+Z3UlHcCGMd/\neK4Uk1/QqT7U2Cc/yN2ZK6E1QQa2vCWshA4U31JhAoGAbtbSSSsul1c+PsJ13Cfk\n6qVnqYzPqt23QTyOZmGAvUHH/M4xRiQpOE0cDF4t/r5PwenAQPQzTvMmWRzj6uAY\n3eaU0eAK7ZfoweCoOIAPnpFbbRLrXfoY46H7MYh7euWGXOKEpxz5yzuEkd9ByNUE\n86vSEidqbMIiXVgEgnu/k08=\n-----END PRIVATE KEY-----\n", - "client_email": "xyz@developer.gserviceaccount.com", - "client_id": "123", - "auth_uri": "https://accounts.google.com/o/oauth2/auth", - "token_uri": "https://accounts.google.com/o/oauth2/token", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xyz%40developer.gserviceaccount.com" -} diff --git a/vendor/google.golang.org/api/internal/settings.go b/vendor/google.golang.org/api/internal/settings.go deleted file mode 100644 index 062301c65..000000000 --- a/vendor/google.golang.org/api/internal/settings.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2017 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package internal supports the options and transport packages. -package internal - -import ( - "errors" - "net/http" - - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - "google.golang.org/grpc" -) - -// DialSettings holds information needed to establish a connection with a -// Google API service. -type DialSettings struct { - Endpoint string - Scopes []string - TokenSource oauth2.TokenSource - Credentials *google.Credentials - CredentialsFile string // if set, Token Source is ignored. - CredentialsJSON []byte - UserAgent string - APIKey string - Audiences []string - HTTPClient *http.Client - GRPCDialOpts []grpc.DialOption - GRPCConn *grpc.ClientConn - NoAuth bool - - // Google API system parameters. For more information please read: - // https://cloud.google.com/apis/docs/system-parameters - QuotaProject string - RequestReason string -} - -// Validate reports an error if ds is invalid. -func (ds *DialSettings) Validate() error { - hasCreds := ds.APIKey != "" || ds.TokenSource != nil || ds.CredentialsFile != "" || ds.Credentials != nil - if ds.NoAuth && hasCreds { - return errors.New("options.WithoutAuthentication is incompatible with any option that provides credentials") - } - // Credentials should not appear with other options. - // We currently allow TokenSource and CredentialsFile to coexist. - // TODO(jba): make TokenSource & CredentialsFile an error (breaking change). - nCreds := 0 - if ds.Credentials != nil { - nCreds++ - } - if ds.CredentialsJSON != nil { - nCreds++ - } - if ds.CredentialsFile != "" { - nCreds++ - } - if ds.APIKey != "" { - nCreds++ - } - if ds.TokenSource != nil { - nCreds++ - } - if len(ds.Scopes) > 0 && len(ds.Audiences) > 0 { - return errors.New("WithScopes is incompatible with WithAudience") - } - // Accept only one form of credentials, except we allow TokenSource and CredentialsFile for backwards compatibility. - if nCreds > 1 && !(nCreds == 2 && ds.TokenSource != nil && ds.CredentialsFile != "") { - return errors.New("multiple credential options provided") - } - if ds.HTTPClient != nil && ds.GRPCConn != nil { - return errors.New("WithHTTPClient is incompatible with WithGRPCConn") - } - if ds.HTTPClient != nil && ds.GRPCDialOpts != nil { - return errors.New("WithHTTPClient is incompatible with gRPC dial options") - } - if ds.HTTPClient != nil && ds.QuotaProject != "" { - return errors.New("WithHTTPClient is incompatible with QuotaProject") - } - if ds.HTTPClient != nil && ds.RequestReason != "" { - return errors.New("WithHTTPClient is incompatible with RequestReason") - } - - return nil -} diff --git a/vendor/google.golang.org/api/iterator/iterator.go b/vendor/google.golang.org/api/iterator/iterator.go deleted file mode 100644 index 3c8ea7732..000000000 --- a/vendor/google.golang.org/api/iterator/iterator.go +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright 2016 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package iterator provides support for standard Google API iterators. -// See https://github.com/GoogleCloudPlatform/gcloud-golang/wiki/Iterator-Guidelines. -package iterator - -import ( - "errors" - "fmt" - "reflect" -) - -// Done is returned by an iterator's Next method when the iteration is -// complete; when there are no more items to return. -var Done = errors.New("no more items in iterator") - -// We don't support mixed calls to Next and NextPage because they play -// with the paging state in incompatible ways. -var errMixed = errors.New("iterator: Next and NextPage called on same iterator") - -// PageInfo contains information about an iterator's paging state. -type PageInfo struct { - // Token is the token used to retrieve the next page of items from the - // API. You may set Token immediately after creating an iterator to - // begin iteration at a particular point. If Token is the empty string, - // the iterator will begin with the first eligible item. - // - // The result of setting Token after the first call to Next is undefined. - // - // After the underlying API method is called to retrieve a page of items, - // Token is set to the next-page token in the response. - Token string - - // MaxSize is the maximum number of items returned by a call to the API. - // Set MaxSize as a hint to optimize the buffering behavior of the iterator. - // If zero, the page size is determined by the underlying service. - // - // Use Pager to retrieve a page of a specific, exact size. - MaxSize int - - // The error state of the iterator. Manipulated by PageInfo.next and Pager. - // This is a latch: it starts as nil, and once set should never change. - err error - - // If true, no more calls to fetch should be made. Set to true when fetch - // returns an empty page token. The iterator is Done when this is true AND - // the buffer is empty. - atEnd bool - - // Function that fetches a page from the underlying service. It should pass - // the pageSize and pageToken arguments to the service, fill the buffer - // with the results from the call, and return the next-page token returned - // by the service. The function must not remove any existing items from the - // buffer. If the underlying RPC takes an int32 page size, pageSize should - // be silently truncated. - fetch func(pageSize int, pageToken string) (nextPageToken string, err error) - - // Function that returns the number of currently buffered items. - bufLen func() int - - // Function that returns the buffer, after setting the buffer variable to nil. - takeBuf func() interface{} - - // Set to true on first call to PageInfo.next or Pager.NextPage. Used to check - // for calls to both Next and NextPage with the same iterator. - nextCalled, nextPageCalled bool -} - -// NewPageInfo exposes internals for iterator implementations. -// It is not a stable interface. -var NewPageInfo = newPageInfo - -// If an iterator can support paging, its iterator-creating method should call -// this (via the NewPageInfo variable above). -// -// The fetch, bufLen and takeBuf arguments provide access to the -// iterator's internal slice of buffered items. They behave as described in -// PageInfo, above. -// -// The return value is the PageInfo.next method bound to the returned PageInfo value. -// (Returning it avoids exporting PageInfo.next.) -func newPageInfo(fetch func(int, string) (string, error), bufLen func() int, takeBuf func() interface{}) (*PageInfo, func() error) { - pi := &PageInfo{ - fetch: fetch, - bufLen: bufLen, - takeBuf: takeBuf, - } - return pi, pi.next -} - -// Remaining returns the number of items available before the iterator makes another API call. -func (pi *PageInfo) Remaining() int { return pi.bufLen() } - -// next provides support for an iterator's Next function. An iterator's Next -// should return the error returned by next if non-nil; else it can assume -// there is at least one item in its buffer, and it should return that item and -// remove it from the buffer. -func (pi *PageInfo) next() error { - pi.nextCalled = true - if pi.err != nil { // Once we get an error, always return it. - // TODO(jba): fix so users can retry on transient errors? Probably not worth it. - return pi.err - } - if pi.nextPageCalled { - pi.err = errMixed - return pi.err - } - // Loop until we get some items or reach the end. - for pi.bufLen() == 0 && !pi.atEnd { - if err := pi.fill(pi.MaxSize); err != nil { - pi.err = err - return pi.err - } - if pi.Token == "" { - pi.atEnd = true - } - } - // Either the buffer is non-empty or pi.atEnd is true (or both). - if pi.bufLen() == 0 { - // The buffer is empty and pi.atEnd is true, i.e. the service has no - // more items. - pi.err = Done - } - return pi.err -} - -// Call the service to fill the buffer, using size and pi.Token. Set pi.Token to the -// next-page token returned by the call. -// If fill returns a non-nil error, the buffer will be empty. -func (pi *PageInfo) fill(size int) error { - tok, err := pi.fetch(size, pi.Token) - if err != nil { - pi.takeBuf() // clear the buffer - return err - } - pi.Token = tok - return nil -} - -// Pageable is implemented by iterators that support paging. -type Pageable interface { - // PageInfo returns paging information associated with the iterator. - PageInfo() *PageInfo -} - -// Pager supports retrieving iterator items a page at a time. -type Pager struct { - pageInfo *PageInfo - pageSize int -} - -// NewPager returns a pager that uses iter. Calls to its NextPage method will -// obtain exactly pageSize items, unless fewer remain. The pageToken argument -// indicates where to start the iteration. Pass the empty string to start at -// the beginning, or pass a token retrieved from a call to Pager.NextPage. -// -// If you use an iterator with a Pager, you must not call Next on the iterator. -func NewPager(iter Pageable, pageSize int, pageToken string) *Pager { - p := &Pager{ - pageInfo: iter.PageInfo(), - pageSize: pageSize, - } - p.pageInfo.Token = pageToken - if pageSize <= 0 { - p.pageInfo.err = errors.New("iterator: page size must be positive") - } - return p -} - -// NextPage retrieves a sequence of items from the iterator and appends them -// to slicep, which must be a pointer to a slice of the iterator's item type. -// Exactly p.pageSize items will be appended, unless fewer remain. -// -// The first return value is the page token to use for the next page of items. -// If empty, there are no more pages. Aside from checking for the end of the -// iteration, the returned page token is only needed if the iteration is to be -// resumed a later time, in another context (possibly another process). -// -// The second return value is non-nil if an error occurred. It will never be -// the special iterator sentinel value Done. To recognize the end of the -// iteration, compare nextPageToken to the empty string. -// -// It is possible for NextPage to return a single zero-length page along with -// an empty page token when there are no more items in the iteration. -func (p *Pager) NextPage(slicep interface{}) (nextPageToken string, err error) { - p.pageInfo.nextPageCalled = true - if p.pageInfo.err != nil { - return "", p.pageInfo.err - } - if p.pageInfo.nextCalled { - p.pageInfo.err = errMixed - return "", p.pageInfo.err - } - if p.pageInfo.bufLen() > 0 { - return "", errors.New("must call NextPage with an empty buffer") - } - // The buffer must be empty here, so takeBuf is a no-op. We call it just to get - // the buffer's type. - wantSliceType := reflect.PtrTo(reflect.ValueOf(p.pageInfo.takeBuf()).Type()) - if slicep == nil { - return "", errors.New("nil passed to Pager.NextPage") - } - vslicep := reflect.ValueOf(slicep) - if vslicep.Type() != wantSliceType { - return "", fmt.Errorf("slicep should be of type %s, got %T", wantSliceType, slicep) - } - for p.pageInfo.bufLen() < p.pageSize { - if err := p.pageInfo.fill(p.pageSize - p.pageInfo.bufLen()); err != nil { - p.pageInfo.err = err - return "", p.pageInfo.err - } - if p.pageInfo.Token == "" { - break - } - } - e := vslicep.Elem() - e.Set(reflect.AppendSlice(e, reflect.ValueOf(p.pageInfo.takeBuf()))) - return p.pageInfo.Token, nil -} diff --git a/vendor/google.golang.org/api/option/credentials_go19.go b/vendor/google.golang.org/api/option/credentials_go19.go deleted file mode 100644 index 0636a8294..000000000 --- a/vendor/google.golang.org/api/option/credentials_go19.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build go1.9 - -package option - -import ( - "golang.org/x/oauth2/google" - "google.golang.org/api/internal" -) - -type withCreds google.Credentials - -func (w *withCreds) Apply(o *internal.DialSettings) { - o.Credentials = (*google.Credentials)(w) -} - -// WithCredentials returns a ClientOption that authenticates API calls. -func WithCredentials(creds *google.Credentials) ClientOption { - return (*withCreds)(creds) -} diff --git a/vendor/google.golang.org/api/option/credentials_notgo19.go b/vendor/google.golang.org/api/option/credentials_notgo19.go deleted file mode 100644 index 74d3a4b5b..000000000 --- a/vendor/google.golang.org/api/option/credentials_notgo19.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build !go1.9 - -package option - -import ( - "golang.org/x/oauth2/google" - "google.golang.org/api/internal" -) - -type withCreds google.DefaultCredentials - -func (w *withCreds) Apply(o *internal.DialSettings) { - o.Credentials = (*google.DefaultCredentials)(w) -} - -func WithCredentials(creds *google.DefaultCredentials) ClientOption { - return (*withCreds)(creds) -} diff --git a/vendor/google.golang.org/api/option/option.go b/vendor/google.golang.org/api/option/option.go deleted file mode 100644 index 0a1c2dba9..000000000 --- a/vendor/google.golang.org/api/option/option.go +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright 2017 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package option contains options for Google API clients. -package option - -import ( - "net/http" - - "golang.org/x/oauth2" - "google.golang.org/api/internal" - "google.golang.org/grpc" -) - -// A ClientOption is an option for a Google API client. -type ClientOption interface { - Apply(*internal.DialSettings) -} - -// WithTokenSource returns a ClientOption that specifies an OAuth2 token -// source to be used as the basis for authentication. -func WithTokenSource(s oauth2.TokenSource) ClientOption { - return withTokenSource{s} -} - -type withTokenSource struct{ ts oauth2.TokenSource } - -func (w withTokenSource) Apply(o *internal.DialSettings) { - o.TokenSource = w.ts -} - -type withCredFile string - -func (w withCredFile) Apply(o *internal.DialSettings) { - o.CredentialsFile = string(w) -} - -// WithCredentialsFile returns a ClientOption that authenticates -// API calls with the given service account or refresh token JSON -// credentials file. -func WithCredentialsFile(filename string) ClientOption { - return withCredFile(filename) -} - -// WithServiceAccountFile returns a ClientOption that uses a Google service -// account credentials file to authenticate. -// -// Deprecated: Use WithCredentialsFile instead. -func WithServiceAccountFile(filename string) ClientOption { - return WithCredentialsFile(filename) -} - -// WithCredentialsJSON returns a ClientOption that authenticates -// API calls with the given service account or refresh token JSON -// credentials. -func WithCredentialsJSON(p []byte) ClientOption { - return withCredentialsJSON(p) -} - -type withCredentialsJSON []byte - -func (w withCredentialsJSON) Apply(o *internal.DialSettings) { - o.CredentialsJSON = make([]byte, len(w)) - copy(o.CredentialsJSON, w) -} - -// WithEndpoint returns a ClientOption that overrides the default endpoint -// to be used for a service. -func WithEndpoint(url string) ClientOption { - return withEndpoint(url) -} - -type withEndpoint string - -func (w withEndpoint) Apply(o *internal.DialSettings) { - o.Endpoint = string(w) -} - -// WithScopes returns a ClientOption that overrides the default OAuth2 scopes -// to be used for a service. -func WithScopes(scope ...string) ClientOption { - return withScopes(scope) -} - -type withScopes []string - -func (w withScopes) Apply(o *internal.DialSettings) { - o.Scopes = make([]string, len(w)) - copy(o.Scopes, w) -} - -// WithUserAgent returns a ClientOption that sets the User-Agent. -func WithUserAgent(ua string) ClientOption { - return withUA(ua) -} - -type withUA string - -func (w withUA) Apply(o *internal.DialSettings) { o.UserAgent = string(w) } - -// WithHTTPClient returns a ClientOption that specifies the HTTP client to use -// as the basis of communications. This option may only be used with services -// that support HTTP as their communication transport. When used, the -// WithHTTPClient option takes precedent over all other supplied options. -func WithHTTPClient(client *http.Client) ClientOption { - return withHTTPClient{client} -} - -type withHTTPClient struct{ client *http.Client } - -func (w withHTTPClient) Apply(o *internal.DialSettings) { - o.HTTPClient = w.client -} - -// WithGRPCConn returns a ClientOption that specifies the gRPC client -// connection to use as the basis of communications. This option many only be -// used with services that support gRPC as their communication transport. When -// used, the WithGRPCConn option takes precedent over all other supplied -// options. -func WithGRPCConn(conn *grpc.ClientConn) ClientOption { - return withGRPCConn{conn} -} - -type withGRPCConn struct{ conn *grpc.ClientConn } - -func (w withGRPCConn) Apply(o *internal.DialSettings) { - o.GRPCConn = w.conn -} - -// WithGRPCDialOption returns a ClientOption that appends a new grpc.DialOption -// to an underlying gRPC dial. It does not work with WithGRPCConn. -func WithGRPCDialOption(opt grpc.DialOption) ClientOption { - return withGRPCDialOption{opt} -} - -type withGRPCDialOption struct{ opt grpc.DialOption } - -func (w withGRPCDialOption) Apply(o *internal.DialSettings) { - o.GRPCDialOpts = append(o.GRPCDialOpts, w.opt) -} - -// WithGRPCConnectionPool returns a ClientOption that creates a pool of gRPC -// connections that requests will be balanced between. -// This is an EXPERIMENTAL API and may be changed or removed in the future. -func WithGRPCConnectionPool(size int) ClientOption { - return withGRPCConnectionPool(size) -} - -type withGRPCConnectionPool int - -func (w withGRPCConnectionPool) Apply(o *internal.DialSettings) { - balancer := grpc.RoundRobin(internal.NewPoolResolver(int(w), o)) - o.GRPCDialOpts = append(o.GRPCDialOpts, grpc.WithBalancer(balancer)) -} - -// WithAPIKey returns a ClientOption that specifies an API key to be used -// as the basis for authentication. -// -// API Keys can only be used for JSON-over-HTTP APIs, including those under -// the import path google.golang.org/api/.... -func WithAPIKey(apiKey string) ClientOption { - return withAPIKey(apiKey) -} - -type withAPIKey string - -func (w withAPIKey) Apply(o *internal.DialSettings) { o.APIKey = string(w) } - -// WithAudiences returns a ClientOption that specifies an audience to be used -// as the audience field ("aud") for the JWT token authentication. -func WithAudiences(audience ...string) ClientOption { - return withAudiences(audience) -} - -type withAudiences []string - -func (w withAudiences) Apply(o *internal.DialSettings) { - o.Audiences = make([]string, len(w)) - copy(o.Audiences, w) -} - -// WithoutAuthentication returns a ClientOption that specifies that no -// authentication should be used. It is suitable only for testing and for -// accessing public resources, like public Google Cloud Storage buckets. -// It is an error to provide both WithoutAuthentication and any of WithAPIKey, -// WithTokenSource, WithCredentialsFile or WithServiceAccountFile. -func WithoutAuthentication() ClientOption { - return withoutAuthentication{} -} - -type withoutAuthentication struct{} - -func (w withoutAuthentication) Apply(o *internal.DialSettings) { o.NoAuth = true } - -// WithQuotaProject returns a ClientOption that specifies the project used -// for quota and billing purposes. -// -// For more information please read: -// https://cloud.google.com/apis/docs/system-parameters -func WithQuotaProject(quotaProject string) ClientOption { - return withQuotaProject(quotaProject) -} - -type withQuotaProject string - -func (w withQuotaProject) Apply(o *internal.DialSettings) { - o.QuotaProject = string(w) -} - -// WithRequestReason returns a ClientOption that specifies a reason for -// making the request, which is intended to be recorded in audit logging. -// An example reason would be a support-case ticket number. -// -// For more information please read: -// https://cloud.google.com/apis/docs/system-parameters -func WithRequestReason(requestReason string) ClientOption { - return withRequestReason(requestReason) -} - -type withRequestReason string - -func (w withRequestReason) Apply(o *internal.DialSettings) { - o.RequestReason = string(w) -} diff --git a/vendor/google.golang.org/api/support/bundler/bundler.go b/vendor/google.golang.org/api/support/bundler/bundler.go deleted file mode 100644 index c55327119..000000000 --- a/vendor/google.golang.org/api/support/bundler/bundler.go +++ /dev/null @@ -1,349 +0,0 @@ -// Copyright 2016 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package bundler supports bundling (batching) of items. Bundling amortizes an -// action with fixed costs over multiple items. For example, if an API provides -// an RPC that accepts a list of items as input, but clients would prefer -// adding items one at a time, then a Bundler can accept individual items from -// the client and bundle many of them into a single RPC. -// -// This package is experimental and subject to change without notice. -package bundler - -import ( - "context" - "errors" - "math" - "reflect" - "sync" - "time" - - "golang.org/x/sync/semaphore" -) - -const ( - DefaultDelayThreshold = time.Second - DefaultBundleCountThreshold = 10 - DefaultBundleByteThreshold = 1e6 // 1M - DefaultBufferedByteLimit = 1e9 // 1G -) - -var ( - // ErrOverflow indicates that Bundler's stored bytes exceeds its BufferedByteLimit. - ErrOverflow = errors.New("bundler reached buffered byte limit") - - // ErrOversizedItem indicates that an item's size exceeds the maximum bundle size. - ErrOversizedItem = errors.New("item size exceeds bundle byte limit") -) - -// A Bundler collects items added to it into a bundle until the bundle -// exceeds a given size, then calls a user-provided function to handle the bundle. -type Bundler struct { - // Starting from the time that the first message is added to a bundle, once - // this delay has passed, handle the bundle. The default is DefaultDelayThreshold. - DelayThreshold time.Duration - - // Once a bundle has this many items, handle the bundle. Since only one - // item at a time is added to a bundle, no bundle will exceed this - // threshold, so it also serves as a limit. The default is - // DefaultBundleCountThreshold. - BundleCountThreshold int - - // Once the number of bytes in current bundle reaches this threshold, handle - // the bundle. The default is DefaultBundleByteThreshold. This triggers handling, - // but does not cap the total size of a bundle. - BundleByteThreshold int - - // The maximum size of a bundle, in bytes. Zero means unlimited. - BundleByteLimit int - - // The maximum number of bytes that the Bundler will keep in memory before - // returning ErrOverflow. The default is DefaultBufferedByteLimit. - BufferedByteLimit int - - // The maximum number of handler invocations that can be running at once. - // The default is 1. - HandlerLimit int - - handler func(interface{}) // called to handle a bundle - itemSliceZero reflect.Value // nil (zero value) for slice of items - flushTimer *time.Timer // implements DelayThreshold - - mu sync.Mutex - sem *semaphore.Weighted // enforces BufferedByteLimit - semOnce sync.Once - curBundle bundle // incoming items added to this bundle - - // Each bundle is assigned a unique ticket that determines the order in which the - // handler is called. The ticket is assigned with mu locked, but waiting for tickets - // to be handled is done via mu2 and cond, below. - nextTicket uint64 // next ticket to be assigned - - mu2 sync.Mutex - cond *sync.Cond - nextHandled uint64 // next ticket to be handled - - // In this implementation, active uses space proportional to HandlerLimit, and - // waitUntilAllHandled takes time proportional to HandlerLimit each time an acquire - // or release occurs, so large values of HandlerLimit max may cause performance - // issues. - active map[uint64]bool // tickets of bundles actively being handled -} - -type bundle struct { - items reflect.Value // slice of item type - size int // size in bytes of all items -} - -// NewBundler creates a new Bundler. -// -// itemExample is a value of the type that will be bundled. For example, if you -// want to create bundles of *Entry, you could pass &Entry{} for itemExample. -// -// handler is a function that will be called on each bundle. If itemExample is -// of type T, the argument to handler is of type []T. handler is always called -// sequentially for each bundle, and never in parallel. -// -// Configure the Bundler by setting its thresholds and limits before calling -// any of its methods. -func NewBundler(itemExample interface{}, handler func(interface{})) *Bundler { - b := &Bundler{ - DelayThreshold: DefaultDelayThreshold, - BundleCountThreshold: DefaultBundleCountThreshold, - BundleByteThreshold: DefaultBundleByteThreshold, - BufferedByteLimit: DefaultBufferedByteLimit, - HandlerLimit: 1, - - handler: handler, - itemSliceZero: reflect.Zero(reflect.SliceOf(reflect.TypeOf(itemExample))), - active: map[uint64]bool{}, - } - b.curBundle.items = b.itemSliceZero - b.cond = sync.NewCond(&b.mu2) - return b -} - -func (b *Bundler) initSemaphores() { - // Create the semaphores lazily, because the user may set limits - // after NewBundler. - b.semOnce.Do(func() { - b.sem = semaphore.NewWeighted(int64(b.BufferedByteLimit)) - }) -} - -// Add adds item to the current bundle. It marks the bundle for handling and -// starts a new one if any of the thresholds or limits are exceeded. -// -// If the item's size exceeds the maximum bundle size (Bundler.BundleByteLimit), then -// the item can never be handled. Add returns ErrOversizedItem in this case. -// -// If adding the item would exceed the maximum memory allowed -// (Bundler.BufferedByteLimit) or an AddWait call is blocked waiting for -// memory, Add returns ErrOverflow. -// -// Add never blocks. -func (b *Bundler) Add(item interface{}, size int) error { - // If this item exceeds the maximum size of a bundle, - // we can never send it. - if b.BundleByteLimit > 0 && size > b.BundleByteLimit { - return ErrOversizedItem - } - // If adding this item would exceed our allotted memory - // footprint, we can't accept it. - // (TryAcquire also returns false if anything is waiting on the semaphore, - // so calls to Add and AddWait shouldn't be mixed.) - b.initSemaphores() - if !b.sem.TryAcquire(int64(size)) { - return ErrOverflow - } - b.add(item, size) - return nil -} - -// add adds item to the current bundle. It marks the bundle for handling and -// starts a new one if any of the thresholds or limits are exceeded. -func (b *Bundler) add(item interface{}, size int) { - b.mu.Lock() - defer b.mu.Unlock() - - // If adding this item to the current bundle would cause it to exceed the - // maximum bundle size, close the current bundle and start a new one. - if b.BundleByteLimit > 0 && b.curBundle.size+size > b.BundleByteLimit { - b.startFlushLocked() - } - // Add the item. - b.curBundle.items = reflect.Append(b.curBundle.items, reflect.ValueOf(item)) - b.curBundle.size += size - - // Start a timer to flush the item if one isn't already running. - // startFlushLocked clears the timer and closes the bundle at the same time, - // so we only allocate a new timer for the first item in each bundle. - // (We could try to call Reset on the timer instead, but that would add a lot - // of complexity to the code just to save one small allocation.) - if b.flushTimer == nil { - b.flushTimer = time.AfterFunc(b.DelayThreshold, b.Flush) - } - - // If the current bundle equals the count threshold, close it. - if b.curBundle.items.Len() == b.BundleCountThreshold { - b.startFlushLocked() - } - // If the current bundle equals or exceeds the byte threshold, close it. - if b.curBundle.size >= b.BundleByteThreshold { - b.startFlushLocked() - } -} - -// AddWait adds item to the current bundle. It marks the bundle for handling and -// starts a new one if any of the thresholds or limits are exceeded. -// -// If the item's size exceeds the maximum bundle size (Bundler.BundleByteLimit), then -// the item can never be handled. AddWait returns ErrOversizedItem in this case. -// -// If adding the item would exceed the maximum memory allowed (Bundler.BufferedByteLimit), -// AddWait blocks until space is available or ctx is done. -// -// Calls to Add and AddWait should not be mixed on the same Bundler. -func (b *Bundler) AddWait(ctx context.Context, item interface{}, size int) error { - // If this item exceeds the maximum size of a bundle, - // we can never send it. - if b.BundleByteLimit > 0 && size > b.BundleByteLimit { - return ErrOversizedItem - } - // If adding this item would exceed our allotted memory footprint, block - // until space is available. The semaphore is FIFO, so there will be no - // starvation. - b.initSemaphores() - if err := b.sem.Acquire(ctx, int64(size)); err != nil { - return err - } - // Here, we've reserved space for item. Other goroutines can call AddWait - // and even acquire space, but no one can take away our reservation - // (assuming sem.Release is used correctly). So there is no race condition - // resulting from locking the mutex after sem.Acquire returns. - b.add(item, size) - return nil -} - -// Flush invokes the handler for all remaining items in the Bundler and waits -// for it to return. -func (b *Bundler) Flush() { - b.mu.Lock() - b.startFlushLocked() - // Here, all bundles with tickets < b.nextTicket are - // either finished or active. Those are the ones - // we want to wait for. - t := b.nextTicket - b.mu.Unlock() - b.initSemaphores() - b.waitUntilAllHandled(t) -} - -func (b *Bundler) startFlushLocked() { - if b.flushTimer != nil { - b.flushTimer.Stop() - b.flushTimer = nil - } - if b.curBundle.items.Len() == 0 { - return - } - // Here, both semaphores must have been initialized. - bun := b.curBundle - b.curBundle = bundle{items: b.itemSliceZero} - ticket := b.nextTicket - b.nextTicket++ - go func() { - defer func() { - b.sem.Release(int64(bun.size)) - b.release(ticket) - }() - b.acquire(ticket) - b.handler(bun.items.Interface()) - }() -} - -// acquire blocks until ticket is the next to be served, then returns. In order for N -// acquire calls to return, the tickets must be in the range [0, N). A ticket must -// not be presented to acquire more than once. -func (b *Bundler) acquire(ticket uint64) { - b.mu2.Lock() - defer b.mu2.Unlock() - if ticket < b.nextHandled { - panic("bundler: acquire: arg too small") - } - for !(ticket == b.nextHandled && len(b.active) < b.HandlerLimit) { - b.cond.Wait() - } - // Here, - // ticket == b.nextHandled: the caller is the next one to be handled; - // and len(b.active) < b.HandlerLimit: there is space available. - b.active[ticket] = true - b.nextHandled++ - // Broadcast, not Signal: although at most one acquire waiter can make progress, - // there might be waiters in waitUntilAllHandled. - b.cond.Broadcast() -} - -// If a ticket is used for a call to acquire, it must later be passed to release. A -// ticket must not be presented to release more than once. -func (b *Bundler) release(ticket uint64) { - b.mu2.Lock() - defer b.mu2.Unlock() - if !b.active[ticket] { - panic("bundler: release: not an active ticket") - } - delete(b.active, ticket) - b.cond.Broadcast() -} - -// waitUntilAllHandled blocks until all tickets < n have called release, meaning -// all bundles with tickets < n have been handled. -func (b *Bundler) waitUntilAllHandled(n uint64) { - // Proof of correctness of this function. - // "N is acquired" means acquire(N) has returned. - // "N is released" means release(N) has returned. - // 1. If N is acquired, N-1 is acquired. - // Follows from the loop test in acquire, and the fact - // that nextHandled is incremented by 1. - // 2. If nextHandled >= N, then N-1 is acquired. - // Because we only increment nextHandled to N after N-1 is acquired. - // 3. If nextHandled >= N, then all n < N is acquired. - // Follows from #1 and #2. - // 4. If N is acquired and N is not in active, then N is released. - // Because we put N in active before acquire returns, and only - // remove it when it is released. - // Let min(active) be the smallest member of active, or infinity if active is empty. - // 5. If nextHandled >= N and N <= min(active), then all n < N is released. - // From nextHandled >= N and #3, all n < N is acquired. - // N <= min(active) implies n < min(active) for all n < N. So all n < N is not in active. - // So from #4, all n < N is released. - // The loop test below is the antecedent of #5. - b.mu2.Lock() - defer b.mu2.Unlock() - for !(b.nextHandled >= n && n <= min(b.active)) { - b.cond.Wait() - } -} - -// min returns the minimum value of the set s, or the largest uint64 if -// s is empty. -func min(s map[uint64]bool) uint64 { - var m uint64 = math.MaxUint64 - for n := range s { - if n < m { - m = n - } - } - return m -} diff --git a/vendor/google.golang.org/api/transport/dial.go b/vendor/google.golang.org/api/transport/dial.go deleted file mode 100644 index 1fb7cf905..000000000 --- a/vendor/google.golang.org/api/transport/dial.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2015 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package transport - -import ( - "context" - "net/http" - - "google.golang.org/grpc" - - "google.golang.org/api/option" - gtransport "google.golang.org/api/transport/grpc" - htransport "google.golang.org/api/transport/http" -) - -// NewHTTPClient returns an HTTP client for use communicating with a Google cloud -// service, configured with the given ClientOptions. It also returns the endpoint -// for the service as specified in the options. -func NewHTTPClient(ctx context.Context, opts ...option.ClientOption) (*http.Client, string, error) { - return htransport.NewClient(ctx, opts...) -} - -// DialGRPC returns a GRPC connection for use communicating with a Google cloud -// service, configured with the given ClientOptions. -func DialGRPC(ctx context.Context, opts ...option.ClientOption) (*grpc.ClientConn, error) { - return gtransport.Dial(ctx, opts...) -} - -// DialGRPCInsecure returns an insecure GRPC connection for use communicating -// with fake or mock Google cloud service implementations, such as emulators. -// The connection is configured with the given ClientOptions. -func DialGRPCInsecure(ctx context.Context, opts ...option.ClientOption) (*grpc.ClientConn, error) { - return gtransport.DialInsecure(ctx, opts...) -} diff --git a/vendor/google.golang.org/api/transport/doc.go b/vendor/google.golang.org/api/transport/doc.go deleted file mode 100644 index 4915036c3..000000000 --- a/vendor/google.golang.org/api/transport/doc.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package transport provides utility methods for creating authenticated -// transports to Google's HTTP and gRPC APIs. It is intended to be used in -// conjunction with google.golang.org/api/option. -// -// This package is not intended for use by end developers. Use the -// google.golang.org/api/option package to configure API clients. -package transport diff --git a/vendor/google.golang.org/api/transport/go19.go b/vendor/google.golang.org/api/transport/go19.go deleted file mode 100644 index 3e89f9328..000000000 --- a/vendor/google.golang.org/api/transport/go19.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build go1.9 - -package transport - -import ( - "context" - - "golang.org/x/oauth2/google" - "google.golang.org/api/internal" - "google.golang.org/api/option" -) - -// Creds constructs a google.Credentials from the information in the options, -// or obtains the default credentials in the same way as google.FindDefaultCredentials. -func Creds(ctx context.Context, opts ...option.ClientOption) (*google.Credentials, error) { - var ds internal.DialSettings - for _, opt := range opts { - opt.Apply(&ds) - } - return internal.Creds(ctx, &ds) -} diff --git a/vendor/google.golang.org/api/transport/grpc/dial.go b/vendor/google.golang.org/api/transport/grpc/dial.go deleted file mode 100644 index b850246ce..000000000 --- a/vendor/google.golang.org/api/transport/grpc/dial.go +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright 2015 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package grpc supports network connections to GRPC servers. -// This package is not intended for use by end developers. Use the -// google.golang.org/api/option package to configure API clients. -package grpc - -import ( - "context" - "errors" - "log" - "os" - "strings" - - "go.opencensus.io/plugin/ocgrpc" - "golang.org/x/oauth2" - "google.golang.org/api/internal" - "google.golang.org/api/option" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - grpcgoogle "google.golang.org/grpc/credentials/google" - "google.golang.org/grpc/credentials/oauth" - - // Install grpclb, which is required for direct path. - _ "google.golang.org/grpc/balancer/grpclb" -) - -// Set at init time by dial_appengine.go. If nil, we're not on App Engine. -var appengineDialerHook func(context.Context) grpc.DialOption - -// Set at init time by dial_socketopt.go. If nil, socketopt is not supported. -var timeoutDialerOption grpc.DialOption - -// Dial returns a GRPC connection for use communicating with a Google cloud -// service, configured with the given ClientOptions. -func Dial(ctx context.Context, opts ...option.ClientOption) (*grpc.ClientConn, error) { - return dial(ctx, false, opts) -} - -// DialInsecure returns an insecure GRPC connection for use communicating -// with fake or mock Google cloud service implementations, such as emulators. -// The connection is configured with the given ClientOptions. -func DialInsecure(ctx context.Context, opts ...option.ClientOption) (*grpc.ClientConn, error) { - return dial(ctx, true, opts) -} - -func dial(ctx context.Context, insecure bool, opts []option.ClientOption) (*grpc.ClientConn, error) { - var o internal.DialSettings - for _, opt := range opts { - opt.Apply(&o) - } - if err := o.Validate(); err != nil { - return nil, err - } - if o.HTTPClient != nil { - return nil, errors.New("unsupported HTTP client specified") - } - if o.GRPCConn != nil { - return o.GRPCConn, nil - } - var grpcOpts []grpc.DialOption - if insecure { - grpcOpts = []grpc.DialOption{grpc.WithInsecure()} - } else if !o.NoAuth { - if o.APIKey != "" { - log.Print("API keys are not supported for gRPC APIs. Remove the WithAPIKey option from your client-creating call.") - } - creds, err := internal.Creds(ctx, &o) - if err != nil { - return nil, err - } - // Attempt Direct Path only if: - // * The endpoint is a host:port (or dns:///host:port). - // * Credentials are obtained via GCE metadata server, using the default - // service account. - // * Opted in via GOOGLE_CLOUD_ENABLE_DIRECT_PATH environment variable. - // For example, GOOGLE_CLOUD_ENABLE_DIRECT_PATH=spanner,pubsub - if isDirectPathEnabled(o.Endpoint) && isTokenSourceDirectPathCompatible(creds.TokenSource) { - if !strings.HasPrefix(o.Endpoint, "dns:///") { - o.Endpoint = "dns:///" + o.Endpoint - } - grpcOpts = []grpc.DialOption{ - grpc.WithCredentialsBundle( - grpcgoogle.NewComputeEngineCredentials(), - ), - } - // TODO(cbro): add support for system parameters (quota project, request reason) via chained interceptor. - } else { - grpcOpts = []grpc.DialOption{ - grpc.WithPerRPCCredentials(grpcTokenSource{ - TokenSource: oauth.TokenSource{creds.TokenSource}, - quotaProject: o.QuotaProject, - requestReason: o.RequestReason, - }), - grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), - } - } - } - - if appengineDialerHook != nil { - // Use the Socket API on App Engine. - // appengine dialer will override socketopt dialer - grpcOpts = append(grpcOpts, appengineDialerHook(ctx)) - } - - // Add tracing, but before the other options, so that clients can override the - // gRPC stats handler. - // This assumes that gRPC options are processed in order, left to right. - grpcOpts = addOCStatsHandler(grpcOpts) - grpcOpts = append(grpcOpts, o.GRPCDialOpts...) - if o.UserAgent != "" { - grpcOpts = append(grpcOpts, grpc.WithUserAgent(o.UserAgent)) - } - - // TODO(weiranf): This socketopt dialer will be used by default at some - // point when isDirectPathEnabled will default to true, we guard it by - // the Directpath env var for now once we can introspect user defined - // dialer (https://github.com/grpc/grpc-go/issues/2795). - if timeoutDialerOption != nil && isDirectPathEnabled(o.Endpoint) { - grpcOpts = append(grpcOpts, timeoutDialerOption) - } - - return grpc.DialContext(ctx, o.Endpoint, grpcOpts...) -} - -func addOCStatsHandler(opts []grpc.DialOption) []grpc.DialOption { - return append(opts, grpc.WithStatsHandler(&ocgrpc.ClientHandler{})) -} - -// grpcTokenSource supplies PerRPCCredentials from an oauth.TokenSource. -type grpcTokenSource struct { - oauth.TokenSource - - // Additional metadata attached as headers. - quotaProject string - requestReason string -} - -// GetRequestMetadata gets the request metadata as a map from a grpcTokenSource. -func (ts grpcTokenSource) GetRequestMetadata(ctx context.Context, uri ...string) ( - map[string]string, error) { - metadata, err := ts.TokenSource.GetRequestMetadata(ctx, uri...) - if err != nil { - return nil, err - } - - // Attach system parameter - if ts.quotaProject != "" { - metadata["X-goog-user-project"] = ts.quotaProject - } - if ts.requestReason != "" { - metadata["X-goog-request-reason"] = ts.requestReason - } - return metadata, nil -} - -func isTokenSourceDirectPathCompatible(ts oauth2.TokenSource) bool { - if ts == nil { - return false - } - tok, err := ts.Token() - if err != nil { - return false - } - if tok == nil { - return false - } - if source, _ := tok.Extra("oauth2.google.tokenSource").(string); source != "compute-metadata" { - return false - } - if acct, _ := tok.Extra("oauth2.google.serviceAccount").(string); acct != "default" { - return false - } - return true -} - -func isDirectPathEnabled(endpoint string) bool { - // Only host:port is supported, not other schemes (e.g., "tcp://" or "unix://"). - // Also don't try direct path if the user has chosen an alternate name resolver - // (i.e., via ":///" prefix). - // - // TODO(cbro): once gRPC has introspectible options, check the user hasn't - // provided a custom dialer in gRPC options. - if strings.Contains(endpoint, "://") && !strings.HasPrefix(endpoint, "dns:///") { - return false - } - - // Only try direct path if the user has opted in via the environment variable. - whitelist := strings.Split(os.Getenv("GOOGLE_CLOUD_ENABLE_DIRECT_PATH"), ",") - for _, api := range whitelist { - // Ignore empty string since an empty env variable splits into [""] - if api != "" && strings.Contains(endpoint, api) { - return true - } - } - return false -} diff --git a/vendor/google.golang.org/api/transport/grpc/dial_appengine.go b/vendor/google.golang.org/api/transport/grpc/dial_appengine.go deleted file mode 100644 index 87819d4e1..000000000 --- a/vendor/google.golang.org/api/transport/grpc/dial_appengine.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2016 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build appengine - -package grpc - -import ( - "context" - "net" - "time" - - "google.golang.org/appengine" - "google.golang.org/appengine/socket" - "google.golang.org/grpc" -) - -func init() { - // NOTE: dev_appserver doesn't currently support SSL. - // When it does, this code can be removed. - if appengine.IsDevAppServer() { - return - } - - appengineDialerHook = func(ctx context.Context) grpc.DialOption { - return grpc.WithDialer(func(addr string, timeout time.Duration) (net.Conn, error) { - return socket.DialTimeout(ctx, "tcp", addr, timeout) - }) - } -} diff --git a/vendor/google.golang.org/api/transport/grpc/dial_socketopt.go b/vendor/google.golang.org/api/transport/grpc/dial_socketopt.go deleted file mode 100644 index 2b1d9e99b..000000000 --- a/vendor/google.golang.org/api/transport/grpc/dial_socketopt.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build go1.11,linux - -package grpc - -import ( - "context" - "net" - "syscall" - - "golang.org/x/sys/unix" - "google.golang.org/grpc" -) - -const ( - // defaultTCPUserTimeout is the default TCP_USER_TIMEOUT socket option. By - // default is 20 seconds. - tcpUserTimeoutMilliseconds = 20000 -) - -func init() { - // timeoutDialerOption is a grpc.DialOption that contains dialer with - // socket option TCP_USER_TIMEOUT. This dialer requires go versions 1.11+. - timeoutDialerOption = grpc.WithContextDialer(dialTCPUserTimeout) -} - -func dialTCPUserTimeout(ctx context.Context, addr string) (net.Conn, error) { - control := func(network, address string, c syscall.RawConn) error { - var syscallErr error - controlErr := c.Control(func(fd uintptr) { - syscallErr = syscall.SetsockoptInt( - int(fd), syscall.IPPROTO_TCP, unix.TCP_USER_TIMEOUT, tcpUserTimeoutMilliseconds) - }) - if syscallErr != nil { - return syscallErr - } - if controlErr != nil { - return controlErr - } - return nil - } - d := &net.Dialer{ - Control: control, - } - return d.DialContext(ctx, "tcp", addr) -} diff --git a/vendor/google.golang.org/api/transport/http/dial.go b/vendor/google.golang.org/api/transport/http/dial.go deleted file mode 100644 index c0d8bf20b..000000000 --- a/vendor/google.golang.org/api/transport/http/dial.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2015 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package http supports network connections to HTTP servers. -// This package is not intended for use by end developers. Use the -// google.golang.org/api/option package to configure API clients. -package http - -import ( - "context" - "errors" - "net/http" - - "go.opencensus.io/plugin/ochttp" - "golang.org/x/oauth2" - "google.golang.org/api/googleapi/transport" - "google.golang.org/api/internal" - "google.golang.org/api/option" - "google.golang.org/api/transport/http/internal/propagation" -) - -// NewClient returns an HTTP client for use communicating with a Google cloud -// service, configured with the given ClientOptions. It also returns the endpoint -// for the service as specified in the options. -func NewClient(ctx context.Context, opts ...option.ClientOption) (*http.Client, string, error) { - settings, err := newSettings(opts) - if err != nil { - return nil, "", err - } - // TODO(cbro): consider injecting the User-Agent even if an explicit HTTP client is provided? - if settings.HTTPClient != nil { - return settings.HTTPClient, settings.Endpoint, nil - } - trans, err := newTransport(ctx, defaultBaseTransport(ctx), settings) - if err != nil { - return nil, "", err - } - return &http.Client{Transport: trans}, settings.Endpoint, nil -} - -// NewTransport creates an http.RoundTripper for use communicating with a Google -// cloud service, configured with the given ClientOptions. Its RoundTrip method delegates to base. -func NewTransport(ctx context.Context, base http.RoundTripper, opts ...option.ClientOption) (http.RoundTripper, error) { - settings, err := newSettings(opts) - if err != nil { - return nil, err - } - if settings.HTTPClient != nil { - return nil, errors.New("transport/http: WithHTTPClient passed to NewTransport") - } - return newTransport(ctx, base, settings) -} - -func newTransport(ctx context.Context, base http.RoundTripper, settings *internal.DialSettings) (http.RoundTripper, error) { - trans := base - trans = parameterTransport{ - base: trans, - userAgent: settings.UserAgent, - quotaProject: settings.QuotaProject, - requestReason: settings.RequestReason, - } - trans = addOCTransport(trans) - switch { - case settings.NoAuth: - // Do nothing. - case settings.APIKey != "": - trans = &transport.APIKey{ - Transport: trans, - Key: settings.APIKey, - } - default: - creds, err := internal.Creds(ctx, settings) - if err != nil { - return nil, err - } - trans = &oauth2.Transport{ - Base: trans, - Source: creds.TokenSource, - } - } - return trans, nil -} - -func newSettings(opts []option.ClientOption) (*internal.DialSettings, error) { - var o internal.DialSettings - for _, opt := range opts { - opt.Apply(&o) - } - if err := o.Validate(); err != nil { - return nil, err - } - if o.GRPCConn != nil { - return nil, errors.New("unsupported gRPC connection specified") - } - return &o, nil -} - -type parameterTransport struct { - userAgent string - quotaProject string - requestReason string - - base http.RoundTripper -} - -func (t parameterTransport) RoundTrip(req *http.Request) (*http.Response, error) { - rt := t.base - if rt == nil { - return nil, errors.New("transport: no Transport specified") - } - if t.userAgent == "" { - return rt.RoundTrip(req) - } - newReq := *req - newReq.Header = make(http.Header) - for k, vv := range req.Header { - newReq.Header[k] = vv - } - // TODO(cbro): append to existing User-Agent header? - newReq.Header.Set("User-Agent", t.userAgent) - - // Attach system parameters into the header - if t.quotaProject != "" { - newReq.Header.Set("X-Goog-User-Project", t.quotaProject) - } - if t.requestReason != "" { - newReq.Header.Set("X-Goog-Request-Reason", t.requestReason) - } - - return rt.RoundTrip(&newReq) -} - -// Set at init time by dial_appengine.go. If nil, we're not on App Engine. -var appengineUrlfetchHook func(context.Context) http.RoundTripper - -// defaultBaseTransport returns the base HTTP transport. -// On App Engine, this is urlfetch.Transport, otherwise it's http.DefaultTransport. -func defaultBaseTransport(ctx context.Context) http.RoundTripper { - if appengineUrlfetchHook != nil { - return appengineUrlfetchHook(ctx) - } - return http.DefaultTransport -} - -func addOCTransport(trans http.RoundTripper) http.RoundTripper { - return &ochttp.Transport{ - Base: trans, - Propagation: &propagation.HTTPFormat{}, - } -} diff --git a/vendor/google.golang.org/api/transport/http/dial_appengine.go b/vendor/google.golang.org/api/transport/http/dial_appengine.go deleted file mode 100644 index 04c81413c..000000000 --- a/vendor/google.golang.org/api/transport/http/dial_appengine.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2016 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build appengine - -package http - -import ( - "context" - "net/http" - - "google.golang.org/appengine/urlfetch" -) - -func init() { - appengineUrlfetchHook = func(ctx context.Context) http.RoundTripper { - return &urlfetch.Transport{Context: ctx} - } -} diff --git a/vendor/google.golang.org/api/transport/http/internal/propagation/http.go b/vendor/google.golang.org/api/transport/http/internal/propagation/http.go deleted file mode 100644 index 24b4f0d29..000000000 --- a/vendor/google.golang.org/api/transport/http/internal/propagation/http.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build go1.8 - -// Package propagation implements X-Cloud-Trace-Context header propagation used -// by Google Cloud products. -package propagation - -import ( - "encoding/binary" - "encoding/hex" - "fmt" - "net/http" - "strconv" - "strings" - - "go.opencensus.io/trace" - "go.opencensus.io/trace/propagation" -) - -const ( - httpHeaderMaxSize = 200 - httpHeader = `X-Cloud-Trace-Context` -) - -var _ propagation.HTTPFormat = (*HTTPFormat)(nil) - -// HTTPFormat implements propagation.HTTPFormat to propagate -// traces in HTTP headers for Google Cloud Platform and Stackdriver Trace. -type HTTPFormat struct{} - -// SpanContextFromRequest extracts a Stackdriver Trace span context from incoming requests. -func (f *HTTPFormat) SpanContextFromRequest(req *http.Request) (sc trace.SpanContext, ok bool) { - h := req.Header.Get(httpHeader) - // See https://cloud.google.com/trace/docs/faq for the header HTTPFormat. - // Return if the header is empty or missing, or if the header is unreasonably - // large, to avoid making unnecessary copies of a large string. - if h == "" || len(h) > httpHeaderMaxSize { - return trace.SpanContext{}, false - } - - // Parse the trace id field. - slash := strings.Index(h, `/`) - if slash == -1 { - return trace.SpanContext{}, false - } - tid, h := h[:slash], h[slash+1:] - - buf, err := hex.DecodeString(tid) - if err != nil { - return trace.SpanContext{}, false - } - copy(sc.TraceID[:], buf) - - // Parse the span id field. - spanstr := h - semicolon := strings.Index(h, `;`) - if semicolon != -1 { - spanstr, h = h[:semicolon], h[semicolon+1:] - } - sid, err := strconv.ParseUint(spanstr, 10, 64) - if err != nil { - return trace.SpanContext{}, false - } - binary.BigEndian.PutUint64(sc.SpanID[:], sid) - - // Parse the options field, options field is optional. - if !strings.HasPrefix(h, "o=") { - return sc, true - } - o, err := strconv.ParseUint(h[2:], 10, 64) - if err != nil { - return trace.SpanContext{}, false - } - sc.TraceOptions = trace.TraceOptions(o) - return sc, true -} - -// SpanContextToRequest modifies the given request to include a Stackdriver Trace header. -func (f *HTTPFormat) SpanContextToRequest(sc trace.SpanContext, req *http.Request) { - sid := binary.BigEndian.Uint64(sc.SpanID[:]) - header := fmt.Sprintf("%s/%d;o=%d", hex.EncodeToString(sc.TraceID[:]), sid, int64(sc.TraceOptions)) - req.Header.Set(httpHeader, header) -} diff --git a/vendor/google.golang.org/api/transport/not_go19.go b/vendor/google.golang.org/api/transport/not_go19.go deleted file mode 100644 index 0cb627594..000000000 --- a/vendor/google.golang.org/api/transport/not_go19.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build !go1.9 - -package transport - -import ( - "context" - - "golang.org/x/oauth2/google" - "google.golang.org/api/internal" - "google.golang.org/api/option" -) - -// Creds constructs a google.DefaultCredentials from the information in the options, -// or obtains the default credentials in the same way as google.FindDefaultCredentials. -func Creds(ctx context.Context, opts ...option.ClientOption) (*google.DefaultCredentials, error) { - var ds internal.DialSettings - for _, opt := range opts { - opt.Apply(&ds) - } - return internal.Creds(ctx, &ds) -} diff --git a/vendor/google.golang.org/appengine/.travis.yml b/vendor/google.golang.org/appengine/.travis.yml deleted file mode 100644 index 70ffe89d5..000000000 --- a/vendor/google.golang.org/appengine/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -language: go - -go_import_path: google.golang.org/appengine - -install: - - ./travis_install.sh - -script: - - ./travis_test.sh - -matrix: - include: - - go: 1.8.x - env: GOAPP=true - - go: 1.9.x - env: GOAPP=true - - go: 1.10.x - env: GOAPP=false - - go: 1.11.x - env: GO111MODULE=on diff --git a/vendor/google.golang.org/appengine/CONTRIBUTING.md b/vendor/google.golang.org/appengine/CONTRIBUTING.md deleted file mode 100644 index ffc298520..000000000 --- a/vendor/google.golang.org/appengine/CONTRIBUTING.md +++ /dev/null @@ -1,90 +0,0 @@ -# Contributing - -1. Sign one of the contributor license agreements below. -1. Get the package: - - `go get -d google.golang.org/appengine` -1. Change into the checked out source: - - `cd $GOPATH/src/google.golang.org/appengine` -1. Fork the repo. -1. Set your fork as a remote: - - `git remote add fork git@github.com:GITHUB_USERNAME/appengine.git` -1. Make changes, commit to your fork. -1. Send a pull request with your changes. - The first line of your commit message is conventionally a one-line summary of the change, prefixed by the primary affected package, and is used as the title of your pull request. - -# Testing - -## Running system tests - -Download and install the [Go App Engine SDK](https://cloud.google.com/appengine/docs/go/download). Make sure the `go_appengine` dir is in your `PATH`. - -Set the `APPENGINE_DEV_APPSERVER` environment variable to `/path/to/go_appengine/dev_appserver.py`. - -Run tests with `goapp test`: - -``` -goapp test -v google.golang.org/appengine/... -``` - -## Contributor License Agreements - -Before we can accept your pull requests you'll need to sign a Contributor -License Agreement (CLA): - -- **If you are an individual writing original source code** and **you own the -intellectual property**, then you'll need to sign an [individual CLA][indvcla]. -- **If you work for a company that wants to allow you to contribute your work**, -then you'll need to sign a [corporate CLA][corpcla]. - -You can sign these electronically (just scroll to the bottom). After that, -we'll be able to accept your pull requests. - -## Contributor Code of Conduct - -As contributors and maintainers of this project, -and in the interest of fostering an open and welcoming community, -we pledge to respect all people who contribute through reporting issues, -posting feature requests, updating documentation, -submitting pull requests or patches, and other activities. - -We are committed to making participation in this project -a harassment-free experience for everyone, -regardless of level of experience, gender, gender identity and expression, -sexual orientation, disability, personal appearance, -body size, race, ethnicity, age, religion, or nationality. - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery -* Personal attacks -* Trolling or insulting/derogatory comments -* Public or private harassment -* Publishing other's private information, -such as physical or electronic -addresses, without explicit permission -* Other unethical or unprofessional conduct. - -Project maintainers have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions -that are not aligned to this Code of Conduct. -By adopting this Code of Conduct, -project maintainers commit themselves to fairly and consistently -applying these principles to every aspect of managing this project. -Project maintainers who do not follow or enforce the Code of Conduct -may be permanently removed from the project team. - -This code of conduct applies both within project spaces and in public spaces -when an individual is representing the project or its community. - -Instances of abusive, harassing, or otherwise unacceptable behavior -may be reported by opening an issue -or contacting one or more of the project maintainers. - -This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, -available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/) - -[indvcla]: https://developers.google.com/open-source/cla/individual -[corpcla]: https://developers.google.com/open-source/cla/corporate diff --git a/vendor/google.golang.org/appengine/LICENSE b/vendor/google.golang.org/appengine/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/vendor/google.golang.org/appengine/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/google.golang.org/appengine/README.md b/vendor/google.golang.org/appengine/README.md deleted file mode 100644 index 9fdbacd3c..000000000 --- a/vendor/google.golang.org/appengine/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# Go App Engine packages - -[![Build Status](https://travis-ci.org/golang/appengine.svg)](https://travis-ci.org/golang/appengine) - -This repository supports the Go runtime on *App Engine standard*. -It provides APIs for interacting with App Engine services. -Its canonical import path is `google.golang.org/appengine`. - -See https://cloud.google.com/appengine/docs/go/ -for more information. - -File issue reports and feature requests on the [GitHub's issue -tracker](https://github.com/golang/appengine/issues). - -## Upgrading an App Engine app to the flexible environment - -This package does not work on *App Engine flexible*. - -There are many differences between the App Engine standard environment and -the flexible environment. - -See the [documentation on upgrading to the flexible environment](https://cloud.google.com/appengine/docs/flexible/go/upgrading). - -## Directory structure - -The top level directory of this repository is the `appengine` package. It -contains the -basic APIs (e.g. `appengine.NewContext`) that apply across APIs. Specific API -packages are in subdirectories (e.g. `datastore`). - -There is an `internal` subdirectory that contains service protocol buffers, -plus packages required for connectivity to make API calls. App Engine apps -should not directly import any package under `internal`. - -## Updating from legacy (`import "appengine"`) packages - -If you're currently using the bare `appengine` packages -(that is, not these ones, imported via `google.golang.org/appengine`), -then you can use the `aefix` tool to help automate an upgrade to these packages. - -Run `go get google.golang.org/appengine/cmd/aefix` to install it. - -### 1. Update import paths - -The import paths for App Engine packages are now fully qualified, based at `google.golang.org/appengine`. -You will need to update your code to use import paths starting with that; for instance, -code importing `appengine/datastore` will now need to import `google.golang.org/appengine/datastore`. - -### 2. Update code using deprecated, removed or modified APIs - -Most App Engine services are available with exactly the same API. -A few APIs were cleaned up, and there are some differences: - -* `appengine.Context` has been replaced with the `Context` type from `golang.org/x/net/context`. -* Logging methods that were on `appengine.Context` are now functions in `google.golang.org/appengine/log`. -* `appengine.Timeout` has been removed. Use `context.WithTimeout` instead. -* `appengine.Datacenter` now takes a `context.Context` argument. -* `datastore.PropertyLoadSaver` has been simplified to use slices in place of channels. -* `delay.Call` now returns an error. -* `search.FieldLoadSaver` now handles document metadata. -* `urlfetch.Transport` no longer has a Deadline field; set a deadline on the - `context.Context` instead. -* `aetest` no longer declares its own Context type, and uses the standard one instead. -* `taskqueue.QueueStats` no longer takes a maxTasks argument. That argument has been - deprecated and unused for a long time. -* `appengine.BackendHostname` and `appengine.BackendInstance` were for the deprecated backends feature. - Use `appengine.ModuleHostname`and `appengine.ModuleName` instead. -* Most of `appengine/file` and parts of `appengine/blobstore` are deprecated. - Use [Google Cloud Storage](https://godoc.org/cloud.google.com/go/storage) if the - feature you require is not present in the new - [blobstore package](https://google.golang.org/appengine/blobstore). -* `appengine/socket` is not required on App Engine flexible environment / Managed VMs. - Use the standard `net` package instead. - -## Key Encode/Decode compatibiltiy to help with datastore library migrations - -Key compatibility updates have been added to help customers transition from google.golang.org/appengine/datastore to cloud.google.com/go/datastore. -The `EnableKeyConversion` enables automatic conversion from a key encoded with cloud.google.com/go/datastore to google.golang.org/appengine/datastore key type. - -### Enabling key conversion - -Enable key conversion by calling `EnableKeyConversion(ctx)` in the `/_ah/start` handler for basic and manual scaling or any handler in automatic scaling. - -#### 1. Basic or manual scaling - -This start handler will enable key conversion for all handlers in the service. - -``` -http.HandleFunc("/_ah/start", func(w http.ResponseWriter, r *http.Request) { - datastore.EnableKeyConversion(appengine.NewContext(r)) -}) -``` - -#### 2. Automatic scaling - -`/_ah/start` is not supported for automatic scaling and `/_ah/warmup` is not guaranteed to run, so you must call `datastore.EnableKeyConversion(appengine.NewContext(r))` -before you use code that needs key conversion. - -You may want to add this to each of your handlers, or introduce middleware where it's called. -`EnableKeyConversion` is safe for concurrent use. Any call to it after the first is ignored. \ No newline at end of file diff --git a/vendor/google.golang.org/appengine/appengine.go b/vendor/google.golang.org/appengine/appengine.go deleted file mode 100644 index 8c9697674..000000000 --- a/vendor/google.golang.org/appengine/appengine.go +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// Package appengine provides basic functionality for Google App Engine. -// -// For more information on how to write Go apps for Google App Engine, see: -// https://cloud.google.com/appengine/docs/go/ -package appengine // import "google.golang.org/appengine" - -import ( - "net/http" - - "github.com/golang/protobuf/proto" - "golang.org/x/net/context" - - "google.golang.org/appengine/internal" -) - -// The gophers party all night; the rabbits provide the beats. - -// Main is the principal entry point for an app running in App Engine. -// -// On App Engine Flexible it installs a trivial health checker if one isn't -// already registered, and starts listening on port 8080 (overridden by the -// $PORT environment variable). -// -// See https://cloud.google.com/appengine/docs/flexible/custom-runtimes#health_check_requests -// for details on how to do your own health checking. -// -// On App Engine Standard it ensures the server has started and is prepared to -// receive requests. -// -// Main never returns. -// -// Main is designed so that the app's main package looks like this: -// -// package main -// -// import ( -// "google.golang.org/appengine" -// -// _ "myapp/package0" -// _ "myapp/package1" -// ) -// -// func main() { -// appengine.Main() -// } -// -// The "myapp/packageX" packages are expected to register HTTP handlers -// in their init functions. -func Main() { - internal.Main() -} - -// IsDevAppServer reports whether the App Engine app is running in the -// development App Server. -func IsDevAppServer() bool { - return internal.IsDevAppServer() -} - -// IsStandard reports whether the App Engine app is running in the standard -// environment. This includes both the first generation runtimes (<= Go 1.9) -// and the second generation runtimes (>= Go 1.11). -func IsStandard() bool { - return internal.IsStandard() -} - -// IsFlex reports whether the App Engine app is running in the flexible environment. -func IsFlex() bool { - return internal.IsFlex() -} - -// IsAppEngine reports whether the App Engine app is running on App Engine, in either -// the standard or flexible environment. -func IsAppEngine() bool { - return internal.IsAppEngine() -} - -// IsSecondGen reports whether the App Engine app is running on the second generation -// runtimes (>= Go 1.11). -func IsSecondGen() bool { - return internal.IsSecondGen() -} - -// NewContext returns a context for an in-flight HTTP request. -// This function is cheap. -func NewContext(req *http.Request) context.Context { - return internal.ReqContext(req) -} - -// WithContext returns a copy of the parent context -// and associates it with an in-flight HTTP request. -// This function is cheap. -func WithContext(parent context.Context, req *http.Request) context.Context { - return internal.WithContext(parent, req) -} - -// BlobKey is a key for a blobstore blob. -// -// Conceptually, this type belongs in the blobstore package, but it lives in -// the appengine package to avoid a circular dependency: blobstore depends on -// datastore, and datastore needs to refer to the BlobKey type. -type BlobKey string - -// GeoPoint represents a location as latitude/longitude in degrees. -type GeoPoint struct { - Lat, Lng float64 -} - -// Valid returns whether a GeoPoint is within [-90, 90] latitude and [-180, 180] longitude. -func (g GeoPoint) Valid() bool { - return -90 <= g.Lat && g.Lat <= 90 && -180 <= g.Lng && g.Lng <= 180 -} - -// APICallFunc defines a function type for handling an API call. -// See WithCallOverride. -type APICallFunc func(ctx context.Context, service, method string, in, out proto.Message) error - -// WithAPICallFunc returns a copy of the parent context -// that will cause API calls to invoke f instead of their normal operation. -// -// This is intended for advanced users only. -func WithAPICallFunc(ctx context.Context, f APICallFunc) context.Context { - return internal.WithCallOverride(ctx, internal.CallOverrideFunc(f)) -} - -// APICall performs an API call. -// -// This is not intended for general use; it is exported for use in conjunction -// with WithAPICallFunc. -func APICall(ctx context.Context, service, method string, in, out proto.Message) error { - return internal.Call(ctx, service, method, in, out) -} diff --git a/vendor/google.golang.org/appengine/appengine_vm.go b/vendor/google.golang.org/appengine/appengine_vm.go deleted file mode 100644 index f4b645aad..000000000 --- a/vendor/google.golang.org/appengine/appengine_vm.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// +build !appengine - -package appengine - -import ( - "golang.org/x/net/context" - - "google.golang.org/appengine/internal" -) - -// BackgroundContext returns a context not associated with a request. -// This should only be used when not servicing a request. -// This only works in App Engine "flexible environment". -func BackgroundContext() context.Context { - return internal.BackgroundContext() -} diff --git a/vendor/google.golang.org/appengine/errors.go b/vendor/google.golang.org/appengine/errors.go deleted file mode 100644 index 16d0772e2..000000000 --- a/vendor/google.golang.org/appengine/errors.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// This file provides error functions for common API failure modes. - -package appengine - -import ( - "fmt" - - "google.golang.org/appengine/internal" -) - -// IsOverQuota reports whether err represents an API call failure -// due to insufficient available quota. -func IsOverQuota(err error) bool { - callErr, ok := err.(*internal.CallError) - return ok && callErr.Code == 4 -} - -// MultiError is returned by batch operations when there are errors with -// particular elements. Errors will be in a one-to-one correspondence with -// the input elements; successful elements will have a nil entry. -type MultiError []error - -func (m MultiError) Error() string { - s, n := "", 0 - for _, e := range m { - if e != nil { - if n == 0 { - s = e.Error() - } - n++ - } - } - switch n { - case 0: - return "(0 errors)" - case 1: - return s - case 2: - return s + " (and 1 other error)" - } - return fmt.Sprintf("%s (and %d other errors)", s, n-1) -} diff --git a/vendor/google.golang.org/appengine/go.mod b/vendor/google.golang.org/appengine/go.mod deleted file mode 100644 index 451592798..000000000 --- a/vendor/google.golang.org/appengine/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module google.golang.org/appengine - -require ( - github.com/golang/protobuf v1.3.1 - golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 // indirect - golang.org/x/net v0.0.0-20190603091049-60506f45cf65 - golang.org/x/sys v0.0.0-20190606165138-5da285871e9c // indirect - golang.org/x/text v0.3.2 - golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b // indirect -) diff --git a/vendor/google.golang.org/appengine/go.sum b/vendor/google.golang.org/appengine/go.sum deleted file mode 100644 index cb3232556..000000000 --- a/vendor/google.golang.org/appengine/go.sum +++ /dev/null @@ -1,22 +0,0 @@ -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225 h1:kNX+jCowfMYzvlSvJu5pQWEmyWFrBXJ3PBy10xKMXK8= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= diff --git a/vendor/google.golang.org/appengine/identity.go b/vendor/google.golang.org/appengine/identity.go deleted file mode 100644 index b8dcf8f36..000000000 --- a/vendor/google.golang.org/appengine/identity.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package appengine - -import ( - "time" - - "golang.org/x/net/context" - - "google.golang.org/appengine/internal" - pb "google.golang.org/appengine/internal/app_identity" - modpb "google.golang.org/appengine/internal/modules" -) - -// AppID returns the application ID for the current application. -// The string will be a plain application ID (e.g. "appid"), with a -// domain prefix for custom domain deployments (e.g. "example.com:appid"). -func AppID(c context.Context) string { return internal.AppID(c) } - -// DefaultVersionHostname returns the standard hostname of the default version -// of the current application (e.g. "my-app.appspot.com"). This is suitable for -// use in constructing URLs. -func DefaultVersionHostname(c context.Context) string { - return internal.DefaultVersionHostname(c) -} - -// ModuleName returns the module name of the current instance. -func ModuleName(c context.Context) string { - return internal.ModuleName(c) -} - -// ModuleHostname returns a hostname of a module instance. -// If module is the empty string, it refers to the module of the current instance. -// If version is empty, it refers to the version of the current instance if valid, -// or the default version of the module of the current instance. -// If instance is empty, ModuleHostname returns the load-balancing hostname. -func ModuleHostname(c context.Context, module, version, instance string) (string, error) { - req := &modpb.GetHostnameRequest{} - if module != "" { - req.Module = &module - } - if version != "" { - req.Version = &version - } - if instance != "" { - req.Instance = &instance - } - res := &modpb.GetHostnameResponse{} - if err := internal.Call(c, "modules", "GetHostname", req, res); err != nil { - return "", err - } - return *res.Hostname, nil -} - -// VersionID returns the version ID for the current application. -// It will be of the form "X.Y", where X is specified in app.yaml, -// and Y is a number generated when each version of the app is uploaded. -// It does not include a module name. -func VersionID(c context.Context) string { return internal.VersionID(c) } - -// InstanceID returns a mostly-unique identifier for this instance. -func InstanceID() string { return internal.InstanceID() } - -// Datacenter returns an identifier for the datacenter that the instance is running in. -func Datacenter(c context.Context) string { return internal.Datacenter(c) } - -// ServerSoftware returns the App Engine release version. -// In production, it looks like "Google App Engine/X.Y.Z". -// In the development appserver, it looks like "Development/X.Y". -func ServerSoftware() string { return internal.ServerSoftware() } - -// RequestID returns a string that uniquely identifies the request. -func RequestID(c context.Context) string { return internal.RequestID(c) } - -// AccessToken generates an OAuth2 access token for the specified scopes on -// behalf of service account of this application. This token will expire after -// the returned time. -func AccessToken(c context.Context, scopes ...string) (token string, expiry time.Time, err error) { - req := &pb.GetAccessTokenRequest{Scope: scopes} - res := &pb.GetAccessTokenResponse{} - - err = internal.Call(c, "app_identity_service", "GetAccessToken", req, res) - if err != nil { - return "", time.Time{}, err - } - return res.GetAccessToken(), time.Unix(res.GetExpirationTime(), 0), nil -} - -// Certificate represents a public certificate for the app. -type Certificate struct { - KeyName string - Data []byte // PEM-encoded X.509 certificate -} - -// PublicCertificates retrieves the public certificates for the app. -// They can be used to verify a signature returned by SignBytes. -func PublicCertificates(c context.Context) ([]Certificate, error) { - req := &pb.GetPublicCertificateForAppRequest{} - res := &pb.GetPublicCertificateForAppResponse{} - if err := internal.Call(c, "app_identity_service", "GetPublicCertificatesForApp", req, res); err != nil { - return nil, err - } - var cs []Certificate - for _, pc := range res.PublicCertificateList { - cs = append(cs, Certificate{ - KeyName: pc.GetKeyName(), - Data: []byte(pc.GetX509CertificatePem()), - }) - } - return cs, nil -} - -// ServiceAccount returns a string representing the service account name, in -// the form of an email address (typically app_id@appspot.gserviceaccount.com). -func ServiceAccount(c context.Context) (string, error) { - req := &pb.GetServiceAccountNameRequest{} - res := &pb.GetServiceAccountNameResponse{} - - err := internal.Call(c, "app_identity_service", "GetServiceAccountName", req, res) - if err != nil { - return "", err - } - return res.GetServiceAccountName(), err -} - -// SignBytes signs bytes using a private key unique to your application. -func SignBytes(c context.Context, bytes []byte) (keyName string, signature []byte, err error) { - req := &pb.SignForAppRequest{BytesToSign: bytes} - res := &pb.SignForAppResponse{} - - if err := internal.Call(c, "app_identity_service", "SignForApp", req, res); err != nil { - return "", nil, err - } - return res.GetKeyName(), res.GetSignatureBytes(), nil -} - -func init() { - internal.RegisterErrorCodeMap("app_identity_service", pb.AppIdentityServiceError_ErrorCode_name) - internal.RegisterErrorCodeMap("modules", modpb.ModulesServiceError_ErrorCode_name) -} diff --git a/vendor/google.golang.org/appengine/internal/api.go b/vendor/google.golang.org/appengine/internal/api.go deleted file mode 100644 index a6ec19e14..000000000 --- a/vendor/google.golang.org/appengine/internal/api.go +++ /dev/null @@ -1,675 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// +build !appengine - -package internal - -import ( - "bytes" - "errors" - "fmt" - "io/ioutil" - "log" - "net" - "net/http" - "net/url" - "os" - "runtime" - "strconv" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/golang/protobuf/proto" - netcontext "golang.org/x/net/context" - - basepb "google.golang.org/appengine/internal/base" - logpb "google.golang.org/appengine/internal/log" - remotepb "google.golang.org/appengine/internal/remote_api" -) - -const ( - apiPath = "/rpc_http" - defaultTicketSuffix = "/default.20150612t184001.0" -) - -var ( - // Incoming headers. - ticketHeader = http.CanonicalHeaderKey("X-AppEngine-API-Ticket") - dapperHeader = http.CanonicalHeaderKey("X-Google-DapperTraceInfo") - traceHeader = http.CanonicalHeaderKey("X-Cloud-Trace-Context") - curNamespaceHeader = http.CanonicalHeaderKey("X-AppEngine-Current-Namespace") - userIPHeader = http.CanonicalHeaderKey("X-AppEngine-User-IP") - remoteAddrHeader = http.CanonicalHeaderKey("X-AppEngine-Remote-Addr") - devRequestIdHeader = http.CanonicalHeaderKey("X-Appengine-Dev-Request-Id") - - // Outgoing headers. - apiEndpointHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Endpoint") - apiEndpointHeaderValue = []string{"app-engine-apis"} - apiMethodHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Method") - apiMethodHeaderValue = []string{"/VMRemoteAPI.CallRemoteAPI"} - apiDeadlineHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Deadline") - apiContentType = http.CanonicalHeaderKey("Content-Type") - apiContentTypeValue = []string{"application/octet-stream"} - logFlushHeader = http.CanonicalHeaderKey("X-AppEngine-Log-Flush-Count") - - apiHTTPClient = &http.Client{ - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: limitDial, - }, - } - - defaultTicketOnce sync.Once - defaultTicket string - backgroundContextOnce sync.Once - backgroundContext netcontext.Context -) - -func apiURL() *url.URL { - host, port := "appengine.googleapis.internal", "10001" - if h := os.Getenv("API_HOST"); h != "" { - host = h - } - if p := os.Getenv("API_PORT"); p != "" { - port = p - } - return &url.URL{ - Scheme: "http", - Host: host + ":" + port, - Path: apiPath, - } -} - -func handleHTTP(w http.ResponseWriter, r *http.Request) { - c := &context{ - req: r, - outHeader: w.Header(), - apiURL: apiURL(), - } - r = r.WithContext(withContext(r.Context(), c)) - c.req = r - - stopFlushing := make(chan int) - - // Patch up RemoteAddr so it looks reasonable. - if addr := r.Header.Get(userIPHeader); addr != "" { - r.RemoteAddr = addr - } else if addr = r.Header.Get(remoteAddrHeader); addr != "" { - r.RemoteAddr = addr - } else { - // Should not normally reach here, but pick a sensible default anyway. - r.RemoteAddr = "127.0.0.1" - } - // The address in the headers will most likely be of these forms: - // 123.123.123.123 - // 2001:db8::1 - // net/http.Request.RemoteAddr is specified to be in "IP:port" form. - if _, _, err := net.SplitHostPort(r.RemoteAddr); err != nil { - // Assume the remote address is only a host; add a default port. - r.RemoteAddr = net.JoinHostPort(r.RemoteAddr, "80") - } - - // Start goroutine responsible for flushing app logs. - // This is done after adding c to ctx.m (and stopped before removing it) - // because flushing logs requires making an API call. - go c.logFlusher(stopFlushing) - - executeRequestSafely(c, r) - c.outHeader = nil // make sure header changes aren't respected any more - - stopFlushing <- 1 // any logging beyond this point will be dropped - - // Flush any pending logs asynchronously. - c.pendingLogs.Lock() - flushes := c.pendingLogs.flushes - if len(c.pendingLogs.lines) > 0 { - flushes++ - } - c.pendingLogs.Unlock() - flushed := make(chan struct{}) - go func() { - defer close(flushed) - // Force a log flush, because with very short requests we - // may not ever flush logs. - c.flushLog(true) - }() - w.Header().Set(logFlushHeader, strconv.Itoa(flushes)) - - // Avoid nil Write call if c.Write is never called. - if c.outCode != 0 { - w.WriteHeader(c.outCode) - } - if c.outBody != nil { - w.Write(c.outBody) - } - // Wait for the last flush to complete before returning, - // otherwise the security ticket will not be valid. - <-flushed -} - -func executeRequestSafely(c *context, r *http.Request) { - defer func() { - if x := recover(); x != nil { - logf(c, 4, "%s", renderPanic(x)) // 4 == critical - c.outCode = 500 - } - }() - - http.DefaultServeMux.ServeHTTP(c, r) -} - -func renderPanic(x interface{}) string { - buf := make([]byte, 16<<10) // 16 KB should be plenty - buf = buf[:runtime.Stack(buf, false)] - - // Remove the first few stack frames: - // this func - // the recover closure in the caller - // That will root the stack trace at the site of the panic. - const ( - skipStart = "internal.renderPanic" - skipFrames = 2 - ) - start := bytes.Index(buf, []byte(skipStart)) - p := start - for i := 0; i < skipFrames*2 && p+1 < len(buf); i++ { - p = bytes.IndexByte(buf[p+1:], '\n') + p + 1 - if p < 0 { - break - } - } - if p >= 0 { - // buf[start:p+1] is the block to remove. - // Copy buf[p+1:] over buf[start:] and shrink buf. - copy(buf[start:], buf[p+1:]) - buf = buf[:len(buf)-(p+1-start)] - } - - // Add panic heading. - head := fmt.Sprintf("panic: %v\n\n", x) - if len(head) > len(buf) { - // Extremely unlikely to happen. - return head - } - copy(buf[len(head):], buf) - copy(buf, head) - - return string(buf) -} - -// context represents the context of an in-flight HTTP request. -// It implements the appengine.Context and http.ResponseWriter interfaces. -type context struct { - req *http.Request - - outCode int - outHeader http.Header - outBody []byte - - pendingLogs struct { - sync.Mutex - lines []*logpb.UserAppLogLine - flushes int - } - - apiURL *url.URL -} - -var contextKey = "holds a *context" - -// jointContext joins two contexts in a superficial way. -// It takes values and timeouts from a base context, and only values from another context. -type jointContext struct { - base netcontext.Context - valuesOnly netcontext.Context -} - -func (c jointContext) Deadline() (time.Time, bool) { - return c.base.Deadline() -} - -func (c jointContext) Done() <-chan struct{} { - return c.base.Done() -} - -func (c jointContext) Err() error { - return c.base.Err() -} - -func (c jointContext) Value(key interface{}) interface{} { - if val := c.base.Value(key); val != nil { - return val - } - return c.valuesOnly.Value(key) -} - -// fromContext returns the App Engine context or nil if ctx is not -// derived from an App Engine context. -func fromContext(ctx netcontext.Context) *context { - c, _ := ctx.Value(&contextKey).(*context) - return c -} - -func withContext(parent netcontext.Context, c *context) netcontext.Context { - ctx := netcontext.WithValue(parent, &contextKey, c) - if ns := c.req.Header.Get(curNamespaceHeader); ns != "" { - ctx = withNamespace(ctx, ns) - } - return ctx -} - -func toContext(c *context) netcontext.Context { - return withContext(netcontext.Background(), c) -} - -func IncomingHeaders(ctx netcontext.Context) http.Header { - if c := fromContext(ctx); c != nil { - return c.req.Header - } - return nil -} - -func ReqContext(req *http.Request) netcontext.Context { - return req.Context() -} - -func WithContext(parent netcontext.Context, req *http.Request) netcontext.Context { - return jointContext{ - base: parent, - valuesOnly: req.Context(), - } -} - -// DefaultTicket returns a ticket used for background context or dev_appserver. -func DefaultTicket() string { - defaultTicketOnce.Do(func() { - if IsDevAppServer() { - defaultTicket = "testapp" + defaultTicketSuffix - return - } - appID := partitionlessAppID() - escAppID := strings.Replace(strings.Replace(appID, ":", "_", -1), ".", "_", -1) - majVersion := VersionID(nil) - if i := strings.Index(majVersion, "."); i > 0 { - majVersion = majVersion[:i] - } - defaultTicket = fmt.Sprintf("%s/%s.%s.%s", escAppID, ModuleName(nil), majVersion, InstanceID()) - }) - return defaultTicket -} - -func BackgroundContext() netcontext.Context { - backgroundContextOnce.Do(func() { - // Compute background security ticket. - ticket := DefaultTicket() - - c := &context{ - req: &http.Request{ - Header: http.Header{ - ticketHeader: []string{ticket}, - }, - }, - apiURL: apiURL(), - } - backgroundContext = toContext(c) - - // TODO(dsymonds): Wire up the shutdown handler to do a final flush. - go c.logFlusher(make(chan int)) - }) - - return backgroundContext -} - -// RegisterTestRequest registers the HTTP request req for testing, such that -// any API calls are sent to the provided URL. It returns a closure to delete -// the registration. -// It should only be used by aetest package. -func RegisterTestRequest(req *http.Request, apiURL *url.URL, decorate func(netcontext.Context) netcontext.Context) (*http.Request, func()) { - c := &context{ - req: req, - apiURL: apiURL, - } - ctx := withContext(decorate(req.Context()), c) - req = req.WithContext(ctx) - c.req = req - return req, func() {} -} - -var errTimeout = &CallError{ - Detail: "Deadline exceeded", - Code: int32(remotepb.RpcError_CANCELLED), - Timeout: true, -} - -func (c *context) Header() http.Header { return c.outHeader } - -// Copied from $GOROOT/src/pkg/net/http/transfer.go. Some response status -// codes do not permit a response body (nor response entity headers such as -// Content-Length, Content-Type, etc). -func bodyAllowedForStatus(status int) bool { - switch { - case status >= 100 && status <= 199: - return false - case status == 204: - return false - case status == 304: - return false - } - return true -} - -func (c *context) Write(b []byte) (int, error) { - if c.outCode == 0 { - c.WriteHeader(http.StatusOK) - } - if len(b) > 0 && !bodyAllowedForStatus(c.outCode) { - return 0, http.ErrBodyNotAllowed - } - c.outBody = append(c.outBody, b...) - return len(b), nil -} - -func (c *context) WriteHeader(code int) { - if c.outCode != 0 { - logf(c, 3, "WriteHeader called multiple times on request.") // error level - return - } - c.outCode = code -} - -func (c *context) post(body []byte, timeout time.Duration) (b []byte, err error) { - hreq := &http.Request{ - Method: "POST", - URL: c.apiURL, - Header: http.Header{ - apiEndpointHeader: apiEndpointHeaderValue, - apiMethodHeader: apiMethodHeaderValue, - apiContentType: apiContentTypeValue, - apiDeadlineHeader: []string{strconv.FormatFloat(timeout.Seconds(), 'f', -1, 64)}, - }, - Body: ioutil.NopCloser(bytes.NewReader(body)), - ContentLength: int64(len(body)), - Host: c.apiURL.Host, - } - if info := c.req.Header.Get(dapperHeader); info != "" { - hreq.Header.Set(dapperHeader, info) - } - if info := c.req.Header.Get(traceHeader); info != "" { - hreq.Header.Set(traceHeader, info) - } - - tr := apiHTTPClient.Transport.(*http.Transport) - - var timedOut int32 // atomic; set to 1 if timed out - t := time.AfterFunc(timeout, func() { - atomic.StoreInt32(&timedOut, 1) - tr.CancelRequest(hreq) - }) - defer t.Stop() - defer func() { - // Check if timeout was exceeded. - if atomic.LoadInt32(&timedOut) != 0 { - err = errTimeout - } - }() - - hresp, err := apiHTTPClient.Do(hreq) - if err != nil { - return nil, &CallError{ - Detail: fmt.Sprintf("service bridge HTTP failed: %v", err), - Code: int32(remotepb.RpcError_UNKNOWN), - } - } - defer hresp.Body.Close() - hrespBody, err := ioutil.ReadAll(hresp.Body) - if hresp.StatusCode != 200 { - return nil, &CallError{ - Detail: fmt.Sprintf("service bridge returned HTTP %d (%q)", hresp.StatusCode, hrespBody), - Code: int32(remotepb.RpcError_UNKNOWN), - } - } - if err != nil { - return nil, &CallError{ - Detail: fmt.Sprintf("service bridge response bad: %v", err), - Code: int32(remotepb.RpcError_UNKNOWN), - } - } - return hrespBody, nil -} - -func Call(ctx netcontext.Context, service, method string, in, out proto.Message) error { - if ns := NamespaceFromContext(ctx); ns != "" { - if fn, ok := NamespaceMods[service]; ok { - fn(in, ns) - } - } - - if f, ctx, ok := callOverrideFromContext(ctx); ok { - return f(ctx, service, method, in, out) - } - - // Handle already-done contexts quickly. - select { - case <-ctx.Done(): - return ctx.Err() - default: - } - - c := fromContext(ctx) - if c == nil { - // Give a good error message rather than a panic lower down. - return errNotAppEngineContext - } - - // Apply transaction modifications if we're in a transaction. - if t := transactionFromContext(ctx); t != nil { - if t.finished { - return errors.New("transaction context has expired") - } - applyTransaction(in, &t.transaction) - } - - // Default RPC timeout is 60s. - timeout := 60 * time.Second - if deadline, ok := ctx.Deadline(); ok { - timeout = deadline.Sub(time.Now()) - } - - data, err := proto.Marshal(in) - if err != nil { - return err - } - - ticket := c.req.Header.Get(ticketHeader) - // Use a test ticket under test environment. - if ticket == "" { - if appid := ctx.Value(&appIDOverrideKey); appid != nil { - ticket = appid.(string) + defaultTicketSuffix - } - } - // Fall back to use background ticket when the request ticket is not available in Flex or dev_appserver. - if ticket == "" { - ticket = DefaultTicket() - } - if dri := c.req.Header.Get(devRequestIdHeader); IsDevAppServer() && dri != "" { - ticket = dri - } - req := &remotepb.Request{ - ServiceName: &service, - Method: &method, - Request: data, - RequestId: &ticket, - } - hreqBody, err := proto.Marshal(req) - if err != nil { - return err - } - - hrespBody, err := c.post(hreqBody, timeout) - if err != nil { - return err - } - - res := &remotepb.Response{} - if err := proto.Unmarshal(hrespBody, res); err != nil { - return err - } - if res.RpcError != nil { - ce := &CallError{ - Detail: res.RpcError.GetDetail(), - Code: *res.RpcError.Code, - } - switch remotepb.RpcError_ErrorCode(ce.Code) { - case remotepb.RpcError_CANCELLED, remotepb.RpcError_DEADLINE_EXCEEDED: - ce.Timeout = true - } - return ce - } - if res.ApplicationError != nil { - return &APIError{ - Service: *req.ServiceName, - Detail: res.ApplicationError.GetDetail(), - Code: *res.ApplicationError.Code, - } - } - if res.Exception != nil || res.JavaException != nil { - // This shouldn't happen, but let's be defensive. - return &CallError{ - Detail: "service bridge returned exception", - Code: int32(remotepb.RpcError_UNKNOWN), - } - } - return proto.Unmarshal(res.Response, out) -} - -func (c *context) Request() *http.Request { - return c.req -} - -func (c *context) addLogLine(ll *logpb.UserAppLogLine) { - // Truncate long log lines. - // TODO(dsymonds): Check if this is still necessary. - const lim = 8 << 10 - if len(*ll.Message) > lim { - suffix := fmt.Sprintf("...(length %d)", len(*ll.Message)) - ll.Message = proto.String((*ll.Message)[:lim-len(suffix)] + suffix) - } - - c.pendingLogs.Lock() - c.pendingLogs.lines = append(c.pendingLogs.lines, ll) - c.pendingLogs.Unlock() -} - -var logLevelName = map[int64]string{ - 0: "DEBUG", - 1: "INFO", - 2: "WARNING", - 3: "ERROR", - 4: "CRITICAL", -} - -func logf(c *context, level int64, format string, args ...interface{}) { - if c == nil { - panic("not an App Engine context") - } - s := fmt.Sprintf(format, args...) - s = strings.TrimRight(s, "\n") // Remove any trailing newline characters. - c.addLogLine(&logpb.UserAppLogLine{ - TimestampUsec: proto.Int64(time.Now().UnixNano() / 1e3), - Level: &level, - Message: &s, - }) - // Only duplicate log to stderr if not running on App Engine second generation - if !IsSecondGen() { - log.Print(logLevelName[level] + ": " + s) - } -} - -// flushLog attempts to flush any pending logs to the appserver. -// It should not be called concurrently. -func (c *context) flushLog(force bool) (flushed bool) { - c.pendingLogs.Lock() - // Grab up to 30 MB. We can get away with up to 32 MB, but let's be cautious. - n, rem := 0, 30<<20 - for ; n < len(c.pendingLogs.lines); n++ { - ll := c.pendingLogs.lines[n] - // Each log line will require about 3 bytes of overhead. - nb := proto.Size(ll) + 3 - if nb > rem { - break - } - rem -= nb - } - lines := c.pendingLogs.lines[:n] - c.pendingLogs.lines = c.pendingLogs.lines[n:] - c.pendingLogs.Unlock() - - if len(lines) == 0 && !force { - // Nothing to flush. - return false - } - - rescueLogs := false - defer func() { - if rescueLogs { - c.pendingLogs.Lock() - c.pendingLogs.lines = append(lines, c.pendingLogs.lines...) - c.pendingLogs.Unlock() - } - }() - - buf, err := proto.Marshal(&logpb.UserAppLogGroup{ - LogLine: lines, - }) - if err != nil { - log.Printf("internal.flushLog: marshaling UserAppLogGroup: %v", err) - rescueLogs = true - return false - } - - req := &logpb.FlushRequest{ - Logs: buf, - } - res := &basepb.VoidProto{} - c.pendingLogs.Lock() - c.pendingLogs.flushes++ - c.pendingLogs.Unlock() - if err := Call(toContext(c), "logservice", "Flush", req, res); err != nil { - log.Printf("internal.flushLog: Flush RPC: %v", err) - rescueLogs = true - return false - } - return true -} - -const ( - // Log flushing parameters. - flushInterval = 1 * time.Second - forceFlushInterval = 60 * time.Second -) - -func (c *context) logFlusher(stop <-chan int) { - lastFlush := time.Now() - tick := time.NewTicker(flushInterval) - for { - select { - case <-stop: - // Request finished. - tick.Stop() - return - case <-tick.C: - force := time.Now().Sub(lastFlush) > forceFlushInterval - if c.flushLog(force) { - lastFlush = time.Now() - } - } - } -} - -func ContextForTesting(req *http.Request) netcontext.Context { - return toContext(&context{req: req}) -} diff --git a/vendor/google.golang.org/appengine/internal/api_classic.go b/vendor/google.golang.org/appengine/internal/api_classic.go deleted file mode 100644 index f0f40b2e3..000000000 --- a/vendor/google.golang.org/appengine/internal/api_classic.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// +build appengine - -package internal - -import ( - "errors" - "fmt" - "net/http" - "time" - - "appengine" - "appengine_internal" - basepb "appengine_internal/base" - - "github.com/golang/protobuf/proto" - netcontext "golang.org/x/net/context" -) - -var contextKey = "holds an appengine.Context" - -// fromContext returns the App Engine context or nil if ctx is not -// derived from an App Engine context. -func fromContext(ctx netcontext.Context) appengine.Context { - c, _ := ctx.Value(&contextKey).(appengine.Context) - return c -} - -// This is only for classic App Engine adapters. -func ClassicContextFromContext(ctx netcontext.Context) (appengine.Context, error) { - c := fromContext(ctx) - if c == nil { - return nil, errNotAppEngineContext - } - return c, nil -} - -func withContext(parent netcontext.Context, c appengine.Context) netcontext.Context { - ctx := netcontext.WithValue(parent, &contextKey, c) - - s := &basepb.StringProto{} - c.Call("__go__", "GetNamespace", &basepb.VoidProto{}, s, nil) - if ns := s.GetValue(); ns != "" { - ctx = NamespacedContext(ctx, ns) - } - - return ctx -} - -func IncomingHeaders(ctx netcontext.Context) http.Header { - if c := fromContext(ctx); c != nil { - if req, ok := c.Request().(*http.Request); ok { - return req.Header - } - } - return nil -} - -func ReqContext(req *http.Request) netcontext.Context { - return WithContext(netcontext.Background(), req) -} - -func WithContext(parent netcontext.Context, req *http.Request) netcontext.Context { - c := appengine.NewContext(req) - return withContext(parent, c) -} - -type testingContext struct { - appengine.Context - - req *http.Request -} - -func (t *testingContext) FullyQualifiedAppID() string { return "dev~testcontext" } -func (t *testingContext) Call(service, method string, _, _ appengine_internal.ProtoMessage, _ *appengine_internal.CallOptions) error { - if service == "__go__" && method == "GetNamespace" { - return nil - } - return fmt.Errorf("testingContext: unsupported Call") -} -func (t *testingContext) Request() interface{} { return t.req } - -func ContextForTesting(req *http.Request) netcontext.Context { - return withContext(netcontext.Background(), &testingContext{req: req}) -} - -func Call(ctx netcontext.Context, service, method string, in, out proto.Message) error { - if ns := NamespaceFromContext(ctx); ns != "" { - if fn, ok := NamespaceMods[service]; ok { - fn(in, ns) - } - } - - if f, ctx, ok := callOverrideFromContext(ctx); ok { - return f(ctx, service, method, in, out) - } - - // Handle already-done contexts quickly. - select { - case <-ctx.Done(): - return ctx.Err() - default: - } - - c := fromContext(ctx) - if c == nil { - // Give a good error message rather than a panic lower down. - return errNotAppEngineContext - } - - // Apply transaction modifications if we're in a transaction. - if t := transactionFromContext(ctx); t != nil { - if t.finished { - return errors.New("transaction context has expired") - } - applyTransaction(in, &t.transaction) - } - - var opts *appengine_internal.CallOptions - if d, ok := ctx.Deadline(); ok { - opts = &appengine_internal.CallOptions{ - Timeout: d.Sub(time.Now()), - } - } - - err := c.Call(service, method, in, out, opts) - switch v := err.(type) { - case *appengine_internal.APIError: - return &APIError{ - Service: v.Service, - Detail: v.Detail, - Code: v.Code, - } - case *appengine_internal.CallError: - return &CallError{ - Detail: v.Detail, - Code: v.Code, - Timeout: v.Timeout, - } - } - return err -} - -func handleHTTP(w http.ResponseWriter, r *http.Request) { - panic("handleHTTP called; this should be impossible") -} - -func logf(c appengine.Context, level int64, format string, args ...interface{}) { - var fn func(format string, args ...interface{}) - switch level { - case 0: - fn = c.Debugf - case 1: - fn = c.Infof - case 2: - fn = c.Warningf - case 3: - fn = c.Errorf - case 4: - fn = c.Criticalf - default: - // This shouldn't happen. - fn = c.Criticalf - } - fn(format, args...) -} diff --git a/vendor/google.golang.org/appengine/internal/api_common.go b/vendor/google.golang.org/appengine/internal/api_common.go deleted file mode 100644 index e0c0b214b..000000000 --- a/vendor/google.golang.org/appengine/internal/api_common.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -import ( - "errors" - "os" - - "github.com/golang/protobuf/proto" - netcontext "golang.org/x/net/context" -) - -var errNotAppEngineContext = errors.New("not an App Engine context") - -type CallOverrideFunc func(ctx netcontext.Context, service, method string, in, out proto.Message) error - -var callOverrideKey = "holds []CallOverrideFunc" - -func WithCallOverride(ctx netcontext.Context, f CallOverrideFunc) netcontext.Context { - // We avoid appending to any existing call override - // so we don't risk overwriting a popped stack below. - var cofs []CallOverrideFunc - if uf, ok := ctx.Value(&callOverrideKey).([]CallOverrideFunc); ok { - cofs = append(cofs, uf...) - } - cofs = append(cofs, f) - return netcontext.WithValue(ctx, &callOverrideKey, cofs) -} - -func callOverrideFromContext(ctx netcontext.Context) (CallOverrideFunc, netcontext.Context, bool) { - cofs, _ := ctx.Value(&callOverrideKey).([]CallOverrideFunc) - if len(cofs) == 0 { - return nil, nil, false - } - // We found a list of overrides; grab the last, and reconstitute a - // context that will hide it. - f := cofs[len(cofs)-1] - ctx = netcontext.WithValue(ctx, &callOverrideKey, cofs[:len(cofs)-1]) - return f, ctx, true -} - -type logOverrideFunc func(level int64, format string, args ...interface{}) - -var logOverrideKey = "holds a logOverrideFunc" - -func WithLogOverride(ctx netcontext.Context, f logOverrideFunc) netcontext.Context { - return netcontext.WithValue(ctx, &logOverrideKey, f) -} - -var appIDOverrideKey = "holds a string, being the full app ID" - -func WithAppIDOverride(ctx netcontext.Context, appID string) netcontext.Context { - return netcontext.WithValue(ctx, &appIDOverrideKey, appID) -} - -var namespaceKey = "holds the namespace string" - -func withNamespace(ctx netcontext.Context, ns string) netcontext.Context { - return netcontext.WithValue(ctx, &namespaceKey, ns) -} - -func NamespaceFromContext(ctx netcontext.Context) string { - // If there's no namespace, return the empty string. - ns, _ := ctx.Value(&namespaceKey).(string) - return ns -} - -// FullyQualifiedAppID returns the fully-qualified application ID. -// This may contain a partition prefix (e.g. "s~" for High Replication apps), -// or a domain prefix (e.g. "example.com:"). -func FullyQualifiedAppID(ctx netcontext.Context) string { - if id, ok := ctx.Value(&appIDOverrideKey).(string); ok { - return id - } - return fullyQualifiedAppID(ctx) -} - -func Logf(ctx netcontext.Context, level int64, format string, args ...interface{}) { - if f, ok := ctx.Value(&logOverrideKey).(logOverrideFunc); ok { - f(level, format, args...) - return - } - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - logf(c, level, format, args...) -} - -// NamespacedContext wraps a Context to support namespaces. -func NamespacedContext(ctx netcontext.Context, namespace string) netcontext.Context { - return withNamespace(ctx, namespace) -} - -// SetTestEnv sets the env variables for testing background ticket in Flex. -func SetTestEnv() func() { - var environ = []struct { - key, value string - }{ - {"GAE_LONG_APP_ID", "my-app-id"}, - {"GAE_MINOR_VERSION", "067924799508853122"}, - {"GAE_MODULE_INSTANCE", "0"}, - {"GAE_MODULE_NAME", "default"}, - {"GAE_MODULE_VERSION", "20150612t184001"}, - } - - for _, v := range environ { - old := os.Getenv(v.key) - os.Setenv(v.key, v.value) - v.value = old - } - return func() { // Restore old environment after the test completes. - for _, v := range environ { - if v.value == "" { - os.Unsetenv(v.key) - continue - } - os.Setenv(v.key, v.value) - } - } -} diff --git a/vendor/google.golang.org/appengine/internal/app_id.go b/vendor/google.golang.org/appengine/internal/app_id.go deleted file mode 100644 index 11df8c07b..000000000 --- a/vendor/google.golang.org/appengine/internal/app_id.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -import ( - "strings" -) - -func parseFullAppID(appid string) (partition, domain, displayID string) { - if i := strings.Index(appid, "~"); i != -1 { - partition, appid = appid[:i], appid[i+1:] - } - if i := strings.Index(appid, ":"); i != -1 { - domain, appid = appid[:i], appid[i+1:] - } - return partition, domain, appid -} - -// appID returns "appid" or "domain.com:appid". -func appID(fullAppID string) string { - _, dom, dis := parseFullAppID(fullAppID) - if dom != "" { - return dom + ":" + dis - } - return dis -} diff --git a/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go b/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go deleted file mode 100644 index 9a2ff77ab..000000000 --- a/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.pb.go +++ /dev/null @@ -1,611 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/app_identity/app_identity_service.proto - -package app_identity - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type AppIdentityServiceError_ErrorCode int32 - -const ( - AppIdentityServiceError_SUCCESS AppIdentityServiceError_ErrorCode = 0 - AppIdentityServiceError_UNKNOWN_SCOPE AppIdentityServiceError_ErrorCode = 9 - AppIdentityServiceError_BLOB_TOO_LARGE AppIdentityServiceError_ErrorCode = 1000 - AppIdentityServiceError_DEADLINE_EXCEEDED AppIdentityServiceError_ErrorCode = 1001 - AppIdentityServiceError_NOT_A_VALID_APP AppIdentityServiceError_ErrorCode = 1002 - AppIdentityServiceError_UNKNOWN_ERROR AppIdentityServiceError_ErrorCode = 1003 - AppIdentityServiceError_NOT_ALLOWED AppIdentityServiceError_ErrorCode = 1005 - AppIdentityServiceError_NOT_IMPLEMENTED AppIdentityServiceError_ErrorCode = 1006 -) - -var AppIdentityServiceError_ErrorCode_name = map[int32]string{ - 0: "SUCCESS", - 9: "UNKNOWN_SCOPE", - 1000: "BLOB_TOO_LARGE", - 1001: "DEADLINE_EXCEEDED", - 1002: "NOT_A_VALID_APP", - 1003: "UNKNOWN_ERROR", - 1005: "NOT_ALLOWED", - 1006: "NOT_IMPLEMENTED", -} -var AppIdentityServiceError_ErrorCode_value = map[string]int32{ - "SUCCESS": 0, - "UNKNOWN_SCOPE": 9, - "BLOB_TOO_LARGE": 1000, - "DEADLINE_EXCEEDED": 1001, - "NOT_A_VALID_APP": 1002, - "UNKNOWN_ERROR": 1003, - "NOT_ALLOWED": 1005, - "NOT_IMPLEMENTED": 1006, -} - -func (x AppIdentityServiceError_ErrorCode) Enum() *AppIdentityServiceError_ErrorCode { - p := new(AppIdentityServiceError_ErrorCode) - *p = x - return p -} -func (x AppIdentityServiceError_ErrorCode) String() string { - return proto.EnumName(AppIdentityServiceError_ErrorCode_name, int32(x)) -} -func (x *AppIdentityServiceError_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(AppIdentityServiceError_ErrorCode_value, data, "AppIdentityServiceError_ErrorCode") - if err != nil { - return err - } - *x = AppIdentityServiceError_ErrorCode(value) - return nil -} -func (AppIdentityServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{0, 0} -} - -type AppIdentityServiceError struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AppIdentityServiceError) Reset() { *m = AppIdentityServiceError{} } -func (m *AppIdentityServiceError) String() string { return proto.CompactTextString(m) } -func (*AppIdentityServiceError) ProtoMessage() {} -func (*AppIdentityServiceError) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{0} -} -func (m *AppIdentityServiceError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AppIdentityServiceError.Unmarshal(m, b) -} -func (m *AppIdentityServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AppIdentityServiceError.Marshal(b, m, deterministic) -} -func (dst *AppIdentityServiceError) XXX_Merge(src proto.Message) { - xxx_messageInfo_AppIdentityServiceError.Merge(dst, src) -} -func (m *AppIdentityServiceError) XXX_Size() int { - return xxx_messageInfo_AppIdentityServiceError.Size(m) -} -func (m *AppIdentityServiceError) XXX_DiscardUnknown() { - xxx_messageInfo_AppIdentityServiceError.DiscardUnknown(m) -} - -var xxx_messageInfo_AppIdentityServiceError proto.InternalMessageInfo - -type SignForAppRequest struct { - BytesToSign []byte `protobuf:"bytes,1,opt,name=bytes_to_sign,json=bytesToSign" json:"bytes_to_sign,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SignForAppRequest) Reset() { *m = SignForAppRequest{} } -func (m *SignForAppRequest) String() string { return proto.CompactTextString(m) } -func (*SignForAppRequest) ProtoMessage() {} -func (*SignForAppRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{1} -} -func (m *SignForAppRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SignForAppRequest.Unmarshal(m, b) -} -func (m *SignForAppRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SignForAppRequest.Marshal(b, m, deterministic) -} -func (dst *SignForAppRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignForAppRequest.Merge(dst, src) -} -func (m *SignForAppRequest) XXX_Size() int { - return xxx_messageInfo_SignForAppRequest.Size(m) -} -func (m *SignForAppRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SignForAppRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SignForAppRequest proto.InternalMessageInfo - -func (m *SignForAppRequest) GetBytesToSign() []byte { - if m != nil { - return m.BytesToSign - } - return nil -} - -type SignForAppResponse struct { - KeyName *string `protobuf:"bytes,1,opt,name=key_name,json=keyName" json:"key_name,omitempty"` - SignatureBytes []byte `protobuf:"bytes,2,opt,name=signature_bytes,json=signatureBytes" json:"signature_bytes,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SignForAppResponse) Reset() { *m = SignForAppResponse{} } -func (m *SignForAppResponse) String() string { return proto.CompactTextString(m) } -func (*SignForAppResponse) ProtoMessage() {} -func (*SignForAppResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{2} -} -func (m *SignForAppResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SignForAppResponse.Unmarshal(m, b) -} -func (m *SignForAppResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SignForAppResponse.Marshal(b, m, deterministic) -} -func (dst *SignForAppResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignForAppResponse.Merge(dst, src) -} -func (m *SignForAppResponse) XXX_Size() int { - return xxx_messageInfo_SignForAppResponse.Size(m) -} -func (m *SignForAppResponse) XXX_DiscardUnknown() { - xxx_messageInfo_SignForAppResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_SignForAppResponse proto.InternalMessageInfo - -func (m *SignForAppResponse) GetKeyName() string { - if m != nil && m.KeyName != nil { - return *m.KeyName - } - return "" -} - -func (m *SignForAppResponse) GetSignatureBytes() []byte { - if m != nil { - return m.SignatureBytes - } - return nil -} - -type GetPublicCertificateForAppRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetPublicCertificateForAppRequest) Reset() { *m = GetPublicCertificateForAppRequest{} } -func (m *GetPublicCertificateForAppRequest) String() string { return proto.CompactTextString(m) } -func (*GetPublicCertificateForAppRequest) ProtoMessage() {} -func (*GetPublicCertificateForAppRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{3} -} -func (m *GetPublicCertificateForAppRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetPublicCertificateForAppRequest.Unmarshal(m, b) -} -func (m *GetPublicCertificateForAppRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetPublicCertificateForAppRequest.Marshal(b, m, deterministic) -} -func (dst *GetPublicCertificateForAppRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetPublicCertificateForAppRequest.Merge(dst, src) -} -func (m *GetPublicCertificateForAppRequest) XXX_Size() int { - return xxx_messageInfo_GetPublicCertificateForAppRequest.Size(m) -} -func (m *GetPublicCertificateForAppRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetPublicCertificateForAppRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetPublicCertificateForAppRequest proto.InternalMessageInfo - -type PublicCertificate struct { - KeyName *string `protobuf:"bytes,1,opt,name=key_name,json=keyName" json:"key_name,omitempty"` - X509CertificatePem *string `protobuf:"bytes,2,opt,name=x509_certificate_pem,json=x509CertificatePem" json:"x509_certificate_pem,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PublicCertificate) Reset() { *m = PublicCertificate{} } -func (m *PublicCertificate) String() string { return proto.CompactTextString(m) } -func (*PublicCertificate) ProtoMessage() {} -func (*PublicCertificate) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{4} -} -func (m *PublicCertificate) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PublicCertificate.Unmarshal(m, b) -} -func (m *PublicCertificate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PublicCertificate.Marshal(b, m, deterministic) -} -func (dst *PublicCertificate) XXX_Merge(src proto.Message) { - xxx_messageInfo_PublicCertificate.Merge(dst, src) -} -func (m *PublicCertificate) XXX_Size() int { - return xxx_messageInfo_PublicCertificate.Size(m) -} -func (m *PublicCertificate) XXX_DiscardUnknown() { - xxx_messageInfo_PublicCertificate.DiscardUnknown(m) -} - -var xxx_messageInfo_PublicCertificate proto.InternalMessageInfo - -func (m *PublicCertificate) GetKeyName() string { - if m != nil && m.KeyName != nil { - return *m.KeyName - } - return "" -} - -func (m *PublicCertificate) GetX509CertificatePem() string { - if m != nil && m.X509CertificatePem != nil { - return *m.X509CertificatePem - } - return "" -} - -type GetPublicCertificateForAppResponse struct { - PublicCertificateList []*PublicCertificate `protobuf:"bytes,1,rep,name=public_certificate_list,json=publicCertificateList" json:"public_certificate_list,omitempty"` - MaxClientCacheTimeInSecond *int64 `protobuf:"varint,2,opt,name=max_client_cache_time_in_second,json=maxClientCacheTimeInSecond" json:"max_client_cache_time_in_second,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetPublicCertificateForAppResponse) Reset() { *m = GetPublicCertificateForAppResponse{} } -func (m *GetPublicCertificateForAppResponse) String() string { return proto.CompactTextString(m) } -func (*GetPublicCertificateForAppResponse) ProtoMessage() {} -func (*GetPublicCertificateForAppResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{5} -} -func (m *GetPublicCertificateForAppResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetPublicCertificateForAppResponse.Unmarshal(m, b) -} -func (m *GetPublicCertificateForAppResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetPublicCertificateForAppResponse.Marshal(b, m, deterministic) -} -func (dst *GetPublicCertificateForAppResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetPublicCertificateForAppResponse.Merge(dst, src) -} -func (m *GetPublicCertificateForAppResponse) XXX_Size() int { - return xxx_messageInfo_GetPublicCertificateForAppResponse.Size(m) -} -func (m *GetPublicCertificateForAppResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetPublicCertificateForAppResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetPublicCertificateForAppResponse proto.InternalMessageInfo - -func (m *GetPublicCertificateForAppResponse) GetPublicCertificateList() []*PublicCertificate { - if m != nil { - return m.PublicCertificateList - } - return nil -} - -func (m *GetPublicCertificateForAppResponse) GetMaxClientCacheTimeInSecond() int64 { - if m != nil && m.MaxClientCacheTimeInSecond != nil { - return *m.MaxClientCacheTimeInSecond - } - return 0 -} - -type GetServiceAccountNameRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetServiceAccountNameRequest) Reset() { *m = GetServiceAccountNameRequest{} } -func (m *GetServiceAccountNameRequest) String() string { return proto.CompactTextString(m) } -func (*GetServiceAccountNameRequest) ProtoMessage() {} -func (*GetServiceAccountNameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{6} -} -func (m *GetServiceAccountNameRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetServiceAccountNameRequest.Unmarshal(m, b) -} -func (m *GetServiceAccountNameRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetServiceAccountNameRequest.Marshal(b, m, deterministic) -} -func (dst *GetServiceAccountNameRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetServiceAccountNameRequest.Merge(dst, src) -} -func (m *GetServiceAccountNameRequest) XXX_Size() int { - return xxx_messageInfo_GetServiceAccountNameRequest.Size(m) -} -func (m *GetServiceAccountNameRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetServiceAccountNameRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetServiceAccountNameRequest proto.InternalMessageInfo - -type GetServiceAccountNameResponse struct { - ServiceAccountName *string `protobuf:"bytes,1,opt,name=service_account_name,json=serviceAccountName" json:"service_account_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetServiceAccountNameResponse) Reset() { *m = GetServiceAccountNameResponse{} } -func (m *GetServiceAccountNameResponse) String() string { return proto.CompactTextString(m) } -func (*GetServiceAccountNameResponse) ProtoMessage() {} -func (*GetServiceAccountNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{7} -} -func (m *GetServiceAccountNameResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetServiceAccountNameResponse.Unmarshal(m, b) -} -func (m *GetServiceAccountNameResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetServiceAccountNameResponse.Marshal(b, m, deterministic) -} -func (dst *GetServiceAccountNameResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetServiceAccountNameResponse.Merge(dst, src) -} -func (m *GetServiceAccountNameResponse) XXX_Size() int { - return xxx_messageInfo_GetServiceAccountNameResponse.Size(m) -} -func (m *GetServiceAccountNameResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetServiceAccountNameResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetServiceAccountNameResponse proto.InternalMessageInfo - -func (m *GetServiceAccountNameResponse) GetServiceAccountName() string { - if m != nil && m.ServiceAccountName != nil { - return *m.ServiceAccountName - } - return "" -} - -type GetAccessTokenRequest struct { - Scope []string `protobuf:"bytes,1,rep,name=scope" json:"scope,omitempty"` - ServiceAccountId *int64 `protobuf:"varint,2,opt,name=service_account_id,json=serviceAccountId" json:"service_account_id,omitempty"` - ServiceAccountName *string `protobuf:"bytes,3,opt,name=service_account_name,json=serviceAccountName" json:"service_account_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetAccessTokenRequest) Reset() { *m = GetAccessTokenRequest{} } -func (m *GetAccessTokenRequest) String() string { return proto.CompactTextString(m) } -func (*GetAccessTokenRequest) ProtoMessage() {} -func (*GetAccessTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{8} -} -func (m *GetAccessTokenRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetAccessTokenRequest.Unmarshal(m, b) -} -func (m *GetAccessTokenRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetAccessTokenRequest.Marshal(b, m, deterministic) -} -func (dst *GetAccessTokenRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetAccessTokenRequest.Merge(dst, src) -} -func (m *GetAccessTokenRequest) XXX_Size() int { - return xxx_messageInfo_GetAccessTokenRequest.Size(m) -} -func (m *GetAccessTokenRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetAccessTokenRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetAccessTokenRequest proto.InternalMessageInfo - -func (m *GetAccessTokenRequest) GetScope() []string { - if m != nil { - return m.Scope - } - return nil -} - -func (m *GetAccessTokenRequest) GetServiceAccountId() int64 { - if m != nil && m.ServiceAccountId != nil { - return *m.ServiceAccountId - } - return 0 -} - -func (m *GetAccessTokenRequest) GetServiceAccountName() string { - if m != nil && m.ServiceAccountName != nil { - return *m.ServiceAccountName - } - return "" -} - -type GetAccessTokenResponse struct { - AccessToken *string `protobuf:"bytes,1,opt,name=access_token,json=accessToken" json:"access_token,omitempty"` - ExpirationTime *int64 `protobuf:"varint,2,opt,name=expiration_time,json=expirationTime" json:"expiration_time,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetAccessTokenResponse) Reset() { *m = GetAccessTokenResponse{} } -func (m *GetAccessTokenResponse) String() string { return proto.CompactTextString(m) } -func (*GetAccessTokenResponse) ProtoMessage() {} -func (*GetAccessTokenResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{9} -} -func (m *GetAccessTokenResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetAccessTokenResponse.Unmarshal(m, b) -} -func (m *GetAccessTokenResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetAccessTokenResponse.Marshal(b, m, deterministic) -} -func (dst *GetAccessTokenResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetAccessTokenResponse.Merge(dst, src) -} -func (m *GetAccessTokenResponse) XXX_Size() int { - return xxx_messageInfo_GetAccessTokenResponse.Size(m) -} -func (m *GetAccessTokenResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetAccessTokenResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetAccessTokenResponse proto.InternalMessageInfo - -func (m *GetAccessTokenResponse) GetAccessToken() string { - if m != nil && m.AccessToken != nil { - return *m.AccessToken - } - return "" -} - -func (m *GetAccessTokenResponse) GetExpirationTime() int64 { - if m != nil && m.ExpirationTime != nil { - return *m.ExpirationTime - } - return 0 -} - -type GetDefaultGcsBucketNameRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetDefaultGcsBucketNameRequest) Reset() { *m = GetDefaultGcsBucketNameRequest{} } -func (m *GetDefaultGcsBucketNameRequest) String() string { return proto.CompactTextString(m) } -func (*GetDefaultGcsBucketNameRequest) ProtoMessage() {} -func (*GetDefaultGcsBucketNameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{10} -} -func (m *GetDefaultGcsBucketNameRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetDefaultGcsBucketNameRequest.Unmarshal(m, b) -} -func (m *GetDefaultGcsBucketNameRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetDefaultGcsBucketNameRequest.Marshal(b, m, deterministic) -} -func (dst *GetDefaultGcsBucketNameRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetDefaultGcsBucketNameRequest.Merge(dst, src) -} -func (m *GetDefaultGcsBucketNameRequest) XXX_Size() int { - return xxx_messageInfo_GetDefaultGcsBucketNameRequest.Size(m) -} -func (m *GetDefaultGcsBucketNameRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetDefaultGcsBucketNameRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetDefaultGcsBucketNameRequest proto.InternalMessageInfo - -type GetDefaultGcsBucketNameResponse struct { - DefaultGcsBucketName *string `protobuf:"bytes,1,opt,name=default_gcs_bucket_name,json=defaultGcsBucketName" json:"default_gcs_bucket_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetDefaultGcsBucketNameResponse) Reset() { *m = GetDefaultGcsBucketNameResponse{} } -func (m *GetDefaultGcsBucketNameResponse) String() string { return proto.CompactTextString(m) } -func (*GetDefaultGcsBucketNameResponse) ProtoMessage() {} -func (*GetDefaultGcsBucketNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_app_identity_service_08a6e3f74b04cfa4, []int{11} -} -func (m *GetDefaultGcsBucketNameResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetDefaultGcsBucketNameResponse.Unmarshal(m, b) -} -func (m *GetDefaultGcsBucketNameResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetDefaultGcsBucketNameResponse.Marshal(b, m, deterministic) -} -func (dst *GetDefaultGcsBucketNameResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetDefaultGcsBucketNameResponse.Merge(dst, src) -} -func (m *GetDefaultGcsBucketNameResponse) XXX_Size() int { - return xxx_messageInfo_GetDefaultGcsBucketNameResponse.Size(m) -} -func (m *GetDefaultGcsBucketNameResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetDefaultGcsBucketNameResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetDefaultGcsBucketNameResponse proto.InternalMessageInfo - -func (m *GetDefaultGcsBucketNameResponse) GetDefaultGcsBucketName() string { - if m != nil && m.DefaultGcsBucketName != nil { - return *m.DefaultGcsBucketName - } - return "" -} - -func init() { - proto.RegisterType((*AppIdentityServiceError)(nil), "appengine.AppIdentityServiceError") - proto.RegisterType((*SignForAppRequest)(nil), "appengine.SignForAppRequest") - proto.RegisterType((*SignForAppResponse)(nil), "appengine.SignForAppResponse") - proto.RegisterType((*GetPublicCertificateForAppRequest)(nil), "appengine.GetPublicCertificateForAppRequest") - proto.RegisterType((*PublicCertificate)(nil), "appengine.PublicCertificate") - proto.RegisterType((*GetPublicCertificateForAppResponse)(nil), "appengine.GetPublicCertificateForAppResponse") - proto.RegisterType((*GetServiceAccountNameRequest)(nil), "appengine.GetServiceAccountNameRequest") - proto.RegisterType((*GetServiceAccountNameResponse)(nil), "appengine.GetServiceAccountNameResponse") - proto.RegisterType((*GetAccessTokenRequest)(nil), "appengine.GetAccessTokenRequest") - proto.RegisterType((*GetAccessTokenResponse)(nil), "appengine.GetAccessTokenResponse") - proto.RegisterType((*GetDefaultGcsBucketNameRequest)(nil), "appengine.GetDefaultGcsBucketNameRequest") - proto.RegisterType((*GetDefaultGcsBucketNameResponse)(nil), "appengine.GetDefaultGcsBucketNameResponse") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/app_identity/app_identity_service.proto", fileDescriptor_app_identity_service_08a6e3f74b04cfa4) -} - -var fileDescriptor_app_identity_service_08a6e3f74b04cfa4 = []byte{ - // 676 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xdb, 0x6e, 0xda, 0x58, - 0x14, 0x1d, 0x26, 0x1a, 0x31, 0x6c, 0x12, 0x62, 0xce, 0x90, 0xcb, 0x8c, 0x32, 0xb9, 0x78, 0x1e, - 0x26, 0x0f, 0x15, 0x89, 0x2a, 0x45, 0x55, 0x1f, 0x8d, 0xed, 0x22, 0x54, 0x07, 0x53, 0x43, 0x9a, - 0xa8, 0x2f, 0xa7, 0xce, 0x61, 0xc7, 0x3d, 0x02, 0x9f, 0xe3, 0xda, 0x87, 0x0a, 0x3e, 0xa2, 0x3f, - 0xd2, 0x9f, 0xe8, 0x5b, 0xbf, 0xa5, 0x17, 0xb5, 0xdf, 0x50, 0xd9, 0x38, 0x5c, 0x92, 0x92, 0x37, - 0xbc, 0xf6, 0x5a, 0xcb, 0x6b, 0x2f, 0x6d, 0x0c, 0x4e, 0x20, 0x65, 0x30, 0xc4, 0x7a, 0x20, 0x87, - 0xbe, 0x08, 0xea, 0x32, 0x0e, 0x4e, 0xfc, 0x28, 0x42, 0x11, 0x70, 0x81, 0x27, 0x5c, 0x28, 0x8c, - 0x85, 0x3f, 0x4c, 0x21, 0xca, 0xfb, 0x28, 0x14, 0x57, 0x93, 0xa5, 0x07, 0x9a, 0x60, 0xfc, 0x8e, - 0x33, 0xac, 0x47, 0xb1, 0x54, 0x92, 0x94, 0x66, 0x5a, 0xfd, 0x53, 0x01, 0x76, 0x8c, 0x28, 0x6a, - 0xe5, 0xc4, 0xee, 0x94, 0x67, 0xc7, 0xb1, 0x8c, 0xf5, 0x0f, 0x05, 0x28, 0x65, 0xbf, 0x4c, 0xd9, - 0x47, 0x52, 0x86, 0x62, 0xf7, 0xc2, 0x34, 0xed, 0x6e, 0x57, 0xfb, 0x8d, 0x54, 0x61, 0xe3, 0xa2, - 0xfd, 0xbc, 0xed, 0x5e, 0xb6, 0x69, 0xd7, 0x74, 0x3b, 0xb6, 0x56, 0x22, 0x7f, 0x41, 0xa5, 0xe1, - 0xb8, 0x0d, 0xda, 0x73, 0x5d, 0xea, 0x18, 0x5e, 0xd3, 0xd6, 0x3e, 0x17, 0xc9, 0x36, 0x54, 0x2d, - 0xdb, 0xb0, 0x9c, 0x56, 0xdb, 0xa6, 0xf6, 0x95, 0x69, 0xdb, 0x96, 0x6d, 0x69, 0x5f, 0x8a, 0xa4, - 0x06, 0x9b, 0x6d, 0xb7, 0x47, 0x0d, 0xfa, 0xd2, 0x70, 0x5a, 0x16, 0x35, 0x3a, 0x1d, 0xed, 0x6b, - 0x91, 0x90, 0xb9, 0xab, 0xed, 0x79, 0xae, 0xa7, 0x7d, 0x2b, 0x12, 0x0d, 0xca, 0x19, 0xd3, 0x71, - 0xdc, 0x4b, 0xdb, 0xd2, 0xbe, 0xcf, 0xb4, 0xad, 0xf3, 0x8e, 0x63, 0x9f, 0xdb, 0xed, 0x9e, 0x6d, - 0x69, 0x3f, 0x8a, 0xfa, 0x13, 0xa8, 0x76, 0x79, 0x20, 0x9e, 0xc9, 0xd8, 0x88, 0x22, 0x0f, 0xdf, - 0x8e, 0x30, 0x51, 0x44, 0x87, 0x8d, 0xeb, 0x89, 0xc2, 0x84, 0x2a, 0x49, 0x13, 0x1e, 0x88, 0xdd, - 0xc2, 0x61, 0xe1, 0x78, 0xdd, 0x2b, 0x67, 0x60, 0x4f, 0xa6, 0x02, 0xfd, 0x0a, 0xc8, 0xa2, 0x30, - 0x89, 0xa4, 0x48, 0x90, 0xfc, 0x0d, 0x7f, 0x0e, 0x70, 0x42, 0x85, 0x1f, 0x62, 0x26, 0x2a, 0x79, - 0xc5, 0x01, 0x4e, 0xda, 0x7e, 0x88, 0xe4, 0x7f, 0xd8, 0x4c, 0xbd, 0x7c, 0x35, 0x8a, 0x91, 0x66, - 0x4e, 0xbb, 0xbf, 0x67, 0xb6, 0x95, 0x19, 0xdc, 0x48, 0x51, 0xfd, 0x3f, 0x38, 0x6a, 0xa2, 0xea, - 0x8c, 0xae, 0x87, 0x9c, 0x99, 0x18, 0x2b, 0x7e, 0xc3, 0x99, 0xaf, 0x70, 0x29, 0xa2, 0xfe, 0x1a, - 0xaa, 0xf7, 0x18, 0x0f, 0xbd, 0xfd, 0x14, 0x6a, 0xe3, 0xb3, 0xd3, 0xa7, 0x94, 0xcd, 0xe9, 0x34, - 0xc2, 0x30, 0x8b, 0x50, 0xf2, 0x48, 0x3a, 0x5b, 0x70, 0xea, 0x60, 0xa8, 0x7f, 0x2c, 0x80, 0xfe, - 0x50, 0x8e, 0x7c, 0xe3, 0x1e, 0xec, 0x44, 0x19, 0x65, 0xc9, 0x7a, 0xc8, 0x13, 0xb5, 0x5b, 0x38, - 0x5c, 0x3b, 0x2e, 0x3f, 0xde, 0xab, 0xcf, 0xce, 0xa6, 0x7e, 0xcf, 0xcc, 0xdb, 0x8a, 0xee, 0x42, - 0x0e, 0x4f, 0x14, 0x31, 0xe1, 0x20, 0xf4, 0xc7, 0x94, 0x0d, 0x39, 0x0a, 0x45, 0x99, 0xcf, 0xde, - 0x20, 0x55, 0x3c, 0x44, 0xca, 0x05, 0x4d, 0x90, 0x49, 0xd1, 0xcf, 0x92, 0xaf, 0x79, 0xff, 0x84, - 0xfe, 0xd8, 0xcc, 0x58, 0x66, 0x4a, 0xea, 0xf1, 0x10, 0x5b, 0xa2, 0x9b, 0x31, 0xf4, 0x7d, 0xd8, - 0x6b, 0xa2, 0xca, 0x6f, 0xd3, 0x60, 0x4c, 0x8e, 0x84, 0x4a, 0xcb, 0xb8, 0xed, 0xf0, 0x05, 0xfc, - 0xbb, 0x62, 0x9e, 0xef, 0x76, 0x0a, 0xb5, 0xfc, 0x1f, 0x40, 0xfd, 0xe9, 0x78, 0xb1, 0x5b, 0x92, - 0xdc, 0x53, 0xea, 0xef, 0x0b, 0xb0, 0xd5, 0x44, 0x65, 0x30, 0x86, 0x49, 0xd2, 0x93, 0x03, 0x14, - 0xb7, 0x37, 0x55, 0x83, 0x3f, 0x12, 0x26, 0x23, 0xcc, 0x5a, 0x29, 0x79, 0xd3, 0x07, 0xf2, 0x08, - 0xc8, 0xdd, 0x37, 0xf0, 0xdb, 0xd5, 0xb4, 0x65, 0xff, 0x56, 0x7f, 0x65, 0x9e, 0xb5, 0x95, 0x79, - 0xfa, 0xb0, 0x7d, 0x37, 0x4e, 0xbe, 0xdb, 0x11, 0xac, 0xfb, 0x19, 0x4c, 0x55, 0x8a, 0xe7, 0x3b, - 0x95, 0xfd, 0x39, 0x35, 0xbd, 0x58, 0x1c, 0x47, 0x3c, 0xf6, 0x15, 0x97, 0x22, 0xab, 0x3f, 0x4f, - 0x56, 0x99, 0xc3, 0x69, 0xe1, 0xfa, 0x21, 0xec, 0x37, 0x51, 0x59, 0x78, 0xe3, 0x8f, 0x86, 0xaa, - 0xc9, 0x92, 0xc6, 0x88, 0x0d, 0x70, 0xa9, 0xea, 0x2b, 0x38, 0x58, 0xc9, 0xc8, 0x03, 0x9d, 0xc1, - 0x4e, 0x7f, 0x3a, 0xa7, 0x01, 0x4b, 0xe8, 0x75, 0xc6, 0x58, 0xec, 0xbb, 0xd6, 0xff, 0x85, 0xbc, - 0x51, 0x79, 0xb5, 0xbe, 0xf8, 0xc9, 0xfa, 0x19, 0x00, 0x00, 0xff, 0xff, 0x37, 0x4c, 0x56, 0x38, - 0xf3, 0x04, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.proto b/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.proto deleted file mode 100644 index 19610ca5b..000000000 --- a/vendor/google.golang.org/appengine/internal/app_identity/app_identity_service.proto +++ /dev/null @@ -1,64 +0,0 @@ -syntax = "proto2"; -option go_package = "app_identity"; - -package appengine; - -message AppIdentityServiceError { - enum ErrorCode { - SUCCESS = 0; - UNKNOWN_SCOPE = 9; - BLOB_TOO_LARGE = 1000; - DEADLINE_EXCEEDED = 1001; - NOT_A_VALID_APP = 1002; - UNKNOWN_ERROR = 1003; - NOT_ALLOWED = 1005; - NOT_IMPLEMENTED = 1006; - } -} - -message SignForAppRequest { - optional bytes bytes_to_sign = 1; -} - -message SignForAppResponse { - optional string key_name = 1; - optional bytes signature_bytes = 2; -} - -message GetPublicCertificateForAppRequest { -} - -message PublicCertificate { - optional string key_name = 1; - optional string x509_certificate_pem = 2; -} - -message GetPublicCertificateForAppResponse { - repeated PublicCertificate public_certificate_list = 1; - optional int64 max_client_cache_time_in_second = 2; -} - -message GetServiceAccountNameRequest { -} - -message GetServiceAccountNameResponse { - optional string service_account_name = 1; -} - -message GetAccessTokenRequest { - repeated string scope = 1; - optional int64 service_account_id = 2; - optional string service_account_name = 3; -} - -message GetAccessTokenResponse { - optional string access_token = 1; - optional int64 expiration_time = 2; -} - -message GetDefaultGcsBucketNameRequest { -} - -message GetDefaultGcsBucketNameResponse { - optional string default_gcs_bucket_name = 1; -} diff --git a/vendor/google.golang.org/appengine/internal/base/api_base.pb.go b/vendor/google.golang.org/appengine/internal/base/api_base.pb.go deleted file mode 100644 index db4777e68..000000000 --- a/vendor/google.golang.org/appengine/internal/base/api_base.pb.go +++ /dev/null @@ -1,308 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/base/api_base.proto - -package base - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type StringProto struct { - Value *string `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StringProto) Reset() { *m = StringProto{} } -func (m *StringProto) String() string { return proto.CompactTextString(m) } -func (*StringProto) ProtoMessage() {} -func (*StringProto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{0} -} -func (m *StringProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StringProto.Unmarshal(m, b) -} -func (m *StringProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StringProto.Marshal(b, m, deterministic) -} -func (dst *StringProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_StringProto.Merge(dst, src) -} -func (m *StringProto) XXX_Size() int { - return xxx_messageInfo_StringProto.Size(m) -} -func (m *StringProto) XXX_DiscardUnknown() { - xxx_messageInfo_StringProto.DiscardUnknown(m) -} - -var xxx_messageInfo_StringProto proto.InternalMessageInfo - -func (m *StringProto) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value - } - return "" -} - -type Integer32Proto struct { - Value *int32 `protobuf:"varint,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Integer32Proto) Reset() { *m = Integer32Proto{} } -func (m *Integer32Proto) String() string { return proto.CompactTextString(m) } -func (*Integer32Proto) ProtoMessage() {} -func (*Integer32Proto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{1} -} -func (m *Integer32Proto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Integer32Proto.Unmarshal(m, b) -} -func (m *Integer32Proto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Integer32Proto.Marshal(b, m, deterministic) -} -func (dst *Integer32Proto) XXX_Merge(src proto.Message) { - xxx_messageInfo_Integer32Proto.Merge(dst, src) -} -func (m *Integer32Proto) XXX_Size() int { - return xxx_messageInfo_Integer32Proto.Size(m) -} -func (m *Integer32Proto) XXX_DiscardUnknown() { - xxx_messageInfo_Integer32Proto.DiscardUnknown(m) -} - -var xxx_messageInfo_Integer32Proto proto.InternalMessageInfo - -func (m *Integer32Proto) GetValue() int32 { - if m != nil && m.Value != nil { - return *m.Value - } - return 0 -} - -type Integer64Proto struct { - Value *int64 `protobuf:"varint,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Integer64Proto) Reset() { *m = Integer64Proto{} } -func (m *Integer64Proto) String() string { return proto.CompactTextString(m) } -func (*Integer64Proto) ProtoMessage() {} -func (*Integer64Proto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{2} -} -func (m *Integer64Proto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Integer64Proto.Unmarshal(m, b) -} -func (m *Integer64Proto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Integer64Proto.Marshal(b, m, deterministic) -} -func (dst *Integer64Proto) XXX_Merge(src proto.Message) { - xxx_messageInfo_Integer64Proto.Merge(dst, src) -} -func (m *Integer64Proto) XXX_Size() int { - return xxx_messageInfo_Integer64Proto.Size(m) -} -func (m *Integer64Proto) XXX_DiscardUnknown() { - xxx_messageInfo_Integer64Proto.DiscardUnknown(m) -} - -var xxx_messageInfo_Integer64Proto proto.InternalMessageInfo - -func (m *Integer64Proto) GetValue() int64 { - if m != nil && m.Value != nil { - return *m.Value - } - return 0 -} - -type BoolProto struct { - Value *bool `protobuf:"varint,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BoolProto) Reset() { *m = BoolProto{} } -func (m *BoolProto) String() string { return proto.CompactTextString(m) } -func (*BoolProto) ProtoMessage() {} -func (*BoolProto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{3} -} -func (m *BoolProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BoolProto.Unmarshal(m, b) -} -func (m *BoolProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BoolProto.Marshal(b, m, deterministic) -} -func (dst *BoolProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_BoolProto.Merge(dst, src) -} -func (m *BoolProto) XXX_Size() int { - return xxx_messageInfo_BoolProto.Size(m) -} -func (m *BoolProto) XXX_DiscardUnknown() { - xxx_messageInfo_BoolProto.DiscardUnknown(m) -} - -var xxx_messageInfo_BoolProto proto.InternalMessageInfo - -func (m *BoolProto) GetValue() bool { - if m != nil && m.Value != nil { - return *m.Value - } - return false -} - -type DoubleProto struct { - Value *float64 `protobuf:"fixed64,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DoubleProto) Reset() { *m = DoubleProto{} } -func (m *DoubleProto) String() string { return proto.CompactTextString(m) } -func (*DoubleProto) ProtoMessage() {} -func (*DoubleProto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{4} -} -func (m *DoubleProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DoubleProto.Unmarshal(m, b) -} -func (m *DoubleProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DoubleProto.Marshal(b, m, deterministic) -} -func (dst *DoubleProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_DoubleProto.Merge(dst, src) -} -func (m *DoubleProto) XXX_Size() int { - return xxx_messageInfo_DoubleProto.Size(m) -} -func (m *DoubleProto) XXX_DiscardUnknown() { - xxx_messageInfo_DoubleProto.DiscardUnknown(m) -} - -var xxx_messageInfo_DoubleProto proto.InternalMessageInfo - -func (m *DoubleProto) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value - } - return 0 -} - -type BytesProto struct { - Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BytesProto) Reset() { *m = BytesProto{} } -func (m *BytesProto) String() string { return proto.CompactTextString(m) } -func (*BytesProto) ProtoMessage() {} -func (*BytesProto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{5} -} -func (m *BytesProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BytesProto.Unmarshal(m, b) -} -func (m *BytesProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BytesProto.Marshal(b, m, deterministic) -} -func (dst *BytesProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_BytesProto.Merge(dst, src) -} -func (m *BytesProto) XXX_Size() int { - return xxx_messageInfo_BytesProto.Size(m) -} -func (m *BytesProto) XXX_DiscardUnknown() { - xxx_messageInfo_BytesProto.DiscardUnknown(m) -} - -var xxx_messageInfo_BytesProto proto.InternalMessageInfo - -func (m *BytesProto) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -type VoidProto struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *VoidProto) Reset() { *m = VoidProto{} } -func (m *VoidProto) String() string { return proto.CompactTextString(m) } -func (*VoidProto) ProtoMessage() {} -func (*VoidProto) Descriptor() ([]byte, []int) { - return fileDescriptor_api_base_9d49f8792e0c1140, []int{6} -} -func (m *VoidProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_VoidProto.Unmarshal(m, b) -} -func (m *VoidProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_VoidProto.Marshal(b, m, deterministic) -} -func (dst *VoidProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_VoidProto.Merge(dst, src) -} -func (m *VoidProto) XXX_Size() int { - return xxx_messageInfo_VoidProto.Size(m) -} -func (m *VoidProto) XXX_DiscardUnknown() { - xxx_messageInfo_VoidProto.DiscardUnknown(m) -} - -var xxx_messageInfo_VoidProto proto.InternalMessageInfo - -func init() { - proto.RegisterType((*StringProto)(nil), "appengine.base.StringProto") - proto.RegisterType((*Integer32Proto)(nil), "appengine.base.Integer32Proto") - proto.RegisterType((*Integer64Proto)(nil), "appengine.base.Integer64Proto") - proto.RegisterType((*BoolProto)(nil), "appengine.base.BoolProto") - proto.RegisterType((*DoubleProto)(nil), "appengine.base.DoubleProto") - proto.RegisterType((*BytesProto)(nil), "appengine.base.BytesProto") - proto.RegisterType((*VoidProto)(nil), "appengine.base.VoidProto") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/base/api_base.proto", fileDescriptor_api_base_9d49f8792e0c1140) -} - -var fileDescriptor_api_base_9d49f8792e0c1140 = []byte{ - // 199 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0xcf, 0x3f, 0x4b, 0xc6, 0x30, - 0x10, 0x06, 0x70, 0x5a, 0xad, 0xb4, 0x57, 0xe9, 0x20, 0x0e, 0x1d, 0xb5, 0x05, 0x71, 0x4a, 0x40, - 0x45, 0x9c, 0x83, 0x8b, 0x9b, 0x28, 0x38, 0xb8, 0x48, 0x8a, 0xc7, 0x11, 0x08, 0xb9, 0x90, 0xa6, - 0x82, 0xdf, 0x5e, 0xda, 0xd2, 0xfa, 0xc2, 0x9b, 0xed, 0xfe, 0xfc, 0xe0, 0xe1, 0x81, 0x27, 0x62, - 0x26, 0x8b, 0x82, 0xd8, 0x6a, 0x47, 0x82, 0x03, 0x49, 0xed, 0x3d, 0x3a, 0x32, 0x0e, 0xa5, 0x71, - 0x11, 0x83, 0xd3, 0x56, 0x0e, 0x7a, 0x44, 0xa9, 0xbd, 0xf9, 0x9a, 0x07, 0xe1, 0x03, 0x47, 0xbe, - 0x68, 0x76, 0x27, 0xe6, 0x6b, 0xd7, 0x43, 0xfd, 0x1e, 0x83, 0x71, 0xf4, 0xba, 0xbc, 0x2f, 0xa1, - 0xf8, 0xd1, 0x76, 0xc2, 0x36, 0xbb, 0xca, 0x6f, 0xab, 0xb7, 0x75, 0xe9, 0x6e, 0xa0, 0x79, 0x71, - 0x11, 0x09, 0xc3, 0xfd, 0x5d, 0xc2, 0x15, 0xc7, 0xee, 0xf1, 0x21, 0xe1, 0x4e, 0x36, 0x77, 0x0d, - 0x95, 0x62, 0xb6, 0x09, 0x52, 0x6e, 0xa4, 0x87, 0xfa, 0x99, 0xa7, 0xc1, 0x62, 0x02, 0x65, 0xff, - 0x79, 0xa0, 0x7e, 0x23, 0x8e, 0xab, 0x69, 0x0f, 0xcd, 0xb9, 0xca, 0xcb, 0xdd, 0xd5, 0x50, 0x7d, - 0xb0, 0xf9, 0x5e, 0x98, 0x3a, 0xfb, 0x3c, 0x9d, 0x9b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xba, - 0x37, 0x25, 0xea, 0x44, 0x01, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/base/api_base.proto b/vendor/google.golang.org/appengine/internal/base/api_base.proto deleted file mode 100644 index 56cd7a3ca..000000000 --- a/vendor/google.golang.org/appengine/internal/base/api_base.proto +++ /dev/null @@ -1,33 +0,0 @@ -// Built-in base types for API calls. Primarily useful as return types. - -syntax = "proto2"; -option go_package = "base"; - -package appengine.base; - -message StringProto { - required string value = 1; -} - -message Integer32Proto { - required int32 value = 1; -} - -message Integer64Proto { - required int64 value = 1; -} - -message BoolProto { - required bool value = 1; -} - -message DoubleProto { - required double value = 1; -} - -message BytesProto { - required bytes value = 1 [ctype=CORD]; -} - -message VoidProto { -} diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go deleted file mode 100644 index 2fb748289..000000000 --- a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go +++ /dev/null @@ -1,4367 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/datastore/datastore_v3.proto - -package datastore - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type Property_Meaning int32 - -const ( - Property_NO_MEANING Property_Meaning = 0 - Property_BLOB Property_Meaning = 14 - Property_TEXT Property_Meaning = 15 - Property_BYTESTRING Property_Meaning = 16 - Property_ATOM_CATEGORY Property_Meaning = 1 - Property_ATOM_LINK Property_Meaning = 2 - Property_ATOM_TITLE Property_Meaning = 3 - Property_ATOM_CONTENT Property_Meaning = 4 - Property_ATOM_SUMMARY Property_Meaning = 5 - Property_ATOM_AUTHOR Property_Meaning = 6 - Property_GD_WHEN Property_Meaning = 7 - Property_GD_EMAIL Property_Meaning = 8 - Property_GEORSS_POINT Property_Meaning = 9 - Property_GD_IM Property_Meaning = 10 - Property_GD_PHONENUMBER Property_Meaning = 11 - Property_GD_POSTALADDRESS Property_Meaning = 12 - Property_GD_RATING Property_Meaning = 13 - Property_BLOBKEY Property_Meaning = 17 - Property_ENTITY_PROTO Property_Meaning = 19 - Property_INDEX_VALUE Property_Meaning = 18 -) - -var Property_Meaning_name = map[int32]string{ - 0: "NO_MEANING", - 14: "BLOB", - 15: "TEXT", - 16: "BYTESTRING", - 1: "ATOM_CATEGORY", - 2: "ATOM_LINK", - 3: "ATOM_TITLE", - 4: "ATOM_CONTENT", - 5: "ATOM_SUMMARY", - 6: "ATOM_AUTHOR", - 7: "GD_WHEN", - 8: "GD_EMAIL", - 9: "GEORSS_POINT", - 10: "GD_IM", - 11: "GD_PHONENUMBER", - 12: "GD_POSTALADDRESS", - 13: "GD_RATING", - 17: "BLOBKEY", - 19: "ENTITY_PROTO", - 18: "INDEX_VALUE", -} -var Property_Meaning_value = map[string]int32{ - "NO_MEANING": 0, - "BLOB": 14, - "TEXT": 15, - "BYTESTRING": 16, - "ATOM_CATEGORY": 1, - "ATOM_LINK": 2, - "ATOM_TITLE": 3, - "ATOM_CONTENT": 4, - "ATOM_SUMMARY": 5, - "ATOM_AUTHOR": 6, - "GD_WHEN": 7, - "GD_EMAIL": 8, - "GEORSS_POINT": 9, - "GD_IM": 10, - "GD_PHONENUMBER": 11, - "GD_POSTALADDRESS": 12, - "GD_RATING": 13, - "BLOBKEY": 17, - "ENTITY_PROTO": 19, - "INDEX_VALUE": 18, -} - -func (x Property_Meaning) Enum() *Property_Meaning { - p := new(Property_Meaning) - *p = x - return p -} -func (x Property_Meaning) String() string { - return proto.EnumName(Property_Meaning_name, int32(x)) -} -func (x *Property_Meaning) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Property_Meaning_value, data, "Property_Meaning") - if err != nil { - return err - } - *x = Property_Meaning(value) - return nil -} -func (Property_Meaning) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{2, 0} -} - -type Property_FtsTokenizationOption int32 - -const ( - Property_HTML Property_FtsTokenizationOption = 1 - Property_ATOM Property_FtsTokenizationOption = 2 -) - -var Property_FtsTokenizationOption_name = map[int32]string{ - 1: "HTML", - 2: "ATOM", -} -var Property_FtsTokenizationOption_value = map[string]int32{ - "HTML": 1, - "ATOM": 2, -} - -func (x Property_FtsTokenizationOption) Enum() *Property_FtsTokenizationOption { - p := new(Property_FtsTokenizationOption) - *p = x - return p -} -func (x Property_FtsTokenizationOption) String() string { - return proto.EnumName(Property_FtsTokenizationOption_name, int32(x)) -} -func (x *Property_FtsTokenizationOption) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Property_FtsTokenizationOption_value, data, "Property_FtsTokenizationOption") - if err != nil { - return err - } - *x = Property_FtsTokenizationOption(value) - return nil -} -func (Property_FtsTokenizationOption) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{2, 1} -} - -type EntityProto_Kind int32 - -const ( - EntityProto_GD_CONTACT EntityProto_Kind = 1 - EntityProto_GD_EVENT EntityProto_Kind = 2 - EntityProto_GD_MESSAGE EntityProto_Kind = 3 -) - -var EntityProto_Kind_name = map[int32]string{ - 1: "GD_CONTACT", - 2: "GD_EVENT", - 3: "GD_MESSAGE", -} -var EntityProto_Kind_value = map[string]int32{ - "GD_CONTACT": 1, - "GD_EVENT": 2, - "GD_MESSAGE": 3, -} - -func (x EntityProto_Kind) Enum() *EntityProto_Kind { - p := new(EntityProto_Kind) - *p = x - return p -} -func (x EntityProto_Kind) String() string { - return proto.EnumName(EntityProto_Kind_name, int32(x)) -} -func (x *EntityProto_Kind) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(EntityProto_Kind_value, data, "EntityProto_Kind") - if err != nil { - return err - } - *x = EntityProto_Kind(value) - return nil -} -func (EntityProto_Kind) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{6, 0} -} - -type Index_Property_Direction int32 - -const ( - Index_Property_ASCENDING Index_Property_Direction = 1 - Index_Property_DESCENDING Index_Property_Direction = 2 -) - -var Index_Property_Direction_name = map[int32]string{ - 1: "ASCENDING", - 2: "DESCENDING", -} -var Index_Property_Direction_value = map[string]int32{ - "ASCENDING": 1, - "DESCENDING": 2, -} - -func (x Index_Property_Direction) Enum() *Index_Property_Direction { - p := new(Index_Property_Direction) - *p = x - return p -} -func (x Index_Property_Direction) String() string { - return proto.EnumName(Index_Property_Direction_name, int32(x)) -} -func (x *Index_Property_Direction) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Index_Property_Direction_value, data, "Index_Property_Direction") - if err != nil { - return err - } - *x = Index_Property_Direction(value) - return nil -} -func (Index_Property_Direction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{8, 0, 0} -} - -type CompositeIndex_State int32 - -const ( - CompositeIndex_WRITE_ONLY CompositeIndex_State = 1 - CompositeIndex_READ_WRITE CompositeIndex_State = 2 - CompositeIndex_DELETED CompositeIndex_State = 3 - CompositeIndex_ERROR CompositeIndex_State = 4 -) - -var CompositeIndex_State_name = map[int32]string{ - 1: "WRITE_ONLY", - 2: "READ_WRITE", - 3: "DELETED", - 4: "ERROR", -} -var CompositeIndex_State_value = map[string]int32{ - "WRITE_ONLY": 1, - "READ_WRITE": 2, - "DELETED": 3, - "ERROR": 4, -} - -func (x CompositeIndex_State) Enum() *CompositeIndex_State { - p := new(CompositeIndex_State) - *p = x - return p -} -func (x CompositeIndex_State) String() string { - return proto.EnumName(CompositeIndex_State_name, int32(x)) -} -func (x *CompositeIndex_State) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(CompositeIndex_State_value, data, "CompositeIndex_State") - if err != nil { - return err - } - *x = CompositeIndex_State(value) - return nil -} -func (CompositeIndex_State) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{9, 0} -} - -type Snapshot_Status int32 - -const ( - Snapshot_INACTIVE Snapshot_Status = 0 - Snapshot_ACTIVE Snapshot_Status = 1 -) - -var Snapshot_Status_name = map[int32]string{ - 0: "INACTIVE", - 1: "ACTIVE", -} -var Snapshot_Status_value = map[string]int32{ - "INACTIVE": 0, - "ACTIVE": 1, -} - -func (x Snapshot_Status) Enum() *Snapshot_Status { - p := new(Snapshot_Status) - *p = x - return p -} -func (x Snapshot_Status) String() string { - return proto.EnumName(Snapshot_Status_name, int32(x)) -} -func (x *Snapshot_Status) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Snapshot_Status_value, data, "Snapshot_Status") - if err != nil { - return err - } - *x = Snapshot_Status(value) - return nil -} -func (Snapshot_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{12, 0} -} - -type Query_Hint int32 - -const ( - Query_ORDER_FIRST Query_Hint = 1 - Query_ANCESTOR_FIRST Query_Hint = 2 - Query_FILTER_FIRST Query_Hint = 3 -) - -var Query_Hint_name = map[int32]string{ - 1: "ORDER_FIRST", - 2: "ANCESTOR_FIRST", - 3: "FILTER_FIRST", -} -var Query_Hint_value = map[string]int32{ - "ORDER_FIRST": 1, - "ANCESTOR_FIRST": 2, - "FILTER_FIRST": 3, -} - -func (x Query_Hint) Enum() *Query_Hint { - p := new(Query_Hint) - *p = x - return p -} -func (x Query_Hint) String() string { - return proto.EnumName(Query_Hint_name, int32(x)) -} -func (x *Query_Hint) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Query_Hint_value, data, "Query_Hint") - if err != nil { - return err - } - *x = Query_Hint(value) - return nil -} -func (Query_Hint) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 0} -} - -type Query_Filter_Operator int32 - -const ( - Query_Filter_LESS_THAN Query_Filter_Operator = 1 - Query_Filter_LESS_THAN_OR_EQUAL Query_Filter_Operator = 2 - Query_Filter_GREATER_THAN Query_Filter_Operator = 3 - Query_Filter_GREATER_THAN_OR_EQUAL Query_Filter_Operator = 4 - Query_Filter_EQUAL Query_Filter_Operator = 5 - Query_Filter_IN Query_Filter_Operator = 6 - Query_Filter_EXISTS Query_Filter_Operator = 7 -) - -var Query_Filter_Operator_name = map[int32]string{ - 1: "LESS_THAN", - 2: "LESS_THAN_OR_EQUAL", - 3: "GREATER_THAN", - 4: "GREATER_THAN_OR_EQUAL", - 5: "EQUAL", - 6: "IN", - 7: "EXISTS", -} -var Query_Filter_Operator_value = map[string]int32{ - "LESS_THAN": 1, - "LESS_THAN_OR_EQUAL": 2, - "GREATER_THAN": 3, - "GREATER_THAN_OR_EQUAL": 4, - "EQUAL": 5, - "IN": 6, - "EXISTS": 7, -} - -func (x Query_Filter_Operator) Enum() *Query_Filter_Operator { - p := new(Query_Filter_Operator) - *p = x - return p -} -func (x Query_Filter_Operator) String() string { - return proto.EnumName(Query_Filter_Operator_name, int32(x)) -} -func (x *Query_Filter_Operator) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Query_Filter_Operator_value, data, "Query_Filter_Operator") - if err != nil { - return err - } - *x = Query_Filter_Operator(value) - return nil -} -func (Query_Filter_Operator) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 0, 0} -} - -type Query_Order_Direction int32 - -const ( - Query_Order_ASCENDING Query_Order_Direction = 1 - Query_Order_DESCENDING Query_Order_Direction = 2 -) - -var Query_Order_Direction_name = map[int32]string{ - 1: "ASCENDING", - 2: "DESCENDING", -} -var Query_Order_Direction_value = map[string]int32{ - "ASCENDING": 1, - "DESCENDING": 2, -} - -func (x Query_Order_Direction) Enum() *Query_Order_Direction { - p := new(Query_Order_Direction) - *p = x - return p -} -func (x Query_Order_Direction) String() string { - return proto.EnumName(Query_Order_Direction_name, int32(x)) -} -func (x *Query_Order_Direction) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Query_Order_Direction_value, data, "Query_Order_Direction") - if err != nil { - return err - } - *x = Query_Order_Direction(value) - return nil -} -func (Query_Order_Direction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 1, 0} -} - -type Error_ErrorCode int32 - -const ( - Error_BAD_REQUEST Error_ErrorCode = 1 - Error_CONCURRENT_TRANSACTION Error_ErrorCode = 2 - Error_INTERNAL_ERROR Error_ErrorCode = 3 - Error_NEED_INDEX Error_ErrorCode = 4 - Error_TIMEOUT Error_ErrorCode = 5 - Error_PERMISSION_DENIED Error_ErrorCode = 6 - Error_BIGTABLE_ERROR Error_ErrorCode = 7 - Error_COMMITTED_BUT_STILL_APPLYING Error_ErrorCode = 8 - Error_CAPABILITY_DISABLED Error_ErrorCode = 9 - Error_TRY_ALTERNATE_BACKEND Error_ErrorCode = 10 - Error_SAFE_TIME_TOO_OLD Error_ErrorCode = 11 -) - -var Error_ErrorCode_name = map[int32]string{ - 1: "BAD_REQUEST", - 2: "CONCURRENT_TRANSACTION", - 3: "INTERNAL_ERROR", - 4: "NEED_INDEX", - 5: "TIMEOUT", - 6: "PERMISSION_DENIED", - 7: "BIGTABLE_ERROR", - 8: "COMMITTED_BUT_STILL_APPLYING", - 9: "CAPABILITY_DISABLED", - 10: "TRY_ALTERNATE_BACKEND", - 11: "SAFE_TIME_TOO_OLD", -} -var Error_ErrorCode_value = map[string]int32{ - "BAD_REQUEST": 1, - "CONCURRENT_TRANSACTION": 2, - "INTERNAL_ERROR": 3, - "NEED_INDEX": 4, - "TIMEOUT": 5, - "PERMISSION_DENIED": 6, - "BIGTABLE_ERROR": 7, - "COMMITTED_BUT_STILL_APPLYING": 8, - "CAPABILITY_DISABLED": 9, - "TRY_ALTERNATE_BACKEND": 10, - "SAFE_TIME_TOO_OLD": 11, -} - -func (x Error_ErrorCode) Enum() *Error_ErrorCode { - p := new(Error_ErrorCode) - *p = x - return p -} -func (x Error_ErrorCode) String() string { - return proto.EnumName(Error_ErrorCode_name, int32(x)) -} -func (x *Error_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Error_ErrorCode_value, data, "Error_ErrorCode") - if err != nil { - return err - } - *x = Error_ErrorCode(value) - return nil -} -func (Error_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{19, 0} -} - -type PutRequest_AutoIdPolicy int32 - -const ( - PutRequest_CURRENT PutRequest_AutoIdPolicy = 0 - PutRequest_SEQUENTIAL PutRequest_AutoIdPolicy = 1 -) - -var PutRequest_AutoIdPolicy_name = map[int32]string{ - 0: "CURRENT", - 1: "SEQUENTIAL", -} -var PutRequest_AutoIdPolicy_value = map[string]int32{ - "CURRENT": 0, - "SEQUENTIAL": 1, -} - -func (x PutRequest_AutoIdPolicy) Enum() *PutRequest_AutoIdPolicy { - p := new(PutRequest_AutoIdPolicy) - *p = x - return p -} -func (x PutRequest_AutoIdPolicy) String() string { - return proto.EnumName(PutRequest_AutoIdPolicy_name, int32(x)) -} -func (x *PutRequest_AutoIdPolicy) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(PutRequest_AutoIdPolicy_value, data, "PutRequest_AutoIdPolicy") - if err != nil { - return err - } - *x = PutRequest_AutoIdPolicy(value) - return nil -} -func (PutRequest_AutoIdPolicy) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{23, 0} -} - -type BeginTransactionRequest_TransactionMode int32 - -const ( - BeginTransactionRequest_UNKNOWN BeginTransactionRequest_TransactionMode = 0 - BeginTransactionRequest_READ_ONLY BeginTransactionRequest_TransactionMode = 1 - BeginTransactionRequest_READ_WRITE BeginTransactionRequest_TransactionMode = 2 -) - -var BeginTransactionRequest_TransactionMode_name = map[int32]string{ - 0: "UNKNOWN", - 1: "READ_ONLY", - 2: "READ_WRITE", -} -var BeginTransactionRequest_TransactionMode_value = map[string]int32{ - "UNKNOWN": 0, - "READ_ONLY": 1, - "READ_WRITE": 2, -} - -func (x BeginTransactionRequest_TransactionMode) Enum() *BeginTransactionRequest_TransactionMode { - p := new(BeginTransactionRequest_TransactionMode) - *p = x - return p -} -func (x BeginTransactionRequest_TransactionMode) String() string { - return proto.EnumName(BeginTransactionRequest_TransactionMode_name, int32(x)) -} -func (x *BeginTransactionRequest_TransactionMode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(BeginTransactionRequest_TransactionMode_value, data, "BeginTransactionRequest_TransactionMode") - if err != nil { - return err - } - *x = BeginTransactionRequest_TransactionMode(value) - return nil -} -func (BeginTransactionRequest_TransactionMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{36, 0} -} - -type Action struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Action) Reset() { *m = Action{} } -func (m *Action) String() string { return proto.CompactTextString(m) } -func (*Action) ProtoMessage() {} -func (*Action) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{0} -} -func (m *Action) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Action.Unmarshal(m, b) -} -func (m *Action) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Action.Marshal(b, m, deterministic) -} -func (dst *Action) XXX_Merge(src proto.Message) { - xxx_messageInfo_Action.Merge(dst, src) -} -func (m *Action) XXX_Size() int { - return xxx_messageInfo_Action.Size(m) -} -func (m *Action) XXX_DiscardUnknown() { - xxx_messageInfo_Action.DiscardUnknown(m) -} - -var xxx_messageInfo_Action proto.InternalMessageInfo - -type PropertyValue struct { - Int64Value *int64 `protobuf:"varint,1,opt,name=int64Value" json:"int64Value,omitempty"` - BooleanValue *bool `protobuf:"varint,2,opt,name=booleanValue" json:"booleanValue,omitempty"` - StringValue *string `protobuf:"bytes,3,opt,name=stringValue" json:"stringValue,omitempty"` - DoubleValue *float64 `protobuf:"fixed64,4,opt,name=doubleValue" json:"doubleValue,omitempty"` - Pointvalue *PropertyValue_PointValue `protobuf:"group,5,opt,name=PointValue,json=pointvalue" json:"pointvalue,omitempty"` - Uservalue *PropertyValue_UserValue `protobuf:"group,8,opt,name=UserValue,json=uservalue" json:"uservalue,omitempty"` - Referencevalue *PropertyValue_ReferenceValue `protobuf:"group,12,opt,name=ReferenceValue,json=referencevalue" json:"referencevalue,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PropertyValue) Reset() { *m = PropertyValue{} } -func (m *PropertyValue) String() string { return proto.CompactTextString(m) } -func (*PropertyValue) ProtoMessage() {} -func (*PropertyValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1} -} -func (m *PropertyValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PropertyValue.Unmarshal(m, b) -} -func (m *PropertyValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PropertyValue.Marshal(b, m, deterministic) -} -func (dst *PropertyValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_PropertyValue.Merge(dst, src) -} -func (m *PropertyValue) XXX_Size() int { - return xxx_messageInfo_PropertyValue.Size(m) -} -func (m *PropertyValue) XXX_DiscardUnknown() { - xxx_messageInfo_PropertyValue.DiscardUnknown(m) -} - -var xxx_messageInfo_PropertyValue proto.InternalMessageInfo - -func (m *PropertyValue) GetInt64Value() int64 { - if m != nil && m.Int64Value != nil { - return *m.Int64Value - } - return 0 -} - -func (m *PropertyValue) GetBooleanValue() bool { - if m != nil && m.BooleanValue != nil { - return *m.BooleanValue - } - return false -} - -func (m *PropertyValue) GetStringValue() string { - if m != nil && m.StringValue != nil { - return *m.StringValue - } - return "" -} - -func (m *PropertyValue) GetDoubleValue() float64 { - if m != nil && m.DoubleValue != nil { - return *m.DoubleValue - } - return 0 -} - -func (m *PropertyValue) GetPointvalue() *PropertyValue_PointValue { - if m != nil { - return m.Pointvalue - } - return nil -} - -func (m *PropertyValue) GetUservalue() *PropertyValue_UserValue { - if m != nil { - return m.Uservalue - } - return nil -} - -func (m *PropertyValue) GetReferencevalue() *PropertyValue_ReferenceValue { - if m != nil { - return m.Referencevalue - } - return nil -} - -type PropertyValue_PointValue struct { - X *float64 `protobuf:"fixed64,6,req,name=x" json:"x,omitempty"` - Y *float64 `protobuf:"fixed64,7,req,name=y" json:"y,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PropertyValue_PointValue) Reset() { *m = PropertyValue_PointValue{} } -func (m *PropertyValue_PointValue) String() string { return proto.CompactTextString(m) } -func (*PropertyValue_PointValue) ProtoMessage() {} -func (*PropertyValue_PointValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 0} -} -func (m *PropertyValue_PointValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PropertyValue_PointValue.Unmarshal(m, b) -} -func (m *PropertyValue_PointValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PropertyValue_PointValue.Marshal(b, m, deterministic) -} -func (dst *PropertyValue_PointValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_PropertyValue_PointValue.Merge(dst, src) -} -func (m *PropertyValue_PointValue) XXX_Size() int { - return xxx_messageInfo_PropertyValue_PointValue.Size(m) -} -func (m *PropertyValue_PointValue) XXX_DiscardUnknown() { - xxx_messageInfo_PropertyValue_PointValue.DiscardUnknown(m) -} - -var xxx_messageInfo_PropertyValue_PointValue proto.InternalMessageInfo - -func (m *PropertyValue_PointValue) GetX() float64 { - if m != nil && m.X != nil { - return *m.X - } - return 0 -} - -func (m *PropertyValue_PointValue) GetY() float64 { - if m != nil && m.Y != nil { - return *m.Y - } - return 0 -} - -type PropertyValue_UserValue struct { - Email *string `protobuf:"bytes,9,req,name=email" json:"email,omitempty"` - AuthDomain *string `protobuf:"bytes,10,req,name=auth_domain,json=authDomain" json:"auth_domain,omitempty"` - Nickname *string `protobuf:"bytes,11,opt,name=nickname" json:"nickname,omitempty"` - FederatedIdentity *string `protobuf:"bytes,21,opt,name=federated_identity,json=federatedIdentity" json:"federated_identity,omitempty"` - FederatedProvider *string `protobuf:"bytes,22,opt,name=federated_provider,json=federatedProvider" json:"federated_provider,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PropertyValue_UserValue) Reset() { *m = PropertyValue_UserValue{} } -func (m *PropertyValue_UserValue) String() string { return proto.CompactTextString(m) } -func (*PropertyValue_UserValue) ProtoMessage() {} -func (*PropertyValue_UserValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 1} -} -func (m *PropertyValue_UserValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PropertyValue_UserValue.Unmarshal(m, b) -} -func (m *PropertyValue_UserValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PropertyValue_UserValue.Marshal(b, m, deterministic) -} -func (dst *PropertyValue_UserValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_PropertyValue_UserValue.Merge(dst, src) -} -func (m *PropertyValue_UserValue) XXX_Size() int { - return xxx_messageInfo_PropertyValue_UserValue.Size(m) -} -func (m *PropertyValue_UserValue) XXX_DiscardUnknown() { - xxx_messageInfo_PropertyValue_UserValue.DiscardUnknown(m) -} - -var xxx_messageInfo_PropertyValue_UserValue proto.InternalMessageInfo - -func (m *PropertyValue_UserValue) GetEmail() string { - if m != nil && m.Email != nil { - return *m.Email - } - return "" -} - -func (m *PropertyValue_UserValue) GetAuthDomain() string { - if m != nil && m.AuthDomain != nil { - return *m.AuthDomain - } - return "" -} - -func (m *PropertyValue_UserValue) GetNickname() string { - if m != nil && m.Nickname != nil { - return *m.Nickname - } - return "" -} - -func (m *PropertyValue_UserValue) GetFederatedIdentity() string { - if m != nil && m.FederatedIdentity != nil { - return *m.FederatedIdentity - } - return "" -} - -func (m *PropertyValue_UserValue) GetFederatedProvider() string { - if m != nil && m.FederatedProvider != nil { - return *m.FederatedProvider - } - return "" -} - -type PropertyValue_ReferenceValue struct { - App *string `protobuf:"bytes,13,req,name=app" json:"app,omitempty"` - NameSpace *string `protobuf:"bytes,20,opt,name=name_space,json=nameSpace" json:"name_space,omitempty"` - Pathelement []*PropertyValue_ReferenceValue_PathElement `protobuf:"group,14,rep,name=PathElement,json=pathelement" json:"pathelement,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PropertyValue_ReferenceValue) Reset() { *m = PropertyValue_ReferenceValue{} } -func (m *PropertyValue_ReferenceValue) String() string { return proto.CompactTextString(m) } -func (*PropertyValue_ReferenceValue) ProtoMessage() {} -func (*PropertyValue_ReferenceValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 2} -} -func (m *PropertyValue_ReferenceValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PropertyValue_ReferenceValue.Unmarshal(m, b) -} -func (m *PropertyValue_ReferenceValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PropertyValue_ReferenceValue.Marshal(b, m, deterministic) -} -func (dst *PropertyValue_ReferenceValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_PropertyValue_ReferenceValue.Merge(dst, src) -} -func (m *PropertyValue_ReferenceValue) XXX_Size() int { - return xxx_messageInfo_PropertyValue_ReferenceValue.Size(m) -} -func (m *PropertyValue_ReferenceValue) XXX_DiscardUnknown() { - xxx_messageInfo_PropertyValue_ReferenceValue.DiscardUnknown(m) -} - -var xxx_messageInfo_PropertyValue_ReferenceValue proto.InternalMessageInfo - -func (m *PropertyValue_ReferenceValue) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -func (m *PropertyValue_ReferenceValue) GetNameSpace() string { - if m != nil && m.NameSpace != nil { - return *m.NameSpace - } - return "" -} - -func (m *PropertyValue_ReferenceValue) GetPathelement() []*PropertyValue_ReferenceValue_PathElement { - if m != nil { - return m.Pathelement - } - return nil -} - -type PropertyValue_ReferenceValue_PathElement struct { - Type *string `protobuf:"bytes,15,req,name=type" json:"type,omitempty"` - Id *int64 `protobuf:"varint,16,opt,name=id" json:"id,omitempty"` - Name *string `protobuf:"bytes,17,opt,name=name" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PropertyValue_ReferenceValue_PathElement) Reset() { - *m = PropertyValue_ReferenceValue_PathElement{} -} -func (m *PropertyValue_ReferenceValue_PathElement) String() string { return proto.CompactTextString(m) } -func (*PropertyValue_ReferenceValue_PathElement) ProtoMessage() {} -func (*PropertyValue_ReferenceValue_PathElement) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{1, 2, 0} -} -func (m *PropertyValue_ReferenceValue_PathElement) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Unmarshal(m, b) -} -func (m *PropertyValue_ReferenceValue_PathElement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Marshal(b, m, deterministic) -} -func (dst *PropertyValue_ReferenceValue_PathElement) XXX_Merge(src proto.Message) { - xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Merge(dst, src) -} -func (m *PropertyValue_ReferenceValue_PathElement) XXX_Size() int { - return xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.Size(m) -} -func (m *PropertyValue_ReferenceValue_PathElement) XXX_DiscardUnknown() { - xxx_messageInfo_PropertyValue_ReferenceValue_PathElement.DiscardUnknown(m) -} - -var xxx_messageInfo_PropertyValue_ReferenceValue_PathElement proto.InternalMessageInfo - -func (m *PropertyValue_ReferenceValue_PathElement) GetType() string { - if m != nil && m.Type != nil { - return *m.Type - } - return "" -} - -func (m *PropertyValue_ReferenceValue_PathElement) GetId() int64 { - if m != nil && m.Id != nil { - return *m.Id - } - return 0 -} - -func (m *PropertyValue_ReferenceValue_PathElement) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -type Property struct { - Meaning *Property_Meaning `protobuf:"varint,1,opt,name=meaning,enum=appengine.Property_Meaning,def=0" json:"meaning,omitempty"` - MeaningUri *string `protobuf:"bytes,2,opt,name=meaning_uri,json=meaningUri" json:"meaning_uri,omitempty"` - Name *string `protobuf:"bytes,3,req,name=name" json:"name,omitempty"` - Value *PropertyValue `protobuf:"bytes,5,req,name=value" json:"value,omitempty"` - Multiple *bool `protobuf:"varint,4,req,name=multiple" json:"multiple,omitempty"` - Searchable *bool `protobuf:"varint,6,opt,name=searchable,def=0" json:"searchable,omitempty"` - FtsTokenizationOption *Property_FtsTokenizationOption `protobuf:"varint,8,opt,name=fts_tokenization_option,json=ftsTokenizationOption,enum=appengine.Property_FtsTokenizationOption" json:"fts_tokenization_option,omitempty"` - Locale *string `protobuf:"bytes,9,opt,name=locale,def=en" json:"locale,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Property) Reset() { *m = Property{} } -func (m *Property) String() string { return proto.CompactTextString(m) } -func (*Property) ProtoMessage() {} -func (*Property) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{2} -} -func (m *Property) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Property.Unmarshal(m, b) -} -func (m *Property) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Property.Marshal(b, m, deterministic) -} -func (dst *Property) XXX_Merge(src proto.Message) { - xxx_messageInfo_Property.Merge(dst, src) -} -func (m *Property) XXX_Size() int { - return xxx_messageInfo_Property.Size(m) -} -func (m *Property) XXX_DiscardUnknown() { - xxx_messageInfo_Property.DiscardUnknown(m) -} - -var xxx_messageInfo_Property proto.InternalMessageInfo - -const Default_Property_Meaning Property_Meaning = Property_NO_MEANING -const Default_Property_Searchable bool = false -const Default_Property_Locale string = "en" - -func (m *Property) GetMeaning() Property_Meaning { - if m != nil && m.Meaning != nil { - return *m.Meaning - } - return Default_Property_Meaning -} - -func (m *Property) GetMeaningUri() string { - if m != nil && m.MeaningUri != nil { - return *m.MeaningUri - } - return "" -} - -func (m *Property) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *Property) GetValue() *PropertyValue { - if m != nil { - return m.Value - } - return nil -} - -func (m *Property) GetMultiple() bool { - if m != nil && m.Multiple != nil { - return *m.Multiple - } - return false -} - -func (m *Property) GetSearchable() bool { - if m != nil && m.Searchable != nil { - return *m.Searchable - } - return Default_Property_Searchable -} - -func (m *Property) GetFtsTokenizationOption() Property_FtsTokenizationOption { - if m != nil && m.FtsTokenizationOption != nil { - return *m.FtsTokenizationOption - } - return Property_HTML -} - -func (m *Property) GetLocale() string { - if m != nil && m.Locale != nil { - return *m.Locale - } - return Default_Property_Locale -} - -type Path struct { - Element []*Path_Element `protobuf:"group,1,rep,name=Element,json=element" json:"element,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Path) Reset() { *m = Path{} } -func (m *Path) String() string { return proto.CompactTextString(m) } -func (*Path) ProtoMessage() {} -func (*Path) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{3} -} -func (m *Path) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Path.Unmarshal(m, b) -} -func (m *Path) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Path.Marshal(b, m, deterministic) -} -func (dst *Path) XXX_Merge(src proto.Message) { - xxx_messageInfo_Path.Merge(dst, src) -} -func (m *Path) XXX_Size() int { - return xxx_messageInfo_Path.Size(m) -} -func (m *Path) XXX_DiscardUnknown() { - xxx_messageInfo_Path.DiscardUnknown(m) -} - -var xxx_messageInfo_Path proto.InternalMessageInfo - -func (m *Path) GetElement() []*Path_Element { - if m != nil { - return m.Element - } - return nil -} - -type Path_Element struct { - Type *string `protobuf:"bytes,2,req,name=type" json:"type,omitempty"` - Id *int64 `protobuf:"varint,3,opt,name=id" json:"id,omitempty"` - Name *string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Path_Element) Reset() { *m = Path_Element{} } -func (m *Path_Element) String() string { return proto.CompactTextString(m) } -func (*Path_Element) ProtoMessage() {} -func (*Path_Element) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{3, 0} -} -func (m *Path_Element) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Path_Element.Unmarshal(m, b) -} -func (m *Path_Element) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Path_Element.Marshal(b, m, deterministic) -} -func (dst *Path_Element) XXX_Merge(src proto.Message) { - xxx_messageInfo_Path_Element.Merge(dst, src) -} -func (m *Path_Element) XXX_Size() int { - return xxx_messageInfo_Path_Element.Size(m) -} -func (m *Path_Element) XXX_DiscardUnknown() { - xxx_messageInfo_Path_Element.DiscardUnknown(m) -} - -var xxx_messageInfo_Path_Element proto.InternalMessageInfo - -func (m *Path_Element) GetType() string { - if m != nil && m.Type != nil { - return *m.Type - } - return "" -} - -func (m *Path_Element) GetId() int64 { - if m != nil && m.Id != nil { - return *m.Id - } - return 0 -} - -func (m *Path_Element) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -type Reference struct { - App *string `protobuf:"bytes,13,req,name=app" json:"app,omitempty"` - NameSpace *string `protobuf:"bytes,20,opt,name=name_space,json=nameSpace" json:"name_space,omitempty"` - Path *Path `protobuf:"bytes,14,req,name=path" json:"path,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Reference) Reset() { *m = Reference{} } -func (m *Reference) String() string { return proto.CompactTextString(m) } -func (*Reference) ProtoMessage() {} -func (*Reference) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{4} -} -func (m *Reference) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Reference.Unmarshal(m, b) -} -func (m *Reference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Reference.Marshal(b, m, deterministic) -} -func (dst *Reference) XXX_Merge(src proto.Message) { - xxx_messageInfo_Reference.Merge(dst, src) -} -func (m *Reference) XXX_Size() int { - return xxx_messageInfo_Reference.Size(m) -} -func (m *Reference) XXX_DiscardUnknown() { - xxx_messageInfo_Reference.DiscardUnknown(m) -} - -var xxx_messageInfo_Reference proto.InternalMessageInfo - -func (m *Reference) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -func (m *Reference) GetNameSpace() string { - if m != nil && m.NameSpace != nil { - return *m.NameSpace - } - return "" -} - -func (m *Reference) GetPath() *Path { - if m != nil { - return m.Path - } - return nil -} - -type User struct { - Email *string `protobuf:"bytes,1,req,name=email" json:"email,omitempty"` - AuthDomain *string `protobuf:"bytes,2,req,name=auth_domain,json=authDomain" json:"auth_domain,omitempty"` - Nickname *string `protobuf:"bytes,3,opt,name=nickname" json:"nickname,omitempty"` - FederatedIdentity *string `protobuf:"bytes,6,opt,name=federated_identity,json=federatedIdentity" json:"federated_identity,omitempty"` - FederatedProvider *string `protobuf:"bytes,7,opt,name=federated_provider,json=federatedProvider" json:"federated_provider,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *User) Reset() { *m = User{} } -func (m *User) String() string { return proto.CompactTextString(m) } -func (*User) ProtoMessage() {} -func (*User) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{5} -} -func (m *User) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_User.Unmarshal(m, b) -} -func (m *User) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_User.Marshal(b, m, deterministic) -} -func (dst *User) XXX_Merge(src proto.Message) { - xxx_messageInfo_User.Merge(dst, src) -} -func (m *User) XXX_Size() int { - return xxx_messageInfo_User.Size(m) -} -func (m *User) XXX_DiscardUnknown() { - xxx_messageInfo_User.DiscardUnknown(m) -} - -var xxx_messageInfo_User proto.InternalMessageInfo - -func (m *User) GetEmail() string { - if m != nil && m.Email != nil { - return *m.Email - } - return "" -} - -func (m *User) GetAuthDomain() string { - if m != nil && m.AuthDomain != nil { - return *m.AuthDomain - } - return "" -} - -func (m *User) GetNickname() string { - if m != nil && m.Nickname != nil { - return *m.Nickname - } - return "" -} - -func (m *User) GetFederatedIdentity() string { - if m != nil && m.FederatedIdentity != nil { - return *m.FederatedIdentity - } - return "" -} - -func (m *User) GetFederatedProvider() string { - if m != nil && m.FederatedProvider != nil { - return *m.FederatedProvider - } - return "" -} - -type EntityProto struct { - Key *Reference `protobuf:"bytes,13,req,name=key" json:"key,omitempty"` - EntityGroup *Path `protobuf:"bytes,16,req,name=entity_group,json=entityGroup" json:"entity_group,omitempty"` - Owner *User `protobuf:"bytes,17,opt,name=owner" json:"owner,omitempty"` - Kind *EntityProto_Kind `protobuf:"varint,4,opt,name=kind,enum=appengine.EntityProto_Kind" json:"kind,omitempty"` - KindUri *string `protobuf:"bytes,5,opt,name=kind_uri,json=kindUri" json:"kind_uri,omitempty"` - Property []*Property `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"` - RawProperty []*Property `protobuf:"bytes,15,rep,name=raw_property,json=rawProperty" json:"raw_property,omitempty"` - Rank *int32 `protobuf:"varint,18,opt,name=rank" json:"rank,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EntityProto) Reset() { *m = EntityProto{} } -func (m *EntityProto) String() string { return proto.CompactTextString(m) } -func (*EntityProto) ProtoMessage() {} -func (*EntityProto) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{6} -} -func (m *EntityProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_EntityProto.Unmarshal(m, b) -} -func (m *EntityProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_EntityProto.Marshal(b, m, deterministic) -} -func (dst *EntityProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_EntityProto.Merge(dst, src) -} -func (m *EntityProto) XXX_Size() int { - return xxx_messageInfo_EntityProto.Size(m) -} -func (m *EntityProto) XXX_DiscardUnknown() { - xxx_messageInfo_EntityProto.DiscardUnknown(m) -} - -var xxx_messageInfo_EntityProto proto.InternalMessageInfo - -func (m *EntityProto) GetKey() *Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *EntityProto) GetEntityGroup() *Path { - if m != nil { - return m.EntityGroup - } - return nil -} - -func (m *EntityProto) GetOwner() *User { - if m != nil { - return m.Owner - } - return nil -} - -func (m *EntityProto) GetKind() EntityProto_Kind { - if m != nil && m.Kind != nil { - return *m.Kind - } - return EntityProto_GD_CONTACT -} - -func (m *EntityProto) GetKindUri() string { - if m != nil && m.KindUri != nil { - return *m.KindUri - } - return "" -} - -func (m *EntityProto) GetProperty() []*Property { - if m != nil { - return m.Property - } - return nil -} - -func (m *EntityProto) GetRawProperty() []*Property { - if m != nil { - return m.RawProperty - } - return nil -} - -func (m *EntityProto) GetRank() int32 { - if m != nil && m.Rank != nil { - return *m.Rank - } - return 0 -} - -type CompositeProperty struct { - IndexId *int64 `protobuf:"varint,1,req,name=index_id,json=indexId" json:"index_id,omitempty"` - Value []string `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompositeProperty) Reset() { *m = CompositeProperty{} } -func (m *CompositeProperty) String() string { return proto.CompactTextString(m) } -func (*CompositeProperty) ProtoMessage() {} -func (*CompositeProperty) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{7} -} -func (m *CompositeProperty) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompositeProperty.Unmarshal(m, b) -} -func (m *CompositeProperty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompositeProperty.Marshal(b, m, deterministic) -} -func (dst *CompositeProperty) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompositeProperty.Merge(dst, src) -} -func (m *CompositeProperty) XXX_Size() int { - return xxx_messageInfo_CompositeProperty.Size(m) -} -func (m *CompositeProperty) XXX_DiscardUnknown() { - xxx_messageInfo_CompositeProperty.DiscardUnknown(m) -} - -var xxx_messageInfo_CompositeProperty proto.InternalMessageInfo - -func (m *CompositeProperty) GetIndexId() int64 { - if m != nil && m.IndexId != nil { - return *m.IndexId - } - return 0 -} - -func (m *CompositeProperty) GetValue() []string { - if m != nil { - return m.Value - } - return nil -} - -type Index struct { - EntityType *string `protobuf:"bytes,1,req,name=entity_type,json=entityType" json:"entity_type,omitempty"` - Ancestor *bool `protobuf:"varint,5,req,name=ancestor" json:"ancestor,omitempty"` - Property []*Index_Property `protobuf:"group,2,rep,name=Property,json=property" json:"property,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Index) Reset() { *m = Index{} } -func (m *Index) String() string { return proto.CompactTextString(m) } -func (*Index) ProtoMessage() {} -func (*Index) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{8} -} -func (m *Index) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Index.Unmarshal(m, b) -} -func (m *Index) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Index.Marshal(b, m, deterministic) -} -func (dst *Index) XXX_Merge(src proto.Message) { - xxx_messageInfo_Index.Merge(dst, src) -} -func (m *Index) XXX_Size() int { - return xxx_messageInfo_Index.Size(m) -} -func (m *Index) XXX_DiscardUnknown() { - xxx_messageInfo_Index.DiscardUnknown(m) -} - -var xxx_messageInfo_Index proto.InternalMessageInfo - -func (m *Index) GetEntityType() string { - if m != nil && m.EntityType != nil { - return *m.EntityType - } - return "" -} - -func (m *Index) GetAncestor() bool { - if m != nil && m.Ancestor != nil { - return *m.Ancestor - } - return false -} - -func (m *Index) GetProperty() []*Index_Property { - if m != nil { - return m.Property - } - return nil -} - -type Index_Property struct { - Name *string `protobuf:"bytes,3,req,name=name" json:"name,omitempty"` - Direction *Index_Property_Direction `protobuf:"varint,4,opt,name=direction,enum=appengine.Index_Property_Direction,def=1" json:"direction,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Index_Property) Reset() { *m = Index_Property{} } -func (m *Index_Property) String() string { return proto.CompactTextString(m) } -func (*Index_Property) ProtoMessage() {} -func (*Index_Property) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{8, 0} -} -func (m *Index_Property) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Index_Property.Unmarshal(m, b) -} -func (m *Index_Property) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Index_Property.Marshal(b, m, deterministic) -} -func (dst *Index_Property) XXX_Merge(src proto.Message) { - xxx_messageInfo_Index_Property.Merge(dst, src) -} -func (m *Index_Property) XXX_Size() int { - return xxx_messageInfo_Index_Property.Size(m) -} -func (m *Index_Property) XXX_DiscardUnknown() { - xxx_messageInfo_Index_Property.DiscardUnknown(m) -} - -var xxx_messageInfo_Index_Property proto.InternalMessageInfo - -const Default_Index_Property_Direction Index_Property_Direction = Index_Property_ASCENDING - -func (m *Index_Property) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *Index_Property) GetDirection() Index_Property_Direction { - if m != nil && m.Direction != nil { - return *m.Direction - } - return Default_Index_Property_Direction -} - -type CompositeIndex struct { - AppId *string `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"` - Id *int64 `protobuf:"varint,2,req,name=id" json:"id,omitempty"` - Definition *Index `protobuf:"bytes,3,req,name=definition" json:"definition,omitempty"` - State *CompositeIndex_State `protobuf:"varint,4,req,name=state,enum=appengine.CompositeIndex_State" json:"state,omitempty"` - OnlyUseIfRequired *bool `protobuf:"varint,6,opt,name=only_use_if_required,json=onlyUseIfRequired,def=0" json:"only_use_if_required,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompositeIndex) Reset() { *m = CompositeIndex{} } -func (m *CompositeIndex) String() string { return proto.CompactTextString(m) } -func (*CompositeIndex) ProtoMessage() {} -func (*CompositeIndex) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{9} -} -func (m *CompositeIndex) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompositeIndex.Unmarshal(m, b) -} -func (m *CompositeIndex) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompositeIndex.Marshal(b, m, deterministic) -} -func (dst *CompositeIndex) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompositeIndex.Merge(dst, src) -} -func (m *CompositeIndex) XXX_Size() int { - return xxx_messageInfo_CompositeIndex.Size(m) -} -func (m *CompositeIndex) XXX_DiscardUnknown() { - xxx_messageInfo_CompositeIndex.DiscardUnknown(m) -} - -var xxx_messageInfo_CompositeIndex proto.InternalMessageInfo - -const Default_CompositeIndex_OnlyUseIfRequired bool = false - -func (m *CompositeIndex) GetAppId() string { - if m != nil && m.AppId != nil { - return *m.AppId - } - return "" -} - -func (m *CompositeIndex) GetId() int64 { - if m != nil && m.Id != nil { - return *m.Id - } - return 0 -} - -func (m *CompositeIndex) GetDefinition() *Index { - if m != nil { - return m.Definition - } - return nil -} - -func (m *CompositeIndex) GetState() CompositeIndex_State { - if m != nil && m.State != nil { - return *m.State - } - return CompositeIndex_WRITE_ONLY -} - -func (m *CompositeIndex) GetOnlyUseIfRequired() bool { - if m != nil && m.OnlyUseIfRequired != nil { - return *m.OnlyUseIfRequired - } - return Default_CompositeIndex_OnlyUseIfRequired -} - -type IndexPostfix struct { - IndexValue []*IndexPostfix_IndexValue `protobuf:"bytes,1,rep,name=index_value,json=indexValue" json:"index_value,omitempty"` - Key *Reference `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` - Before *bool `protobuf:"varint,3,opt,name=before,def=1" json:"before,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *IndexPostfix) Reset() { *m = IndexPostfix{} } -func (m *IndexPostfix) String() string { return proto.CompactTextString(m) } -func (*IndexPostfix) ProtoMessage() {} -func (*IndexPostfix) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{10} -} -func (m *IndexPostfix) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_IndexPostfix.Unmarshal(m, b) -} -func (m *IndexPostfix) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_IndexPostfix.Marshal(b, m, deterministic) -} -func (dst *IndexPostfix) XXX_Merge(src proto.Message) { - xxx_messageInfo_IndexPostfix.Merge(dst, src) -} -func (m *IndexPostfix) XXX_Size() int { - return xxx_messageInfo_IndexPostfix.Size(m) -} -func (m *IndexPostfix) XXX_DiscardUnknown() { - xxx_messageInfo_IndexPostfix.DiscardUnknown(m) -} - -var xxx_messageInfo_IndexPostfix proto.InternalMessageInfo - -const Default_IndexPostfix_Before bool = true - -func (m *IndexPostfix) GetIndexValue() []*IndexPostfix_IndexValue { - if m != nil { - return m.IndexValue - } - return nil -} - -func (m *IndexPostfix) GetKey() *Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *IndexPostfix) GetBefore() bool { - if m != nil && m.Before != nil { - return *m.Before - } - return Default_IndexPostfix_Before -} - -type IndexPostfix_IndexValue struct { - PropertyName *string `protobuf:"bytes,1,req,name=property_name,json=propertyName" json:"property_name,omitempty"` - Value *PropertyValue `protobuf:"bytes,2,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *IndexPostfix_IndexValue) Reset() { *m = IndexPostfix_IndexValue{} } -func (m *IndexPostfix_IndexValue) String() string { return proto.CompactTextString(m) } -func (*IndexPostfix_IndexValue) ProtoMessage() {} -func (*IndexPostfix_IndexValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{10, 0} -} -func (m *IndexPostfix_IndexValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_IndexPostfix_IndexValue.Unmarshal(m, b) -} -func (m *IndexPostfix_IndexValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_IndexPostfix_IndexValue.Marshal(b, m, deterministic) -} -func (dst *IndexPostfix_IndexValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_IndexPostfix_IndexValue.Merge(dst, src) -} -func (m *IndexPostfix_IndexValue) XXX_Size() int { - return xxx_messageInfo_IndexPostfix_IndexValue.Size(m) -} -func (m *IndexPostfix_IndexValue) XXX_DiscardUnknown() { - xxx_messageInfo_IndexPostfix_IndexValue.DiscardUnknown(m) -} - -var xxx_messageInfo_IndexPostfix_IndexValue proto.InternalMessageInfo - -func (m *IndexPostfix_IndexValue) GetPropertyName() string { - if m != nil && m.PropertyName != nil { - return *m.PropertyName - } - return "" -} - -func (m *IndexPostfix_IndexValue) GetValue() *PropertyValue { - if m != nil { - return m.Value - } - return nil -} - -type IndexPosition struct { - Key *string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` - Before *bool `protobuf:"varint,2,opt,name=before,def=1" json:"before,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *IndexPosition) Reset() { *m = IndexPosition{} } -func (m *IndexPosition) String() string { return proto.CompactTextString(m) } -func (*IndexPosition) ProtoMessage() {} -func (*IndexPosition) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{11} -} -func (m *IndexPosition) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_IndexPosition.Unmarshal(m, b) -} -func (m *IndexPosition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_IndexPosition.Marshal(b, m, deterministic) -} -func (dst *IndexPosition) XXX_Merge(src proto.Message) { - xxx_messageInfo_IndexPosition.Merge(dst, src) -} -func (m *IndexPosition) XXX_Size() int { - return xxx_messageInfo_IndexPosition.Size(m) -} -func (m *IndexPosition) XXX_DiscardUnknown() { - xxx_messageInfo_IndexPosition.DiscardUnknown(m) -} - -var xxx_messageInfo_IndexPosition proto.InternalMessageInfo - -const Default_IndexPosition_Before bool = true - -func (m *IndexPosition) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *IndexPosition) GetBefore() bool { - if m != nil && m.Before != nil { - return *m.Before - } - return Default_IndexPosition_Before -} - -type Snapshot struct { - Ts *int64 `protobuf:"varint,1,req,name=ts" json:"ts,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Snapshot) Reset() { *m = Snapshot{} } -func (m *Snapshot) String() string { return proto.CompactTextString(m) } -func (*Snapshot) ProtoMessage() {} -func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{12} -} -func (m *Snapshot) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Snapshot.Unmarshal(m, b) -} -func (m *Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Snapshot.Marshal(b, m, deterministic) -} -func (dst *Snapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_Snapshot.Merge(dst, src) -} -func (m *Snapshot) XXX_Size() int { - return xxx_messageInfo_Snapshot.Size(m) -} -func (m *Snapshot) XXX_DiscardUnknown() { - xxx_messageInfo_Snapshot.DiscardUnknown(m) -} - -var xxx_messageInfo_Snapshot proto.InternalMessageInfo - -func (m *Snapshot) GetTs() int64 { - if m != nil && m.Ts != nil { - return *m.Ts - } - return 0 -} - -type InternalHeader struct { - Qos *string `protobuf:"bytes,1,opt,name=qos" json:"qos,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *InternalHeader) Reset() { *m = InternalHeader{} } -func (m *InternalHeader) String() string { return proto.CompactTextString(m) } -func (*InternalHeader) ProtoMessage() {} -func (*InternalHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{13} -} -func (m *InternalHeader) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_InternalHeader.Unmarshal(m, b) -} -func (m *InternalHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_InternalHeader.Marshal(b, m, deterministic) -} -func (dst *InternalHeader) XXX_Merge(src proto.Message) { - xxx_messageInfo_InternalHeader.Merge(dst, src) -} -func (m *InternalHeader) XXX_Size() int { - return xxx_messageInfo_InternalHeader.Size(m) -} -func (m *InternalHeader) XXX_DiscardUnknown() { - xxx_messageInfo_InternalHeader.DiscardUnknown(m) -} - -var xxx_messageInfo_InternalHeader proto.InternalMessageInfo - -func (m *InternalHeader) GetQos() string { - if m != nil && m.Qos != nil { - return *m.Qos - } - return "" -} - -type Transaction struct { - Header *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"` - Handle *uint64 `protobuf:"fixed64,1,req,name=handle" json:"handle,omitempty"` - App *string `protobuf:"bytes,2,req,name=app" json:"app,omitempty"` - MarkChanges *bool `protobuf:"varint,3,opt,name=mark_changes,json=markChanges,def=0" json:"mark_changes,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Transaction) Reset() { *m = Transaction{} } -func (m *Transaction) String() string { return proto.CompactTextString(m) } -func (*Transaction) ProtoMessage() {} -func (*Transaction) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{14} -} -func (m *Transaction) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Transaction.Unmarshal(m, b) -} -func (m *Transaction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Transaction.Marshal(b, m, deterministic) -} -func (dst *Transaction) XXX_Merge(src proto.Message) { - xxx_messageInfo_Transaction.Merge(dst, src) -} -func (m *Transaction) XXX_Size() int { - return xxx_messageInfo_Transaction.Size(m) -} -func (m *Transaction) XXX_DiscardUnknown() { - xxx_messageInfo_Transaction.DiscardUnknown(m) -} - -var xxx_messageInfo_Transaction proto.InternalMessageInfo - -const Default_Transaction_MarkChanges bool = false - -func (m *Transaction) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *Transaction) GetHandle() uint64 { - if m != nil && m.Handle != nil { - return *m.Handle - } - return 0 -} - -func (m *Transaction) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -func (m *Transaction) GetMarkChanges() bool { - if m != nil && m.MarkChanges != nil { - return *m.MarkChanges - } - return Default_Transaction_MarkChanges -} - -type Query struct { - Header *InternalHeader `protobuf:"bytes,39,opt,name=header" json:"header,omitempty"` - App *string `protobuf:"bytes,1,req,name=app" json:"app,omitempty"` - NameSpace *string `protobuf:"bytes,29,opt,name=name_space,json=nameSpace" json:"name_space,omitempty"` - Kind *string `protobuf:"bytes,3,opt,name=kind" json:"kind,omitempty"` - Ancestor *Reference `protobuf:"bytes,17,opt,name=ancestor" json:"ancestor,omitempty"` - Filter []*Query_Filter `protobuf:"group,4,rep,name=Filter,json=filter" json:"filter,omitempty"` - SearchQuery *string `protobuf:"bytes,8,opt,name=search_query,json=searchQuery" json:"search_query,omitempty"` - Order []*Query_Order `protobuf:"group,9,rep,name=Order,json=order" json:"order,omitempty"` - Hint *Query_Hint `protobuf:"varint,18,opt,name=hint,enum=appengine.Query_Hint" json:"hint,omitempty"` - Count *int32 `protobuf:"varint,23,opt,name=count" json:"count,omitempty"` - Offset *int32 `protobuf:"varint,12,opt,name=offset,def=0" json:"offset,omitempty"` - Limit *int32 `protobuf:"varint,16,opt,name=limit" json:"limit,omitempty"` - CompiledCursor *CompiledCursor `protobuf:"bytes,30,opt,name=compiled_cursor,json=compiledCursor" json:"compiled_cursor,omitempty"` - EndCompiledCursor *CompiledCursor `protobuf:"bytes,31,opt,name=end_compiled_cursor,json=endCompiledCursor" json:"end_compiled_cursor,omitempty"` - CompositeIndex []*CompositeIndex `protobuf:"bytes,19,rep,name=composite_index,json=compositeIndex" json:"composite_index,omitempty"` - RequirePerfectPlan *bool `protobuf:"varint,20,opt,name=require_perfect_plan,json=requirePerfectPlan,def=0" json:"require_perfect_plan,omitempty"` - KeysOnly *bool `protobuf:"varint,21,opt,name=keys_only,json=keysOnly,def=0" json:"keys_only,omitempty"` - Transaction *Transaction `protobuf:"bytes,22,opt,name=transaction" json:"transaction,omitempty"` - Compile *bool `protobuf:"varint,25,opt,name=compile,def=0" json:"compile,omitempty"` - FailoverMs *int64 `protobuf:"varint,26,opt,name=failover_ms,json=failoverMs" json:"failover_ms,omitempty"` - Strong *bool `protobuf:"varint,32,opt,name=strong" json:"strong,omitempty"` - PropertyName []string `protobuf:"bytes,33,rep,name=property_name,json=propertyName" json:"property_name,omitempty"` - GroupByPropertyName []string `protobuf:"bytes,34,rep,name=group_by_property_name,json=groupByPropertyName" json:"group_by_property_name,omitempty"` - Distinct *bool `protobuf:"varint,24,opt,name=distinct" json:"distinct,omitempty"` - MinSafeTimeSeconds *int64 `protobuf:"varint,35,opt,name=min_safe_time_seconds,json=minSafeTimeSeconds" json:"min_safe_time_seconds,omitempty"` - SafeReplicaName []string `protobuf:"bytes,36,rep,name=safe_replica_name,json=safeReplicaName" json:"safe_replica_name,omitempty"` - PersistOffset *bool `protobuf:"varint,37,opt,name=persist_offset,json=persistOffset,def=0" json:"persist_offset,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Query) Reset() { *m = Query{} } -func (m *Query) String() string { return proto.CompactTextString(m) } -func (*Query) ProtoMessage() {} -func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15} -} -func (m *Query) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Query.Unmarshal(m, b) -} -func (m *Query) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Query.Marshal(b, m, deterministic) -} -func (dst *Query) XXX_Merge(src proto.Message) { - xxx_messageInfo_Query.Merge(dst, src) -} -func (m *Query) XXX_Size() int { - return xxx_messageInfo_Query.Size(m) -} -func (m *Query) XXX_DiscardUnknown() { - xxx_messageInfo_Query.DiscardUnknown(m) -} - -var xxx_messageInfo_Query proto.InternalMessageInfo - -const Default_Query_Offset int32 = 0 -const Default_Query_RequirePerfectPlan bool = false -const Default_Query_KeysOnly bool = false -const Default_Query_Compile bool = false -const Default_Query_PersistOffset bool = false - -func (m *Query) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *Query) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -func (m *Query) GetNameSpace() string { - if m != nil && m.NameSpace != nil { - return *m.NameSpace - } - return "" -} - -func (m *Query) GetKind() string { - if m != nil && m.Kind != nil { - return *m.Kind - } - return "" -} - -func (m *Query) GetAncestor() *Reference { - if m != nil { - return m.Ancestor - } - return nil -} - -func (m *Query) GetFilter() []*Query_Filter { - if m != nil { - return m.Filter - } - return nil -} - -func (m *Query) GetSearchQuery() string { - if m != nil && m.SearchQuery != nil { - return *m.SearchQuery - } - return "" -} - -func (m *Query) GetOrder() []*Query_Order { - if m != nil { - return m.Order - } - return nil -} - -func (m *Query) GetHint() Query_Hint { - if m != nil && m.Hint != nil { - return *m.Hint - } - return Query_ORDER_FIRST -} - -func (m *Query) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *Query) GetOffset() int32 { - if m != nil && m.Offset != nil { - return *m.Offset - } - return Default_Query_Offset -} - -func (m *Query) GetLimit() int32 { - if m != nil && m.Limit != nil { - return *m.Limit - } - return 0 -} - -func (m *Query) GetCompiledCursor() *CompiledCursor { - if m != nil { - return m.CompiledCursor - } - return nil -} - -func (m *Query) GetEndCompiledCursor() *CompiledCursor { - if m != nil { - return m.EndCompiledCursor - } - return nil -} - -func (m *Query) GetCompositeIndex() []*CompositeIndex { - if m != nil { - return m.CompositeIndex - } - return nil -} - -func (m *Query) GetRequirePerfectPlan() bool { - if m != nil && m.RequirePerfectPlan != nil { - return *m.RequirePerfectPlan - } - return Default_Query_RequirePerfectPlan -} - -func (m *Query) GetKeysOnly() bool { - if m != nil && m.KeysOnly != nil { - return *m.KeysOnly - } - return Default_Query_KeysOnly -} - -func (m *Query) GetTransaction() *Transaction { - if m != nil { - return m.Transaction - } - return nil -} - -func (m *Query) GetCompile() bool { - if m != nil && m.Compile != nil { - return *m.Compile - } - return Default_Query_Compile -} - -func (m *Query) GetFailoverMs() int64 { - if m != nil && m.FailoverMs != nil { - return *m.FailoverMs - } - return 0 -} - -func (m *Query) GetStrong() bool { - if m != nil && m.Strong != nil { - return *m.Strong - } - return false -} - -func (m *Query) GetPropertyName() []string { - if m != nil { - return m.PropertyName - } - return nil -} - -func (m *Query) GetGroupByPropertyName() []string { - if m != nil { - return m.GroupByPropertyName - } - return nil -} - -func (m *Query) GetDistinct() bool { - if m != nil && m.Distinct != nil { - return *m.Distinct - } - return false -} - -func (m *Query) GetMinSafeTimeSeconds() int64 { - if m != nil && m.MinSafeTimeSeconds != nil { - return *m.MinSafeTimeSeconds - } - return 0 -} - -func (m *Query) GetSafeReplicaName() []string { - if m != nil { - return m.SafeReplicaName - } - return nil -} - -func (m *Query) GetPersistOffset() bool { - if m != nil && m.PersistOffset != nil { - return *m.PersistOffset - } - return Default_Query_PersistOffset -} - -type Query_Filter struct { - Op *Query_Filter_Operator `protobuf:"varint,6,req,name=op,enum=appengine.Query_Filter_Operator" json:"op,omitempty"` - Property []*Property `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Query_Filter) Reset() { *m = Query_Filter{} } -func (m *Query_Filter) String() string { return proto.CompactTextString(m) } -func (*Query_Filter) ProtoMessage() {} -func (*Query_Filter) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 0} -} -func (m *Query_Filter) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Query_Filter.Unmarshal(m, b) -} -func (m *Query_Filter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Query_Filter.Marshal(b, m, deterministic) -} -func (dst *Query_Filter) XXX_Merge(src proto.Message) { - xxx_messageInfo_Query_Filter.Merge(dst, src) -} -func (m *Query_Filter) XXX_Size() int { - return xxx_messageInfo_Query_Filter.Size(m) -} -func (m *Query_Filter) XXX_DiscardUnknown() { - xxx_messageInfo_Query_Filter.DiscardUnknown(m) -} - -var xxx_messageInfo_Query_Filter proto.InternalMessageInfo - -func (m *Query_Filter) GetOp() Query_Filter_Operator { - if m != nil && m.Op != nil { - return *m.Op - } - return Query_Filter_LESS_THAN -} - -func (m *Query_Filter) GetProperty() []*Property { - if m != nil { - return m.Property - } - return nil -} - -type Query_Order struct { - Property *string `protobuf:"bytes,10,req,name=property" json:"property,omitempty"` - Direction *Query_Order_Direction `protobuf:"varint,11,opt,name=direction,enum=appengine.Query_Order_Direction,def=1" json:"direction,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Query_Order) Reset() { *m = Query_Order{} } -func (m *Query_Order) String() string { return proto.CompactTextString(m) } -func (*Query_Order) ProtoMessage() {} -func (*Query_Order) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{15, 1} -} -func (m *Query_Order) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Query_Order.Unmarshal(m, b) -} -func (m *Query_Order) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Query_Order.Marshal(b, m, deterministic) -} -func (dst *Query_Order) XXX_Merge(src proto.Message) { - xxx_messageInfo_Query_Order.Merge(dst, src) -} -func (m *Query_Order) XXX_Size() int { - return xxx_messageInfo_Query_Order.Size(m) -} -func (m *Query_Order) XXX_DiscardUnknown() { - xxx_messageInfo_Query_Order.DiscardUnknown(m) -} - -var xxx_messageInfo_Query_Order proto.InternalMessageInfo - -const Default_Query_Order_Direction Query_Order_Direction = Query_Order_ASCENDING - -func (m *Query_Order) GetProperty() string { - if m != nil && m.Property != nil { - return *m.Property - } - return "" -} - -func (m *Query_Order) GetDirection() Query_Order_Direction { - if m != nil && m.Direction != nil { - return *m.Direction - } - return Default_Query_Order_Direction -} - -type CompiledQuery struct { - Primaryscan *CompiledQuery_PrimaryScan `protobuf:"group,1,req,name=PrimaryScan,json=primaryscan" json:"primaryscan,omitempty"` - Mergejoinscan []*CompiledQuery_MergeJoinScan `protobuf:"group,7,rep,name=MergeJoinScan,json=mergejoinscan" json:"mergejoinscan,omitempty"` - IndexDef *Index `protobuf:"bytes,21,opt,name=index_def,json=indexDef" json:"index_def,omitempty"` - Offset *int32 `protobuf:"varint,10,opt,name=offset,def=0" json:"offset,omitempty"` - Limit *int32 `protobuf:"varint,11,opt,name=limit" json:"limit,omitempty"` - KeysOnly *bool `protobuf:"varint,12,req,name=keys_only,json=keysOnly" json:"keys_only,omitempty"` - PropertyName []string `protobuf:"bytes,24,rep,name=property_name,json=propertyName" json:"property_name,omitempty"` - DistinctInfixSize *int32 `protobuf:"varint,25,opt,name=distinct_infix_size,json=distinctInfixSize" json:"distinct_infix_size,omitempty"` - Entityfilter *CompiledQuery_EntityFilter `protobuf:"group,13,opt,name=EntityFilter,json=entityfilter" json:"entityfilter,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledQuery) Reset() { *m = CompiledQuery{} } -func (m *CompiledQuery) String() string { return proto.CompactTextString(m) } -func (*CompiledQuery) ProtoMessage() {} -func (*CompiledQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16} -} -func (m *CompiledQuery) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledQuery.Unmarshal(m, b) -} -func (m *CompiledQuery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledQuery.Marshal(b, m, deterministic) -} -func (dst *CompiledQuery) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledQuery.Merge(dst, src) -} -func (m *CompiledQuery) XXX_Size() int { - return xxx_messageInfo_CompiledQuery.Size(m) -} -func (m *CompiledQuery) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledQuery.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledQuery proto.InternalMessageInfo - -const Default_CompiledQuery_Offset int32 = 0 - -func (m *CompiledQuery) GetPrimaryscan() *CompiledQuery_PrimaryScan { - if m != nil { - return m.Primaryscan - } - return nil -} - -func (m *CompiledQuery) GetMergejoinscan() []*CompiledQuery_MergeJoinScan { - if m != nil { - return m.Mergejoinscan - } - return nil -} - -func (m *CompiledQuery) GetIndexDef() *Index { - if m != nil { - return m.IndexDef - } - return nil -} - -func (m *CompiledQuery) GetOffset() int32 { - if m != nil && m.Offset != nil { - return *m.Offset - } - return Default_CompiledQuery_Offset -} - -func (m *CompiledQuery) GetLimit() int32 { - if m != nil && m.Limit != nil { - return *m.Limit - } - return 0 -} - -func (m *CompiledQuery) GetKeysOnly() bool { - if m != nil && m.KeysOnly != nil { - return *m.KeysOnly - } - return false -} - -func (m *CompiledQuery) GetPropertyName() []string { - if m != nil { - return m.PropertyName - } - return nil -} - -func (m *CompiledQuery) GetDistinctInfixSize() int32 { - if m != nil && m.DistinctInfixSize != nil { - return *m.DistinctInfixSize - } - return 0 -} - -func (m *CompiledQuery) GetEntityfilter() *CompiledQuery_EntityFilter { - if m != nil { - return m.Entityfilter - } - return nil -} - -type CompiledQuery_PrimaryScan struct { - IndexName *string `protobuf:"bytes,2,opt,name=index_name,json=indexName" json:"index_name,omitempty"` - StartKey *string `protobuf:"bytes,3,opt,name=start_key,json=startKey" json:"start_key,omitempty"` - StartInclusive *bool `protobuf:"varint,4,opt,name=start_inclusive,json=startInclusive" json:"start_inclusive,omitempty"` - EndKey *string `protobuf:"bytes,5,opt,name=end_key,json=endKey" json:"end_key,omitempty"` - EndInclusive *bool `protobuf:"varint,6,opt,name=end_inclusive,json=endInclusive" json:"end_inclusive,omitempty"` - StartPostfixValue []string `protobuf:"bytes,22,rep,name=start_postfix_value,json=startPostfixValue" json:"start_postfix_value,omitempty"` - EndPostfixValue []string `protobuf:"bytes,23,rep,name=end_postfix_value,json=endPostfixValue" json:"end_postfix_value,omitempty"` - EndUnappliedLogTimestampUs *int64 `protobuf:"varint,19,opt,name=end_unapplied_log_timestamp_us,json=endUnappliedLogTimestampUs" json:"end_unapplied_log_timestamp_us,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledQuery_PrimaryScan) Reset() { *m = CompiledQuery_PrimaryScan{} } -func (m *CompiledQuery_PrimaryScan) String() string { return proto.CompactTextString(m) } -func (*CompiledQuery_PrimaryScan) ProtoMessage() {} -func (*CompiledQuery_PrimaryScan) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16, 0} -} -func (m *CompiledQuery_PrimaryScan) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledQuery_PrimaryScan.Unmarshal(m, b) -} -func (m *CompiledQuery_PrimaryScan) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledQuery_PrimaryScan.Marshal(b, m, deterministic) -} -func (dst *CompiledQuery_PrimaryScan) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledQuery_PrimaryScan.Merge(dst, src) -} -func (m *CompiledQuery_PrimaryScan) XXX_Size() int { - return xxx_messageInfo_CompiledQuery_PrimaryScan.Size(m) -} -func (m *CompiledQuery_PrimaryScan) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledQuery_PrimaryScan.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledQuery_PrimaryScan proto.InternalMessageInfo - -func (m *CompiledQuery_PrimaryScan) GetIndexName() string { - if m != nil && m.IndexName != nil { - return *m.IndexName - } - return "" -} - -func (m *CompiledQuery_PrimaryScan) GetStartKey() string { - if m != nil && m.StartKey != nil { - return *m.StartKey - } - return "" -} - -func (m *CompiledQuery_PrimaryScan) GetStartInclusive() bool { - if m != nil && m.StartInclusive != nil { - return *m.StartInclusive - } - return false -} - -func (m *CompiledQuery_PrimaryScan) GetEndKey() string { - if m != nil && m.EndKey != nil { - return *m.EndKey - } - return "" -} - -func (m *CompiledQuery_PrimaryScan) GetEndInclusive() bool { - if m != nil && m.EndInclusive != nil { - return *m.EndInclusive - } - return false -} - -func (m *CompiledQuery_PrimaryScan) GetStartPostfixValue() []string { - if m != nil { - return m.StartPostfixValue - } - return nil -} - -func (m *CompiledQuery_PrimaryScan) GetEndPostfixValue() []string { - if m != nil { - return m.EndPostfixValue - } - return nil -} - -func (m *CompiledQuery_PrimaryScan) GetEndUnappliedLogTimestampUs() int64 { - if m != nil && m.EndUnappliedLogTimestampUs != nil { - return *m.EndUnappliedLogTimestampUs - } - return 0 -} - -type CompiledQuery_MergeJoinScan struct { - IndexName *string `protobuf:"bytes,8,req,name=index_name,json=indexName" json:"index_name,omitempty"` - PrefixValue []string `protobuf:"bytes,9,rep,name=prefix_value,json=prefixValue" json:"prefix_value,omitempty"` - ValuePrefix *bool `protobuf:"varint,20,opt,name=value_prefix,json=valuePrefix,def=0" json:"value_prefix,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledQuery_MergeJoinScan) Reset() { *m = CompiledQuery_MergeJoinScan{} } -func (m *CompiledQuery_MergeJoinScan) String() string { return proto.CompactTextString(m) } -func (*CompiledQuery_MergeJoinScan) ProtoMessage() {} -func (*CompiledQuery_MergeJoinScan) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16, 1} -} -func (m *CompiledQuery_MergeJoinScan) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledQuery_MergeJoinScan.Unmarshal(m, b) -} -func (m *CompiledQuery_MergeJoinScan) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledQuery_MergeJoinScan.Marshal(b, m, deterministic) -} -func (dst *CompiledQuery_MergeJoinScan) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledQuery_MergeJoinScan.Merge(dst, src) -} -func (m *CompiledQuery_MergeJoinScan) XXX_Size() int { - return xxx_messageInfo_CompiledQuery_MergeJoinScan.Size(m) -} -func (m *CompiledQuery_MergeJoinScan) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledQuery_MergeJoinScan.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledQuery_MergeJoinScan proto.InternalMessageInfo - -const Default_CompiledQuery_MergeJoinScan_ValuePrefix bool = false - -func (m *CompiledQuery_MergeJoinScan) GetIndexName() string { - if m != nil && m.IndexName != nil { - return *m.IndexName - } - return "" -} - -func (m *CompiledQuery_MergeJoinScan) GetPrefixValue() []string { - if m != nil { - return m.PrefixValue - } - return nil -} - -func (m *CompiledQuery_MergeJoinScan) GetValuePrefix() bool { - if m != nil && m.ValuePrefix != nil { - return *m.ValuePrefix - } - return Default_CompiledQuery_MergeJoinScan_ValuePrefix -} - -type CompiledQuery_EntityFilter struct { - Distinct *bool `protobuf:"varint,14,opt,name=distinct,def=0" json:"distinct,omitempty"` - Kind *string `protobuf:"bytes,17,opt,name=kind" json:"kind,omitempty"` - Ancestor *Reference `protobuf:"bytes,18,opt,name=ancestor" json:"ancestor,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledQuery_EntityFilter) Reset() { *m = CompiledQuery_EntityFilter{} } -func (m *CompiledQuery_EntityFilter) String() string { return proto.CompactTextString(m) } -func (*CompiledQuery_EntityFilter) ProtoMessage() {} -func (*CompiledQuery_EntityFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{16, 2} -} -func (m *CompiledQuery_EntityFilter) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledQuery_EntityFilter.Unmarshal(m, b) -} -func (m *CompiledQuery_EntityFilter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledQuery_EntityFilter.Marshal(b, m, deterministic) -} -func (dst *CompiledQuery_EntityFilter) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledQuery_EntityFilter.Merge(dst, src) -} -func (m *CompiledQuery_EntityFilter) XXX_Size() int { - return xxx_messageInfo_CompiledQuery_EntityFilter.Size(m) -} -func (m *CompiledQuery_EntityFilter) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledQuery_EntityFilter.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledQuery_EntityFilter proto.InternalMessageInfo - -const Default_CompiledQuery_EntityFilter_Distinct bool = false - -func (m *CompiledQuery_EntityFilter) GetDistinct() bool { - if m != nil && m.Distinct != nil { - return *m.Distinct - } - return Default_CompiledQuery_EntityFilter_Distinct -} - -func (m *CompiledQuery_EntityFilter) GetKind() string { - if m != nil && m.Kind != nil { - return *m.Kind - } - return "" -} - -func (m *CompiledQuery_EntityFilter) GetAncestor() *Reference { - if m != nil { - return m.Ancestor - } - return nil -} - -type CompiledCursor struct { - Position *CompiledCursor_Position `protobuf:"group,2,opt,name=Position,json=position" json:"position,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledCursor) Reset() { *m = CompiledCursor{} } -func (m *CompiledCursor) String() string { return proto.CompactTextString(m) } -func (*CompiledCursor) ProtoMessage() {} -func (*CompiledCursor) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{17} -} -func (m *CompiledCursor) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledCursor.Unmarshal(m, b) -} -func (m *CompiledCursor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledCursor.Marshal(b, m, deterministic) -} -func (dst *CompiledCursor) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledCursor.Merge(dst, src) -} -func (m *CompiledCursor) XXX_Size() int { - return xxx_messageInfo_CompiledCursor.Size(m) -} -func (m *CompiledCursor) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledCursor.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledCursor proto.InternalMessageInfo - -func (m *CompiledCursor) GetPosition() *CompiledCursor_Position { - if m != nil { - return m.Position - } - return nil -} - -type CompiledCursor_Position struct { - StartKey *string `protobuf:"bytes,27,opt,name=start_key,json=startKey" json:"start_key,omitempty"` - Indexvalue []*CompiledCursor_Position_IndexValue `protobuf:"group,29,rep,name=IndexValue,json=indexvalue" json:"indexvalue,omitempty"` - Key *Reference `protobuf:"bytes,32,opt,name=key" json:"key,omitempty"` - StartInclusive *bool `protobuf:"varint,28,opt,name=start_inclusive,json=startInclusive,def=1" json:"start_inclusive,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledCursor_Position) Reset() { *m = CompiledCursor_Position{} } -func (m *CompiledCursor_Position) String() string { return proto.CompactTextString(m) } -func (*CompiledCursor_Position) ProtoMessage() {} -func (*CompiledCursor_Position) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{17, 0} -} -func (m *CompiledCursor_Position) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledCursor_Position.Unmarshal(m, b) -} -func (m *CompiledCursor_Position) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledCursor_Position.Marshal(b, m, deterministic) -} -func (dst *CompiledCursor_Position) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledCursor_Position.Merge(dst, src) -} -func (m *CompiledCursor_Position) XXX_Size() int { - return xxx_messageInfo_CompiledCursor_Position.Size(m) -} -func (m *CompiledCursor_Position) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledCursor_Position.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledCursor_Position proto.InternalMessageInfo - -const Default_CompiledCursor_Position_StartInclusive bool = true - -func (m *CompiledCursor_Position) GetStartKey() string { - if m != nil && m.StartKey != nil { - return *m.StartKey - } - return "" -} - -func (m *CompiledCursor_Position) GetIndexvalue() []*CompiledCursor_Position_IndexValue { - if m != nil { - return m.Indexvalue - } - return nil -} - -func (m *CompiledCursor_Position) GetKey() *Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *CompiledCursor_Position) GetStartInclusive() bool { - if m != nil && m.StartInclusive != nil { - return *m.StartInclusive - } - return Default_CompiledCursor_Position_StartInclusive -} - -type CompiledCursor_Position_IndexValue struct { - Property *string `protobuf:"bytes,30,opt,name=property" json:"property,omitempty"` - Value *PropertyValue `protobuf:"bytes,31,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompiledCursor_Position_IndexValue) Reset() { *m = CompiledCursor_Position_IndexValue{} } -func (m *CompiledCursor_Position_IndexValue) String() string { return proto.CompactTextString(m) } -func (*CompiledCursor_Position_IndexValue) ProtoMessage() {} -func (*CompiledCursor_Position_IndexValue) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{17, 0, 0} -} -func (m *CompiledCursor_Position_IndexValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompiledCursor_Position_IndexValue.Unmarshal(m, b) -} -func (m *CompiledCursor_Position_IndexValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompiledCursor_Position_IndexValue.Marshal(b, m, deterministic) -} -func (dst *CompiledCursor_Position_IndexValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompiledCursor_Position_IndexValue.Merge(dst, src) -} -func (m *CompiledCursor_Position_IndexValue) XXX_Size() int { - return xxx_messageInfo_CompiledCursor_Position_IndexValue.Size(m) -} -func (m *CompiledCursor_Position_IndexValue) XXX_DiscardUnknown() { - xxx_messageInfo_CompiledCursor_Position_IndexValue.DiscardUnknown(m) -} - -var xxx_messageInfo_CompiledCursor_Position_IndexValue proto.InternalMessageInfo - -func (m *CompiledCursor_Position_IndexValue) GetProperty() string { - if m != nil && m.Property != nil { - return *m.Property - } - return "" -} - -func (m *CompiledCursor_Position_IndexValue) GetValue() *PropertyValue { - if m != nil { - return m.Value - } - return nil -} - -type Cursor struct { - Cursor *uint64 `protobuf:"fixed64,1,req,name=cursor" json:"cursor,omitempty"` - App *string `protobuf:"bytes,2,opt,name=app" json:"app,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Cursor) Reset() { *m = Cursor{} } -func (m *Cursor) String() string { return proto.CompactTextString(m) } -func (*Cursor) ProtoMessage() {} -func (*Cursor) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{18} -} -func (m *Cursor) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Cursor.Unmarshal(m, b) -} -func (m *Cursor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Cursor.Marshal(b, m, deterministic) -} -func (dst *Cursor) XXX_Merge(src proto.Message) { - xxx_messageInfo_Cursor.Merge(dst, src) -} -func (m *Cursor) XXX_Size() int { - return xxx_messageInfo_Cursor.Size(m) -} -func (m *Cursor) XXX_DiscardUnknown() { - xxx_messageInfo_Cursor.DiscardUnknown(m) -} - -var xxx_messageInfo_Cursor proto.InternalMessageInfo - -func (m *Cursor) GetCursor() uint64 { - if m != nil && m.Cursor != nil { - return *m.Cursor - } - return 0 -} - -func (m *Cursor) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -type Error struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Error) Reset() { *m = Error{} } -func (m *Error) String() string { return proto.CompactTextString(m) } -func (*Error) ProtoMessage() {} -func (*Error) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{19} -} -func (m *Error) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Error.Unmarshal(m, b) -} -func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Error.Marshal(b, m, deterministic) -} -func (dst *Error) XXX_Merge(src proto.Message) { - xxx_messageInfo_Error.Merge(dst, src) -} -func (m *Error) XXX_Size() int { - return xxx_messageInfo_Error.Size(m) -} -func (m *Error) XXX_DiscardUnknown() { - xxx_messageInfo_Error.DiscardUnknown(m) -} - -var xxx_messageInfo_Error proto.InternalMessageInfo - -type Cost struct { - IndexWrites *int32 `protobuf:"varint,1,opt,name=index_writes,json=indexWrites" json:"index_writes,omitempty"` - IndexWriteBytes *int32 `protobuf:"varint,2,opt,name=index_write_bytes,json=indexWriteBytes" json:"index_write_bytes,omitempty"` - EntityWrites *int32 `protobuf:"varint,3,opt,name=entity_writes,json=entityWrites" json:"entity_writes,omitempty"` - EntityWriteBytes *int32 `protobuf:"varint,4,opt,name=entity_write_bytes,json=entityWriteBytes" json:"entity_write_bytes,omitempty"` - Commitcost *Cost_CommitCost `protobuf:"group,5,opt,name=CommitCost,json=commitcost" json:"commitcost,omitempty"` - ApproximateStorageDelta *int32 `protobuf:"varint,8,opt,name=approximate_storage_delta,json=approximateStorageDelta" json:"approximate_storage_delta,omitempty"` - IdSequenceUpdates *int32 `protobuf:"varint,9,opt,name=id_sequence_updates,json=idSequenceUpdates" json:"id_sequence_updates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Cost) Reset() { *m = Cost{} } -func (m *Cost) String() string { return proto.CompactTextString(m) } -func (*Cost) ProtoMessage() {} -func (*Cost) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{20} -} -func (m *Cost) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Cost.Unmarshal(m, b) -} -func (m *Cost) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Cost.Marshal(b, m, deterministic) -} -func (dst *Cost) XXX_Merge(src proto.Message) { - xxx_messageInfo_Cost.Merge(dst, src) -} -func (m *Cost) XXX_Size() int { - return xxx_messageInfo_Cost.Size(m) -} -func (m *Cost) XXX_DiscardUnknown() { - xxx_messageInfo_Cost.DiscardUnknown(m) -} - -var xxx_messageInfo_Cost proto.InternalMessageInfo - -func (m *Cost) GetIndexWrites() int32 { - if m != nil && m.IndexWrites != nil { - return *m.IndexWrites - } - return 0 -} - -func (m *Cost) GetIndexWriteBytes() int32 { - if m != nil && m.IndexWriteBytes != nil { - return *m.IndexWriteBytes - } - return 0 -} - -func (m *Cost) GetEntityWrites() int32 { - if m != nil && m.EntityWrites != nil { - return *m.EntityWrites - } - return 0 -} - -func (m *Cost) GetEntityWriteBytes() int32 { - if m != nil && m.EntityWriteBytes != nil { - return *m.EntityWriteBytes - } - return 0 -} - -func (m *Cost) GetCommitcost() *Cost_CommitCost { - if m != nil { - return m.Commitcost - } - return nil -} - -func (m *Cost) GetApproximateStorageDelta() int32 { - if m != nil && m.ApproximateStorageDelta != nil { - return *m.ApproximateStorageDelta - } - return 0 -} - -func (m *Cost) GetIdSequenceUpdates() int32 { - if m != nil && m.IdSequenceUpdates != nil { - return *m.IdSequenceUpdates - } - return 0 -} - -type Cost_CommitCost struct { - RequestedEntityPuts *int32 `protobuf:"varint,6,opt,name=requested_entity_puts,json=requestedEntityPuts" json:"requested_entity_puts,omitempty"` - RequestedEntityDeletes *int32 `protobuf:"varint,7,opt,name=requested_entity_deletes,json=requestedEntityDeletes" json:"requested_entity_deletes,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Cost_CommitCost) Reset() { *m = Cost_CommitCost{} } -func (m *Cost_CommitCost) String() string { return proto.CompactTextString(m) } -func (*Cost_CommitCost) ProtoMessage() {} -func (*Cost_CommitCost) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{20, 0} -} -func (m *Cost_CommitCost) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Cost_CommitCost.Unmarshal(m, b) -} -func (m *Cost_CommitCost) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Cost_CommitCost.Marshal(b, m, deterministic) -} -func (dst *Cost_CommitCost) XXX_Merge(src proto.Message) { - xxx_messageInfo_Cost_CommitCost.Merge(dst, src) -} -func (m *Cost_CommitCost) XXX_Size() int { - return xxx_messageInfo_Cost_CommitCost.Size(m) -} -func (m *Cost_CommitCost) XXX_DiscardUnknown() { - xxx_messageInfo_Cost_CommitCost.DiscardUnknown(m) -} - -var xxx_messageInfo_Cost_CommitCost proto.InternalMessageInfo - -func (m *Cost_CommitCost) GetRequestedEntityPuts() int32 { - if m != nil && m.RequestedEntityPuts != nil { - return *m.RequestedEntityPuts - } - return 0 -} - -func (m *Cost_CommitCost) GetRequestedEntityDeletes() int32 { - if m != nil && m.RequestedEntityDeletes != nil { - return *m.RequestedEntityDeletes - } - return 0 -} - -type GetRequest struct { - Header *InternalHeader `protobuf:"bytes,6,opt,name=header" json:"header,omitempty"` - Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` - Transaction *Transaction `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"` - FailoverMs *int64 `protobuf:"varint,3,opt,name=failover_ms,json=failoverMs" json:"failover_ms,omitempty"` - Strong *bool `protobuf:"varint,4,opt,name=strong" json:"strong,omitempty"` - AllowDeferred *bool `protobuf:"varint,5,opt,name=allow_deferred,json=allowDeferred,def=0" json:"allow_deferred,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetRequest) Reset() { *m = GetRequest{} } -func (m *GetRequest) String() string { return proto.CompactTextString(m) } -func (*GetRequest) ProtoMessage() {} -func (*GetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{21} -} -func (m *GetRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetRequest.Unmarshal(m, b) -} -func (m *GetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetRequest.Marshal(b, m, deterministic) -} -func (dst *GetRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRequest.Merge(dst, src) -} -func (m *GetRequest) XXX_Size() int { - return xxx_messageInfo_GetRequest.Size(m) -} -func (m *GetRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetRequest proto.InternalMessageInfo - -const Default_GetRequest_AllowDeferred bool = false - -func (m *GetRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *GetRequest) GetKey() []*Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *GetRequest) GetTransaction() *Transaction { - if m != nil { - return m.Transaction - } - return nil -} - -func (m *GetRequest) GetFailoverMs() int64 { - if m != nil && m.FailoverMs != nil { - return *m.FailoverMs - } - return 0 -} - -func (m *GetRequest) GetStrong() bool { - if m != nil && m.Strong != nil { - return *m.Strong - } - return false -} - -func (m *GetRequest) GetAllowDeferred() bool { - if m != nil && m.AllowDeferred != nil { - return *m.AllowDeferred - } - return Default_GetRequest_AllowDeferred -} - -type GetResponse struct { - Entity []*GetResponse_Entity `protobuf:"group,1,rep,name=Entity,json=entity" json:"entity,omitempty"` - Deferred []*Reference `protobuf:"bytes,5,rep,name=deferred" json:"deferred,omitempty"` - InOrder *bool `protobuf:"varint,6,opt,name=in_order,json=inOrder,def=1" json:"in_order,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetResponse) Reset() { *m = GetResponse{} } -func (m *GetResponse) String() string { return proto.CompactTextString(m) } -func (*GetResponse) ProtoMessage() {} -func (*GetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{22} -} -func (m *GetResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetResponse.Unmarshal(m, b) -} -func (m *GetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetResponse.Marshal(b, m, deterministic) -} -func (dst *GetResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetResponse.Merge(dst, src) -} -func (m *GetResponse) XXX_Size() int { - return xxx_messageInfo_GetResponse.Size(m) -} -func (m *GetResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetResponse proto.InternalMessageInfo - -const Default_GetResponse_InOrder bool = true - -func (m *GetResponse) GetEntity() []*GetResponse_Entity { - if m != nil { - return m.Entity - } - return nil -} - -func (m *GetResponse) GetDeferred() []*Reference { - if m != nil { - return m.Deferred - } - return nil -} - -func (m *GetResponse) GetInOrder() bool { - if m != nil && m.InOrder != nil { - return *m.InOrder - } - return Default_GetResponse_InOrder -} - -type GetResponse_Entity struct { - Entity *EntityProto `protobuf:"bytes,2,opt,name=entity" json:"entity,omitempty"` - Key *Reference `protobuf:"bytes,4,opt,name=key" json:"key,omitempty"` - Version *int64 `protobuf:"varint,3,opt,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetResponse_Entity) Reset() { *m = GetResponse_Entity{} } -func (m *GetResponse_Entity) String() string { return proto.CompactTextString(m) } -func (*GetResponse_Entity) ProtoMessage() {} -func (*GetResponse_Entity) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{22, 0} -} -func (m *GetResponse_Entity) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetResponse_Entity.Unmarshal(m, b) -} -func (m *GetResponse_Entity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetResponse_Entity.Marshal(b, m, deterministic) -} -func (dst *GetResponse_Entity) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetResponse_Entity.Merge(dst, src) -} -func (m *GetResponse_Entity) XXX_Size() int { - return xxx_messageInfo_GetResponse_Entity.Size(m) -} -func (m *GetResponse_Entity) XXX_DiscardUnknown() { - xxx_messageInfo_GetResponse_Entity.DiscardUnknown(m) -} - -var xxx_messageInfo_GetResponse_Entity proto.InternalMessageInfo - -func (m *GetResponse_Entity) GetEntity() *EntityProto { - if m != nil { - return m.Entity - } - return nil -} - -func (m *GetResponse_Entity) GetKey() *Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *GetResponse_Entity) GetVersion() int64 { - if m != nil && m.Version != nil { - return *m.Version - } - return 0 -} - -type PutRequest struct { - Header *InternalHeader `protobuf:"bytes,11,opt,name=header" json:"header,omitempty"` - Entity []*EntityProto `protobuf:"bytes,1,rep,name=entity" json:"entity,omitempty"` - Transaction *Transaction `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"` - CompositeIndex []*CompositeIndex `protobuf:"bytes,3,rep,name=composite_index,json=compositeIndex" json:"composite_index,omitempty"` - Trusted *bool `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"` - Force *bool `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"` - MarkChanges *bool `protobuf:"varint,8,opt,name=mark_changes,json=markChanges,def=0" json:"mark_changes,omitempty"` - Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` - AutoIdPolicy *PutRequest_AutoIdPolicy `protobuf:"varint,10,opt,name=auto_id_policy,json=autoIdPolicy,enum=appengine.PutRequest_AutoIdPolicy,def=0" json:"auto_id_policy,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PutRequest) Reset() { *m = PutRequest{} } -func (m *PutRequest) String() string { return proto.CompactTextString(m) } -func (*PutRequest) ProtoMessage() {} -func (*PutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{23} -} -func (m *PutRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PutRequest.Unmarshal(m, b) -} -func (m *PutRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PutRequest.Marshal(b, m, deterministic) -} -func (dst *PutRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_PutRequest.Merge(dst, src) -} -func (m *PutRequest) XXX_Size() int { - return xxx_messageInfo_PutRequest.Size(m) -} -func (m *PutRequest) XXX_DiscardUnknown() { - xxx_messageInfo_PutRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_PutRequest proto.InternalMessageInfo - -const Default_PutRequest_Trusted bool = false -const Default_PutRequest_Force bool = false -const Default_PutRequest_MarkChanges bool = false -const Default_PutRequest_AutoIdPolicy PutRequest_AutoIdPolicy = PutRequest_CURRENT - -func (m *PutRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *PutRequest) GetEntity() []*EntityProto { - if m != nil { - return m.Entity - } - return nil -} - -func (m *PutRequest) GetTransaction() *Transaction { - if m != nil { - return m.Transaction - } - return nil -} - -func (m *PutRequest) GetCompositeIndex() []*CompositeIndex { - if m != nil { - return m.CompositeIndex - } - return nil -} - -func (m *PutRequest) GetTrusted() bool { - if m != nil && m.Trusted != nil { - return *m.Trusted - } - return Default_PutRequest_Trusted -} - -func (m *PutRequest) GetForce() bool { - if m != nil && m.Force != nil { - return *m.Force - } - return Default_PutRequest_Force -} - -func (m *PutRequest) GetMarkChanges() bool { - if m != nil && m.MarkChanges != nil { - return *m.MarkChanges - } - return Default_PutRequest_MarkChanges -} - -func (m *PutRequest) GetSnapshot() []*Snapshot { - if m != nil { - return m.Snapshot - } - return nil -} - -func (m *PutRequest) GetAutoIdPolicy() PutRequest_AutoIdPolicy { - if m != nil && m.AutoIdPolicy != nil { - return *m.AutoIdPolicy - } - return Default_PutRequest_AutoIdPolicy -} - -type PutResponse struct { - Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` - Cost *Cost `protobuf:"bytes,2,opt,name=cost" json:"cost,omitempty"` - Version []int64 `protobuf:"varint,3,rep,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PutResponse) Reset() { *m = PutResponse{} } -func (m *PutResponse) String() string { return proto.CompactTextString(m) } -func (*PutResponse) ProtoMessage() {} -func (*PutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{24} -} -func (m *PutResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PutResponse.Unmarshal(m, b) -} -func (m *PutResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PutResponse.Marshal(b, m, deterministic) -} -func (dst *PutResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_PutResponse.Merge(dst, src) -} -func (m *PutResponse) XXX_Size() int { - return xxx_messageInfo_PutResponse.Size(m) -} -func (m *PutResponse) XXX_DiscardUnknown() { - xxx_messageInfo_PutResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_PutResponse proto.InternalMessageInfo - -func (m *PutResponse) GetKey() []*Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *PutResponse) GetCost() *Cost { - if m != nil { - return m.Cost - } - return nil -} - -func (m *PutResponse) GetVersion() []int64 { - if m != nil { - return m.Version - } - return nil -} - -type TouchRequest struct { - Header *InternalHeader `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"` - Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` - CompositeIndex []*CompositeIndex `protobuf:"bytes,2,rep,name=composite_index,json=compositeIndex" json:"composite_index,omitempty"` - Force *bool `protobuf:"varint,3,opt,name=force,def=0" json:"force,omitempty"` - Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TouchRequest) Reset() { *m = TouchRequest{} } -func (m *TouchRequest) String() string { return proto.CompactTextString(m) } -func (*TouchRequest) ProtoMessage() {} -func (*TouchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{25} -} -func (m *TouchRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_TouchRequest.Unmarshal(m, b) -} -func (m *TouchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_TouchRequest.Marshal(b, m, deterministic) -} -func (dst *TouchRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_TouchRequest.Merge(dst, src) -} -func (m *TouchRequest) XXX_Size() int { - return xxx_messageInfo_TouchRequest.Size(m) -} -func (m *TouchRequest) XXX_DiscardUnknown() { - xxx_messageInfo_TouchRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_TouchRequest proto.InternalMessageInfo - -const Default_TouchRequest_Force bool = false - -func (m *TouchRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *TouchRequest) GetKey() []*Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *TouchRequest) GetCompositeIndex() []*CompositeIndex { - if m != nil { - return m.CompositeIndex - } - return nil -} - -func (m *TouchRequest) GetForce() bool { - if m != nil && m.Force != nil { - return *m.Force - } - return Default_TouchRequest_Force -} - -func (m *TouchRequest) GetSnapshot() []*Snapshot { - if m != nil { - return m.Snapshot - } - return nil -} - -type TouchResponse struct { - Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TouchResponse) Reset() { *m = TouchResponse{} } -func (m *TouchResponse) String() string { return proto.CompactTextString(m) } -func (*TouchResponse) ProtoMessage() {} -func (*TouchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{26} -} -func (m *TouchResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_TouchResponse.Unmarshal(m, b) -} -func (m *TouchResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_TouchResponse.Marshal(b, m, deterministic) -} -func (dst *TouchResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_TouchResponse.Merge(dst, src) -} -func (m *TouchResponse) XXX_Size() int { - return xxx_messageInfo_TouchResponse.Size(m) -} -func (m *TouchResponse) XXX_DiscardUnknown() { - xxx_messageInfo_TouchResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_TouchResponse proto.InternalMessageInfo - -func (m *TouchResponse) GetCost() *Cost { - if m != nil { - return m.Cost - } - return nil -} - -type DeleteRequest struct { - Header *InternalHeader `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"` - Key []*Reference `protobuf:"bytes,6,rep,name=key" json:"key,omitempty"` - Transaction *Transaction `protobuf:"bytes,5,opt,name=transaction" json:"transaction,omitempty"` - Trusted *bool `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"` - Force *bool `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"` - MarkChanges *bool `protobuf:"varint,8,opt,name=mark_changes,json=markChanges,def=0" json:"mark_changes,omitempty"` - Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteRequest) Reset() { *m = DeleteRequest{} } -func (m *DeleteRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteRequest) ProtoMessage() {} -func (*DeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{27} -} -func (m *DeleteRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteRequest.Unmarshal(m, b) -} -func (m *DeleteRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteRequest.Marshal(b, m, deterministic) -} -func (dst *DeleteRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteRequest.Merge(dst, src) -} -func (m *DeleteRequest) XXX_Size() int { - return xxx_messageInfo_DeleteRequest.Size(m) -} -func (m *DeleteRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteRequest proto.InternalMessageInfo - -const Default_DeleteRequest_Trusted bool = false -const Default_DeleteRequest_Force bool = false -const Default_DeleteRequest_MarkChanges bool = false - -func (m *DeleteRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *DeleteRequest) GetKey() []*Reference { - if m != nil { - return m.Key - } - return nil -} - -func (m *DeleteRequest) GetTransaction() *Transaction { - if m != nil { - return m.Transaction - } - return nil -} - -func (m *DeleteRequest) GetTrusted() bool { - if m != nil && m.Trusted != nil { - return *m.Trusted - } - return Default_DeleteRequest_Trusted -} - -func (m *DeleteRequest) GetForce() bool { - if m != nil && m.Force != nil { - return *m.Force - } - return Default_DeleteRequest_Force -} - -func (m *DeleteRequest) GetMarkChanges() bool { - if m != nil && m.MarkChanges != nil { - return *m.MarkChanges - } - return Default_DeleteRequest_MarkChanges -} - -func (m *DeleteRequest) GetSnapshot() []*Snapshot { - if m != nil { - return m.Snapshot - } - return nil -} - -type DeleteResponse struct { - Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` - Version []int64 `protobuf:"varint,3,rep,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteResponse) Reset() { *m = DeleteResponse{} } -func (m *DeleteResponse) String() string { return proto.CompactTextString(m) } -func (*DeleteResponse) ProtoMessage() {} -func (*DeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{28} -} -func (m *DeleteResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteResponse.Unmarshal(m, b) -} -func (m *DeleteResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteResponse.Marshal(b, m, deterministic) -} -func (dst *DeleteResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteResponse.Merge(dst, src) -} -func (m *DeleteResponse) XXX_Size() int { - return xxx_messageInfo_DeleteResponse.Size(m) -} -func (m *DeleteResponse) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteResponse proto.InternalMessageInfo - -func (m *DeleteResponse) GetCost() *Cost { - if m != nil { - return m.Cost - } - return nil -} - -func (m *DeleteResponse) GetVersion() []int64 { - if m != nil { - return m.Version - } - return nil -} - -type NextRequest struct { - Header *InternalHeader `protobuf:"bytes,5,opt,name=header" json:"header,omitempty"` - Cursor *Cursor `protobuf:"bytes,1,req,name=cursor" json:"cursor,omitempty"` - Count *int32 `protobuf:"varint,2,opt,name=count" json:"count,omitempty"` - Offset *int32 `protobuf:"varint,4,opt,name=offset,def=0" json:"offset,omitempty"` - Compile *bool `protobuf:"varint,3,opt,name=compile,def=0" json:"compile,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NextRequest) Reset() { *m = NextRequest{} } -func (m *NextRequest) String() string { return proto.CompactTextString(m) } -func (*NextRequest) ProtoMessage() {} -func (*NextRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{29} -} -func (m *NextRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NextRequest.Unmarshal(m, b) -} -func (m *NextRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NextRequest.Marshal(b, m, deterministic) -} -func (dst *NextRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NextRequest.Merge(dst, src) -} -func (m *NextRequest) XXX_Size() int { - return xxx_messageInfo_NextRequest.Size(m) -} -func (m *NextRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NextRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NextRequest proto.InternalMessageInfo - -const Default_NextRequest_Offset int32 = 0 -const Default_NextRequest_Compile bool = false - -func (m *NextRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *NextRequest) GetCursor() *Cursor { - if m != nil { - return m.Cursor - } - return nil -} - -func (m *NextRequest) GetCount() int32 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *NextRequest) GetOffset() int32 { - if m != nil && m.Offset != nil { - return *m.Offset - } - return Default_NextRequest_Offset -} - -func (m *NextRequest) GetCompile() bool { - if m != nil && m.Compile != nil { - return *m.Compile - } - return Default_NextRequest_Compile -} - -type QueryResult struct { - Cursor *Cursor `protobuf:"bytes,1,opt,name=cursor" json:"cursor,omitempty"` - Result []*EntityProto `protobuf:"bytes,2,rep,name=result" json:"result,omitempty"` - SkippedResults *int32 `protobuf:"varint,7,opt,name=skipped_results,json=skippedResults" json:"skipped_results,omitempty"` - MoreResults *bool `protobuf:"varint,3,req,name=more_results,json=moreResults" json:"more_results,omitempty"` - KeysOnly *bool `protobuf:"varint,4,opt,name=keys_only,json=keysOnly" json:"keys_only,omitempty"` - IndexOnly *bool `protobuf:"varint,9,opt,name=index_only,json=indexOnly" json:"index_only,omitempty"` - SmallOps *bool `protobuf:"varint,10,opt,name=small_ops,json=smallOps" json:"small_ops,omitempty"` - CompiledQuery *CompiledQuery `protobuf:"bytes,5,opt,name=compiled_query,json=compiledQuery" json:"compiled_query,omitempty"` - CompiledCursor *CompiledCursor `protobuf:"bytes,6,opt,name=compiled_cursor,json=compiledCursor" json:"compiled_cursor,omitempty"` - Index []*CompositeIndex `protobuf:"bytes,8,rep,name=index" json:"index,omitempty"` - Version []int64 `protobuf:"varint,11,rep,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *QueryResult) Reset() { *m = QueryResult{} } -func (m *QueryResult) String() string { return proto.CompactTextString(m) } -func (*QueryResult) ProtoMessage() {} -func (*QueryResult) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{30} -} -func (m *QueryResult) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_QueryResult.Unmarshal(m, b) -} -func (m *QueryResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_QueryResult.Marshal(b, m, deterministic) -} -func (dst *QueryResult) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryResult.Merge(dst, src) -} -func (m *QueryResult) XXX_Size() int { - return xxx_messageInfo_QueryResult.Size(m) -} -func (m *QueryResult) XXX_DiscardUnknown() { - xxx_messageInfo_QueryResult.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryResult proto.InternalMessageInfo - -func (m *QueryResult) GetCursor() *Cursor { - if m != nil { - return m.Cursor - } - return nil -} - -func (m *QueryResult) GetResult() []*EntityProto { - if m != nil { - return m.Result - } - return nil -} - -func (m *QueryResult) GetSkippedResults() int32 { - if m != nil && m.SkippedResults != nil { - return *m.SkippedResults - } - return 0 -} - -func (m *QueryResult) GetMoreResults() bool { - if m != nil && m.MoreResults != nil { - return *m.MoreResults - } - return false -} - -func (m *QueryResult) GetKeysOnly() bool { - if m != nil && m.KeysOnly != nil { - return *m.KeysOnly - } - return false -} - -func (m *QueryResult) GetIndexOnly() bool { - if m != nil && m.IndexOnly != nil { - return *m.IndexOnly - } - return false -} - -func (m *QueryResult) GetSmallOps() bool { - if m != nil && m.SmallOps != nil { - return *m.SmallOps - } - return false -} - -func (m *QueryResult) GetCompiledQuery() *CompiledQuery { - if m != nil { - return m.CompiledQuery - } - return nil -} - -func (m *QueryResult) GetCompiledCursor() *CompiledCursor { - if m != nil { - return m.CompiledCursor - } - return nil -} - -func (m *QueryResult) GetIndex() []*CompositeIndex { - if m != nil { - return m.Index - } - return nil -} - -func (m *QueryResult) GetVersion() []int64 { - if m != nil { - return m.Version - } - return nil -} - -type AllocateIdsRequest struct { - Header *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"` - ModelKey *Reference `protobuf:"bytes,1,opt,name=model_key,json=modelKey" json:"model_key,omitempty"` - Size *int64 `protobuf:"varint,2,opt,name=size" json:"size,omitempty"` - Max *int64 `protobuf:"varint,3,opt,name=max" json:"max,omitempty"` - Reserve []*Reference `protobuf:"bytes,5,rep,name=reserve" json:"reserve,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AllocateIdsRequest) Reset() { *m = AllocateIdsRequest{} } -func (m *AllocateIdsRequest) String() string { return proto.CompactTextString(m) } -func (*AllocateIdsRequest) ProtoMessage() {} -func (*AllocateIdsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{31} -} -func (m *AllocateIdsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AllocateIdsRequest.Unmarshal(m, b) -} -func (m *AllocateIdsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AllocateIdsRequest.Marshal(b, m, deterministic) -} -func (dst *AllocateIdsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AllocateIdsRequest.Merge(dst, src) -} -func (m *AllocateIdsRequest) XXX_Size() int { - return xxx_messageInfo_AllocateIdsRequest.Size(m) -} -func (m *AllocateIdsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AllocateIdsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_AllocateIdsRequest proto.InternalMessageInfo - -func (m *AllocateIdsRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *AllocateIdsRequest) GetModelKey() *Reference { - if m != nil { - return m.ModelKey - } - return nil -} - -func (m *AllocateIdsRequest) GetSize() int64 { - if m != nil && m.Size != nil { - return *m.Size - } - return 0 -} - -func (m *AllocateIdsRequest) GetMax() int64 { - if m != nil && m.Max != nil { - return *m.Max - } - return 0 -} - -func (m *AllocateIdsRequest) GetReserve() []*Reference { - if m != nil { - return m.Reserve - } - return nil -} - -type AllocateIdsResponse struct { - Start *int64 `protobuf:"varint,1,req,name=start" json:"start,omitempty"` - End *int64 `protobuf:"varint,2,req,name=end" json:"end,omitempty"` - Cost *Cost `protobuf:"bytes,3,opt,name=cost" json:"cost,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AllocateIdsResponse) Reset() { *m = AllocateIdsResponse{} } -func (m *AllocateIdsResponse) String() string { return proto.CompactTextString(m) } -func (*AllocateIdsResponse) ProtoMessage() {} -func (*AllocateIdsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{32} -} -func (m *AllocateIdsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AllocateIdsResponse.Unmarshal(m, b) -} -func (m *AllocateIdsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AllocateIdsResponse.Marshal(b, m, deterministic) -} -func (dst *AllocateIdsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_AllocateIdsResponse.Merge(dst, src) -} -func (m *AllocateIdsResponse) XXX_Size() int { - return xxx_messageInfo_AllocateIdsResponse.Size(m) -} -func (m *AllocateIdsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_AllocateIdsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_AllocateIdsResponse proto.InternalMessageInfo - -func (m *AllocateIdsResponse) GetStart() int64 { - if m != nil && m.Start != nil { - return *m.Start - } - return 0 -} - -func (m *AllocateIdsResponse) GetEnd() int64 { - if m != nil && m.End != nil { - return *m.End - } - return 0 -} - -func (m *AllocateIdsResponse) GetCost() *Cost { - if m != nil { - return m.Cost - } - return nil -} - -type CompositeIndices struct { - Index []*CompositeIndex `protobuf:"bytes,1,rep,name=index" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompositeIndices) Reset() { *m = CompositeIndices{} } -func (m *CompositeIndices) String() string { return proto.CompactTextString(m) } -func (*CompositeIndices) ProtoMessage() {} -func (*CompositeIndices) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{33} -} -func (m *CompositeIndices) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompositeIndices.Unmarshal(m, b) -} -func (m *CompositeIndices) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompositeIndices.Marshal(b, m, deterministic) -} -func (dst *CompositeIndices) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompositeIndices.Merge(dst, src) -} -func (m *CompositeIndices) XXX_Size() int { - return xxx_messageInfo_CompositeIndices.Size(m) -} -func (m *CompositeIndices) XXX_DiscardUnknown() { - xxx_messageInfo_CompositeIndices.DiscardUnknown(m) -} - -var xxx_messageInfo_CompositeIndices proto.InternalMessageInfo - -func (m *CompositeIndices) GetIndex() []*CompositeIndex { - if m != nil { - return m.Index - } - return nil -} - -type AddActionsRequest struct { - Header *InternalHeader `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"` - Transaction *Transaction `protobuf:"bytes,1,req,name=transaction" json:"transaction,omitempty"` - Action []*Action `protobuf:"bytes,2,rep,name=action" json:"action,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AddActionsRequest) Reset() { *m = AddActionsRequest{} } -func (m *AddActionsRequest) String() string { return proto.CompactTextString(m) } -func (*AddActionsRequest) ProtoMessage() {} -func (*AddActionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{34} -} -func (m *AddActionsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AddActionsRequest.Unmarshal(m, b) -} -func (m *AddActionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AddActionsRequest.Marshal(b, m, deterministic) -} -func (dst *AddActionsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddActionsRequest.Merge(dst, src) -} -func (m *AddActionsRequest) XXX_Size() int { - return xxx_messageInfo_AddActionsRequest.Size(m) -} -func (m *AddActionsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AddActionsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_AddActionsRequest proto.InternalMessageInfo - -func (m *AddActionsRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *AddActionsRequest) GetTransaction() *Transaction { - if m != nil { - return m.Transaction - } - return nil -} - -func (m *AddActionsRequest) GetAction() []*Action { - if m != nil { - return m.Action - } - return nil -} - -type AddActionsResponse struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AddActionsResponse) Reset() { *m = AddActionsResponse{} } -func (m *AddActionsResponse) String() string { return proto.CompactTextString(m) } -func (*AddActionsResponse) ProtoMessage() {} -func (*AddActionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{35} -} -func (m *AddActionsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AddActionsResponse.Unmarshal(m, b) -} -func (m *AddActionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AddActionsResponse.Marshal(b, m, deterministic) -} -func (dst *AddActionsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddActionsResponse.Merge(dst, src) -} -func (m *AddActionsResponse) XXX_Size() int { - return xxx_messageInfo_AddActionsResponse.Size(m) -} -func (m *AddActionsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_AddActionsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_AddActionsResponse proto.InternalMessageInfo - -type BeginTransactionRequest struct { - Header *InternalHeader `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"` - App *string `protobuf:"bytes,1,req,name=app" json:"app,omitempty"` - AllowMultipleEg *bool `protobuf:"varint,2,opt,name=allow_multiple_eg,json=allowMultipleEg,def=0" json:"allow_multiple_eg,omitempty"` - DatabaseId *string `protobuf:"bytes,4,opt,name=database_id,json=databaseId" json:"database_id,omitempty"` - Mode *BeginTransactionRequest_TransactionMode `protobuf:"varint,5,opt,name=mode,enum=appengine.BeginTransactionRequest_TransactionMode,def=0" json:"mode,omitempty"` - PreviousTransaction *Transaction `protobuf:"bytes,7,opt,name=previous_transaction,json=previousTransaction" json:"previous_transaction,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BeginTransactionRequest) Reset() { *m = BeginTransactionRequest{} } -func (m *BeginTransactionRequest) String() string { return proto.CompactTextString(m) } -func (*BeginTransactionRequest) ProtoMessage() {} -func (*BeginTransactionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{36} -} -func (m *BeginTransactionRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BeginTransactionRequest.Unmarshal(m, b) -} -func (m *BeginTransactionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BeginTransactionRequest.Marshal(b, m, deterministic) -} -func (dst *BeginTransactionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_BeginTransactionRequest.Merge(dst, src) -} -func (m *BeginTransactionRequest) XXX_Size() int { - return xxx_messageInfo_BeginTransactionRequest.Size(m) -} -func (m *BeginTransactionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_BeginTransactionRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_BeginTransactionRequest proto.InternalMessageInfo - -const Default_BeginTransactionRequest_AllowMultipleEg bool = false -const Default_BeginTransactionRequest_Mode BeginTransactionRequest_TransactionMode = BeginTransactionRequest_UNKNOWN - -func (m *BeginTransactionRequest) GetHeader() *InternalHeader { - if m != nil { - return m.Header - } - return nil -} - -func (m *BeginTransactionRequest) GetApp() string { - if m != nil && m.App != nil { - return *m.App - } - return "" -} - -func (m *BeginTransactionRequest) GetAllowMultipleEg() bool { - if m != nil && m.AllowMultipleEg != nil { - return *m.AllowMultipleEg - } - return Default_BeginTransactionRequest_AllowMultipleEg -} - -func (m *BeginTransactionRequest) GetDatabaseId() string { - if m != nil && m.DatabaseId != nil { - return *m.DatabaseId - } - return "" -} - -func (m *BeginTransactionRequest) GetMode() BeginTransactionRequest_TransactionMode { - if m != nil && m.Mode != nil { - return *m.Mode - } - return Default_BeginTransactionRequest_Mode -} - -func (m *BeginTransactionRequest) GetPreviousTransaction() *Transaction { - if m != nil { - return m.PreviousTransaction - } - return nil -} - -type CommitResponse struct { - Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` - Version []*CommitResponse_Version `protobuf:"group,3,rep,name=Version,json=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CommitResponse) Reset() { *m = CommitResponse{} } -func (m *CommitResponse) String() string { return proto.CompactTextString(m) } -func (*CommitResponse) ProtoMessage() {} -func (*CommitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{37} -} -func (m *CommitResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CommitResponse.Unmarshal(m, b) -} -func (m *CommitResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CommitResponse.Marshal(b, m, deterministic) -} -func (dst *CommitResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommitResponse.Merge(dst, src) -} -func (m *CommitResponse) XXX_Size() int { - return xxx_messageInfo_CommitResponse.Size(m) -} -func (m *CommitResponse) XXX_DiscardUnknown() { - xxx_messageInfo_CommitResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_CommitResponse proto.InternalMessageInfo - -func (m *CommitResponse) GetCost() *Cost { - if m != nil { - return m.Cost - } - return nil -} - -func (m *CommitResponse) GetVersion() []*CommitResponse_Version { - if m != nil { - return m.Version - } - return nil -} - -type CommitResponse_Version struct { - RootEntityKey *Reference `protobuf:"bytes,4,req,name=root_entity_key,json=rootEntityKey" json:"root_entity_key,omitempty"` - Version *int64 `protobuf:"varint,5,req,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CommitResponse_Version) Reset() { *m = CommitResponse_Version{} } -func (m *CommitResponse_Version) String() string { return proto.CompactTextString(m) } -func (*CommitResponse_Version) ProtoMessage() {} -func (*CommitResponse_Version) Descriptor() ([]byte, []int) { - return fileDescriptor_datastore_v3_83b17b80c34f6179, []int{37, 0} -} -func (m *CommitResponse_Version) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CommitResponse_Version.Unmarshal(m, b) -} -func (m *CommitResponse_Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CommitResponse_Version.Marshal(b, m, deterministic) -} -func (dst *CommitResponse_Version) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommitResponse_Version.Merge(dst, src) -} -func (m *CommitResponse_Version) XXX_Size() int { - return xxx_messageInfo_CommitResponse_Version.Size(m) -} -func (m *CommitResponse_Version) XXX_DiscardUnknown() { - xxx_messageInfo_CommitResponse_Version.DiscardUnknown(m) -} - -var xxx_messageInfo_CommitResponse_Version proto.InternalMessageInfo - -func (m *CommitResponse_Version) GetRootEntityKey() *Reference { - if m != nil { - return m.RootEntityKey - } - return nil -} - -func (m *CommitResponse_Version) GetVersion() int64 { - if m != nil && m.Version != nil { - return *m.Version - } - return 0 -} - -func init() { - proto.RegisterType((*Action)(nil), "appengine.Action") - proto.RegisterType((*PropertyValue)(nil), "appengine.PropertyValue") - proto.RegisterType((*PropertyValue_PointValue)(nil), "appengine.PropertyValue.PointValue") - proto.RegisterType((*PropertyValue_UserValue)(nil), "appengine.PropertyValue.UserValue") - proto.RegisterType((*PropertyValue_ReferenceValue)(nil), "appengine.PropertyValue.ReferenceValue") - proto.RegisterType((*PropertyValue_ReferenceValue_PathElement)(nil), "appengine.PropertyValue.ReferenceValue.PathElement") - proto.RegisterType((*Property)(nil), "appengine.Property") - proto.RegisterType((*Path)(nil), "appengine.Path") - proto.RegisterType((*Path_Element)(nil), "appengine.Path.Element") - proto.RegisterType((*Reference)(nil), "appengine.Reference") - proto.RegisterType((*User)(nil), "appengine.User") - proto.RegisterType((*EntityProto)(nil), "appengine.EntityProto") - proto.RegisterType((*CompositeProperty)(nil), "appengine.CompositeProperty") - proto.RegisterType((*Index)(nil), "appengine.Index") - proto.RegisterType((*Index_Property)(nil), "appengine.Index.Property") - proto.RegisterType((*CompositeIndex)(nil), "appengine.CompositeIndex") - proto.RegisterType((*IndexPostfix)(nil), "appengine.IndexPostfix") - proto.RegisterType((*IndexPostfix_IndexValue)(nil), "appengine.IndexPostfix.IndexValue") - proto.RegisterType((*IndexPosition)(nil), "appengine.IndexPosition") - proto.RegisterType((*Snapshot)(nil), "appengine.Snapshot") - proto.RegisterType((*InternalHeader)(nil), "appengine.InternalHeader") - proto.RegisterType((*Transaction)(nil), "appengine.Transaction") - proto.RegisterType((*Query)(nil), "appengine.Query") - proto.RegisterType((*Query_Filter)(nil), "appengine.Query.Filter") - proto.RegisterType((*Query_Order)(nil), "appengine.Query.Order") - proto.RegisterType((*CompiledQuery)(nil), "appengine.CompiledQuery") - proto.RegisterType((*CompiledQuery_PrimaryScan)(nil), "appengine.CompiledQuery.PrimaryScan") - proto.RegisterType((*CompiledQuery_MergeJoinScan)(nil), "appengine.CompiledQuery.MergeJoinScan") - proto.RegisterType((*CompiledQuery_EntityFilter)(nil), "appengine.CompiledQuery.EntityFilter") - proto.RegisterType((*CompiledCursor)(nil), "appengine.CompiledCursor") - proto.RegisterType((*CompiledCursor_Position)(nil), "appengine.CompiledCursor.Position") - proto.RegisterType((*CompiledCursor_Position_IndexValue)(nil), "appengine.CompiledCursor.Position.IndexValue") - proto.RegisterType((*Cursor)(nil), "appengine.Cursor") - proto.RegisterType((*Error)(nil), "appengine.Error") - proto.RegisterType((*Cost)(nil), "appengine.Cost") - proto.RegisterType((*Cost_CommitCost)(nil), "appengine.Cost.CommitCost") - proto.RegisterType((*GetRequest)(nil), "appengine.GetRequest") - proto.RegisterType((*GetResponse)(nil), "appengine.GetResponse") - proto.RegisterType((*GetResponse_Entity)(nil), "appengine.GetResponse.Entity") - proto.RegisterType((*PutRequest)(nil), "appengine.PutRequest") - proto.RegisterType((*PutResponse)(nil), "appengine.PutResponse") - proto.RegisterType((*TouchRequest)(nil), "appengine.TouchRequest") - proto.RegisterType((*TouchResponse)(nil), "appengine.TouchResponse") - proto.RegisterType((*DeleteRequest)(nil), "appengine.DeleteRequest") - proto.RegisterType((*DeleteResponse)(nil), "appengine.DeleteResponse") - proto.RegisterType((*NextRequest)(nil), "appengine.NextRequest") - proto.RegisterType((*QueryResult)(nil), "appengine.QueryResult") - proto.RegisterType((*AllocateIdsRequest)(nil), "appengine.AllocateIdsRequest") - proto.RegisterType((*AllocateIdsResponse)(nil), "appengine.AllocateIdsResponse") - proto.RegisterType((*CompositeIndices)(nil), "appengine.CompositeIndices") - proto.RegisterType((*AddActionsRequest)(nil), "appengine.AddActionsRequest") - proto.RegisterType((*AddActionsResponse)(nil), "appengine.AddActionsResponse") - proto.RegisterType((*BeginTransactionRequest)(nil), "appengine.BeginTransactionRequest") - proto.RegisterType((*CommitResponse)(nil), "appengine.CommitResponse") - proto.RegisterType((*CommitResponse_Version)(nil), "appengine.CommitResponse.Version") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/datastore/datastore_v3.proto", fileDescriptor_datastore_v3_83b17b80c34f6179) -} - -var fileDescriptor_datastore_v3_83b17b80c34f6179 = []byte{ - // 4156 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x73, 0xe3, 0x46, - 0x76, 0x37, 0xc1, 0xef, 0x47, 0x89, 0x82, 0x5a, 0xf3, 0xc1, 0xa1, 0x3f, 0x46, 0xc6, 0xac, 0x6d, - 0xd9, 0x6b, 0x73, 0x6c, 0xf9, 0x23, 0x5b, 0x4a, 0x76, 0x1d, 0x4a, 0xc4, 0x68, 0x90, 0xa1, 0x48, - 0xb9, 0x09, 0xd9, 0x9e, 0x5c, 0x50, 0x18, 0xa2, 0x29, 0x21, 0x43, 0x02, 0x30, 0x00, 0x6a, 0x46, - 0x93, 0xe4, 0x90, 0x4b, 0x2a, 0x55, 0x5b, 0xa9, 0x1c, 0x92, 0x4a, 0x25, 0xf9, 0x07, 0x72, 0xc8, - 0x39, 0x95, 0xaa, 0x54, 0xf6, 0x98, 0x5b, 0x0e, 0x7b, 0xc9, 0x31, 0x95, 0x73, 0xf2, 0x27, 0x24, - 0x39, 0xa4, 0xfa, 0x75, 0x03, 0x02, 0x28, 0x4a, 0x23, 0x6d, 0xf6, 0x90, 0x13, 0xd1, 0xef, 0xfd, - 0xba, 0xf1, 0xfa, 0xf5, 0xfb, 0x6c, 0x10, 0xba, 0xc7, 0xbe, 0x7f, 0x3c, 0x65, 0x9d, 0x63, 0x7f, - 0x6a, 0x7b, 0xc7, 0x1d, 0x3f, 0x3c, 0x7e, 0x68, 0x07, 0x01, 0xf3, 0x8e, 0x5d, 0x8f, 0x3d, 0x74, - 0xbd, 0x98, 0x85, 0x9e, 0x3d, 0x7d, 0xe8, 0xd8, 0xb1, 0x1d, 0xc5, 0x7e, 0xc8, 0xce, 0x9f, 0xac, - 0xd3, 0xcf, 0x3b, 0x41, 0xe8, 0xc7, 0x3e, 0xa9, 0xa7, 0x13, 0xb4, 0x1a, 0x54, 0xba, 0xe3, 0xd8, - 0xf5, 0x3d, 0xed, 0x1f, 0x2b, 0xb0, 0x7a, 0x18, 0xfa, 0x01, 0x0b, 0xe3, 0xb3, 0x6f, 0xed, 0xe9, - 0x9c, 0x91, 0x77, 0x00, 0x5c, 0x2f, 0xfe, 0xea, 0x0b, 0x1c, 0xb5, 0x0a, 0x9b, 0x85, 0xad, 0x22, - 0xcd, 0x50, 0x88, 0x06, 0x2b, 0xcf, 0x7c, 0x7f, 0xca, 0x6c, 0x4f, 0x20, 0x94, 0xcd, 0xc2, 0x56, - 0x8d, 0xe6, 0x68, 0x64, 0x13, 0x1a, 0x51, 0x1c, 0xba, 0xde, 0xb1, 0x80, 0x14, 0x37, 0x0b, 0x5b, - 0x75, 0x9a, 0x25, 0x71, 0x84, 0xe3, 0xcf, 0x9f, 0x4d, 0x99, 0x40, 0x94, 0x36, 0x0b, 0x5b, 0x05, - 0x9a, 0x25, 0x91, 0x3d, 0x80, 0xc0, 0x77, 0xbd, 0xf8, 0x14, 0x01, 0xe5, 0xcd, 0xc2, 0x16, 0x6c, - 0x3f, 0xe8, 0xa4, 0x7b, 0xe8, 0xe4, 0xa4, 0xee, 0x1c, 0x72, 0x28, 0x3e, 0xd2, 0xcc, 0x34, 0xf2, - 0xdb, 0x50, 0x9f, 0x47, 0x2c, 0x14, 0x6b, 0xd4, 0x70, 0x0d, 0xed, 0xd2, 0x35, 0x8e, 0x22, 0x16, - 0x8a, 0x25, 0xce, 0x27, 0x91, 0x21, 0x34, 0x43, 0x36, 0x61, 0x21, 0xf3, 0xc6, 0x4c, 0x2c, 0xb3, - 0x82, 0xcb, 0x7c, 0x70, 0xe9, 0x32, 0x34, 0x81, 0x8b, 0xb5, 0x16, 0xa6, 0xb7, 0xb7, 0x00, 0xce, - 0x85, 0x25, 0x2b, 0x50, 0x78, 0xd9, 0xaa, 0x6c, 0x2a, 0x5b, 0x05, 0x5a, 0x78, 0xc9, 0x47, 0x67, - 0xad, 0xaa, 0x18, 0x9d, 0xb5, 0xff, 0xa9, 0x00, 0xf5, 0x54, 0x26, 0x72, 0x0b, 0xca, 0x6c, 0x66, - 0xbb, 0xd3, 0x56, 0x7d, 0x53, 0xd9, 0xaa, 0x53, 0x31, 0x20, 0xf7, 0xa1, 0x61, 0xcf, 0xe3, 0x13, - 0xcb, 0xf1, 0x67, 0xb6, 0xeb, 0xb5, 0x00, 0x79, 0xc0, 0x49, 0x3d, 0xa4, 0x90, 0x36, 0xd4, 0x3c, - 0x77, 0xfc, 0xdc, 0xb3, 0x67, 0xac, 0xd5, 0xc0, 0x73, 0x48, 0xc7, 0xe4, 0x13, 0x20, 0x13, 0xe6, - 0xb0, 0xd0, 0x8e, 0x99, 0x63, 0xb9, 0x0e, 0xf3, 0x62, 0x37, 0x3e, 0x6b, 0xdd, 0x46, 0xd4, 0x7a, - 0xca, 0x31, 0x24, 0x23, 0x0f, 0x0f, 0x42, 0xff, 0xd4, 0x75, 0x58, 0xd8, 0xba, 0xb3, 0x00, 0x3f, - 0x94, 0x8c, 0xf6, 0xbf, 0x17, 0xa0, 0x99, 0xd7, 0x05, 0x51, 0xa1, 0x68, 0x07, 0x41, 0x6b, 0x15, - 0xa5, 0xe4, 0x8f, 0xe4, 0x6d, 0x00, 0x2e, 0x8a, 0x15, 0x05, 0xf6, 0x98, 0xb5, 0x6e, 0xe1, 0x5a, - 0x75, 0x4e, 0x19, 0x71, 0x02, 0x39, 0x82, 0x46, 0x60, 0xc7, 0x27, 0x6c, 0xca, 0x66, 0xcc, 0x8b, - 0x5b, 0xcd, 0xcd, 0xe2, 0x16, 0x6c, 0x7f, 0x7e, 0x4d, 0xd5, 0x77, 0x0e, 0xed, 0xf8, 0x44, 0x17, - 0x53, 0x69, 0x76, 0x9d, 0xb6, 0x0e, 0x8d, 0x0c, 0x8f, 0x10, 0x28, 0xc5, 0x67, 0x01, 0x6b, 0xad, - 0xa1, 0x5c, 0xf8, 0x4c, 0x9a, 0xa0, 0xb8, 0x4e, 0x4b, 0x45, 0xf3, 0x57, 0x5c, 0x87, 0x63, 0x50, - 0x87, 0xeb, 0x28, 0x22, 0x3e, 0x6b, 0xff, 0x51, 0x86, 0x5a, 0x22, 0x00, 0xe9, 0x42, 0x75, 0xc6, - 0x6c, 0xcf, 0xf5, 0x8e, 0xd1, 0x69, 0x9a, 0xdb, 0x6f, 0x2e, 0x11, 0xb3, 0x73, 0x20, 0x20, 0x3b, - 0x30, 0x18, 0x5a, 0x07, 0x7a, 0x77, 0x60, 0x0c, 0xf6, 0x69, 0x32, 0x8f, 0x1f, 0xa6, 0x7c, 0xb4, - 0xe6, 0xa1, 0x8b, 0x9e, 0x55, 0xa7, 0x20, 0x49, 0x47, 0xa1, 0x9b, 0x0a, 0x51, 0x14, 0x82, 0xe2, - 0x21, 0x76, 0xa0, 0x9c, 0xb8, 0x88, 0xb2, 0xd5, 0xd8, 0x6e, 0x5d, 0xa6, 0x1c, 0x2a, 0x60, 0xdc, - 0x20, 0x66, 0xf3, 0x69, 0xec, 0x06, 0x53, 0xee, 0x76, 0xca, 0x56, 0x8d, 0xa6, 0x63, 0xf2, 0x1e, - 0x40, 0xc4, 0xec, 0x70, 0x7c, 0x62, 0x3f, 0x9b, 0xb2, 0x56, 0x85, 0x7b, 0xf6, 0x4e, 0x79, 0x62, - 0x4f, 0x23, 0x46, 0x33, 0x0c, 0x62, 0xc3, 0xdd, 0x49, 0x1c, 0x59, 0xb1, 0xff, 0x9c, 0x79, 0xee, - 0x2b, 0x9b, 0x07, 0x12, 0xcb, 0x0f, 0xf8, 0x0f, 0xfa, 0x58, 0x73, 0xfb, 0xc3, 0x65, 0x5b, 0x7f, - 0x14, 0x47, 0x66, 0x66, 0xc6, 0x10, 0x27, 0xd0, 0xdb, 0x93, 0x65, 0x64, 0xd2, 0x86, 0xca, 0xd4, - 0x1f, 0xdb, 0x53, 0xd6, 0xaa, 0x73, 0x2d, 0xec, 0x28, 0xcc, 0xa3, 0x92, 0xa2, 0xfd, 0xb3, 0x02, - 0x55, 0xa9, 0x47, 0xd2, 0x84, 0x8c, 0x26, 0xd5, 0x37, 0x48, 0x0d, 0x4a, 0xbb, 0xfd, 0xe1, 0xae, - 0xda, 0xe4, 0x4f, 0xa6, 0xfe, 0xbd, 0xa9, 0xae, 0x71, 0xcc, 0xee, 0x53, 0x53, 0x1f, 0x99, 0x94, - 0x63, 0x54, 0xb2, 0x0e, 0xab, 0x5d, 0x73, 0x78, 0x60, 0xed, 0x75, 0x4d, 0x7d, 0x7f, 0x48, 0x9f, - 0xaa, 0x05, 0xb2, 0x0a, 0x75, 0x24, 0xf5, 0x8d, 0xc1, 0x13, 0x55, 0xe1, 0x33, 0x70, 0x68, 0x1a, - 0x66, 0x5f, 0x57, 0x8b, 0x44, 0x85, 0x15, 0x31, 0x63, 0x38, 0x30, 0xf5, 0x81, 0xa9, 0x96, 0x52, - 0xca, 0xe8, 0xe8, 0xe0, 0xa0, 0x4b, 0x9f, 0xaa, 0x65, 0xb2, 0x06, 0x0d, 0xa4, 0x74, 0x8f, 0xcc, - 0xc7, 0x43, 0xaa, 0x56, 0x48, 0x03, 0xaa, 0xfb, 0x3d, 0xeb, 0xbb, 0xc7, 0xfa, 0x40, 0xad, 0x92, - 0x15, 0xa8, 0xed, 0xf7, 0x2c, 0xfd, 0xa0, 0x6b, 0xf4, 0xd5, 0x1a, 0x9f, 0xbd, 0xaf, 0x0f, 0xe9, - 0x68, 0x64, 0x1d, 0x0e, 0x8d, 0x81, 0xa9, 0xd6, 0x49, 0x1d, 0xca, 0xfb, 0x3d, 0xcb, 0x38, 0x50, - 0x81, 0x10, 0x68, 0xee, 0xf7, 0xac, 0xc3, 0xc7, 0xc3, 0x81, 0x3e, 0x38, 0x3a, 0xd8, 0xd5, 0xa9, - 0xda, 0x20, 0xb7, 0x40, 0xe5, 0xb4, 0xe1, 0xc8, 0xec, 0xf6, 0xbb, 0xbd, 0x1e, 0xd5, 0x47, 0x23, - 0x75, 0x85, 0x4b, 0xbd, 0xdf, 0xb3, 0x68, 0xd7, 0xe4, 0xfb, 0x5a, 0xe5, 0x2f, 0xe4, 0x7b, 0x7f, - 0xa2, 0x3f, 0x55, 0xd7, 0xf9, 0x2b, 0xf4, 0x81, 0x69, 0x98, 0x4f, 0xad, 0x43, 0x3a, 0x34, 0x87, - 0xea, 0x06, 0x17, 0xd0, 0x18, 0xf4, 0xf4, 0xef, 0xad, 0x6f, 0xbb, 0xfd, 0x23, 0x5d, 0x25, 0xda, - 0x8f, 0xe1, 0xf6, 0xd2, 0x33, 0xe1, 0xaa, 0x7b, 0x6c, 0x1e, 0xf4, 0xd5, 0x02, 0x7f, 0xe2, 0x9b, - 0x52, 0x15, 0xed, 0x0f, 0xa0, 0xc4, 0x5d, 0x86, 0x7c, 0x06, 0xd5, 0xc4, 0x1b, 0x0b, 0xe8, 0x8d, - 0x77, 0xb3, 0x67, 0x6d, 0xc7, 0x27, 0x9d, 0xc4, 0xe3, 0x12, 0x5c, 0xbb, 0x0b, 0xd5, 0x45, 0x4f, - 0x53, 0x2e, 0x78, 0x5a, 0xf1, 0x82, 0xa7, 0x95, 0x32, 0x9e, 0x66, 0x43, 0x3d, 0xf5, 0xed, 0x9b, - 0x47, 0x91, 0x07, 0x50, 0xe2, 0xde, 0xdf, 0x6a, 0xa2, 0x87, 0xac, 0x2d, 0x08, 0x4c, 0x91, 0xa9, - 0xfd, 0x43, 0x01, 0x4a, 0x3c, 0xda, 0x9e, 0x07, 0xda, 0xc2, 0x15, 0x81, 0x56, 0xb9, 0x32, 0xd0, - 0x16, 0xaf, 0x15, 0x68, 0x2b, 0x37, 0x0b, 0xb4, 0xd5, 0x4b, 0x02, 0xad, 0xf6, 0x67, 0x45, 0x68, - 0xe8, 0x38, 0xf3, 0x10, 0x13, 0xfd, 0xfb, 0x50, 0x7c, 0xce, 0xce, 0x50, 0x3f, 0x8d, 0xed, 0x5b, - 0x99, 0xdd, 0xa6, 0x2a, 0xa4, 0x1c, 0x40, 0xb6, 0x61, 0x45, 0xbc, 0xd0, 0x3a, 0x0e, 0xfd, 0x79, - 0xd0, 0x52, 0x97, 0xab, 0xa7, 0x21, 0x40, 0xfb, 0x1c, 0x43, 0xde, 0x83, 0xb2, 0xff, 0xc2, 0x63, - 0x21, 0xc6, 0xc1, 0x3c, 0x98, 0x2b, 0x8f, 0x0a, 0x2e, 0x79, 0x08, 0xa5, 0xe7, 0xae, 0xe7, 0xe0, - 0x19, 0xe6, 0x23, 0x61, 0x46, 0xd0, 0xce, 0x13, 0xd7, 0x73, 0x28, 0x02, 0xc9, 0x3d, 0xa8, 0xf1, - 0x5f, 0x8c, 0x7b, 0x65, 0xdc, 0x68, 0x95, 0x8f, 0x79, 0xd0, 0x7b, 0x08, 0xb5, 0x40, 0xc6, 0x10, - 0x4c, 0x00, 0x8d, 0xed, 0x8d, 0x25, 0xe1, 0x85, 0xa6, 0x20, 0xf2, 0x15, 0xac, 0x84, 0xf6, 0x0b, - 0x2b, 0x9d, 0xb4, 0x76, 0xf9, 0xa4, 0x46, 0x68, 0xbf, 0x48, 0x23, 0x38, 0x81, 0x52, 0x68, 0x7b, - 0xcf, 0x5b, 0x64, 0xb3, 0xb0, 0x55, 0xa6, 0xf8, 0xac, 0x7d, 0x01, 0x25, 0x2e, 0x25, 0x8f, 0x08, - 0xfb, 0x3d, 0xf4, 0xff, 0xee, 0x9e, 0xa9, 0x16, 0x12, 0x7f, 0xfe, 0x96, 0x47, 0x03, 0x45, 0x72, - 0x0f, 0xf4, 0xd1, 0xa8, 0xbb, 0xaf, 0xab, 0x45, 0xad, 0x07, 0xeb, 0x7b, 0xfe, 0x2c, 0xf0, 0x23, - 0x37, 0x66, 0xe9, 0xf2, 0xf7, 0xa0, 0xe6, 0x7a, 0x0e, 0x7b, 0x69, 0xb9, 0x0e, 0x9a, 0x56, 0x91, - 0x56, 0x71, 0x6c, 0x38, 0xdc, 0xe4, 0x4e, 0x65, 0x31, 0x55, 0xe4, 0x26, 0x87, 0x03, 0xed, 0x2f, - 0x15, 0x28, 0x1b, 0x1c, 0xc1, 0x8d, 0x4f, 0x9e, 0x14, 0x7a, 0x8f, 0x30, 0x4c, 0x10, 0x24, 0x93, - 0xfb, 0x50, 0x1b, 0x6a, 0xb6, 0x37, 0x66, 0xbc, 0xe2, 0xc3, 0x3c, 0x50, 0xa3, 0xe9, 0x98, 0x7c, - 0x99, 0xd1, 0x9f, 0x82, 0x2e, 0x7b, 0x2f, 0xa3, 0x0a, 0x7c, 0xc1, 0x12, 0x2d, 0xb6, 0xff, 0xaa, - 0x90, 0x49, 0x6e, 0xcb, 0x12, 0x4f, 0x1f, 0xea, 0x8e, 0x1b, 0x32, 0xac, 0x23, 0xe5, 0x41, 0x3f, - 0xb8, 0x74, 0xe1, 0x4e, 0x2f, 0x81, 0xee, 0xd4, 0xbb, 0xa3, 0x3d, 0x7d, 0xd0, 0xe3, 0x99, 0xef, - 0x7c, 0x01, 0xed, 0x23, 0xa8, 0xa7, 0x10, 0x0c, 0xc7, 0x09, 0x48, 0x2d, 0x70, 0xf5, 0xf6, 0xf4, - 0x74, 0xac, 0x68, 0x7f, 0xad, 0x40, 0x33, 0xd5, 0xaf, 0xd0, 0xd0, 0x6d, 0xa8, 0xd8, 0x41, 0x90, - 0xa8, 0xb6, 0x4e, 0xcb, 0x76, 0x10, 0x18, 0x8e, 0x8c, 0x2d, 0x0a, 0x6a, 0x9b, 0xc7, 0x96, 0x4f, - 0x01, 0x1c, 0x36, 0x71, 0x3d, 0x17, 0x85, 0x2e, 0xa2, 0xc1, 0xab, 0x8b, 0x42, 0xd3, 0x0c, 0x86, - 0x7c, 0x09, 0xe5, 0x28, 0xb6, 0x63, 0x91, 0x2b, 0x9b, 0xdb, 0xf7, 0x33, 0xe0, 0xbc, 0x08, 0x9d, - 0x11, 0x87, 0x51, 0x81, 0x26, 0x5f, 0xc1, 0x2d, 0xdf, 0x9b, 0x9e, 0x59, 0xf3, 0x88, 0x59, 0xee, - 0xc4, 0x0a, 0xd9, 0x0f, 0x73, 0x37, 0x64, 0x4e, 0x3e, 0xa7, 0xae, 0x73, 0xc8, 0x51, 0xc4, 0x8c, - 0x09, 0x95, 0x7c, 0xed, 0x6b, 0x28, 0xe3, 0x3a, 0x7c, 0xcf, 0xdf, 0x51, 0xc3, 0xd4, 0xad, 0xe1, - 0xa0, 0xff, 0x54, 0xe8, 0x80, 0xea, 0xdd, 0x9e, 0x85, 0x44, 0x55, 0xe1, 0xc1, 0xbe, 0xa7, 0xf7, - 0x75, 0x53, 0xef, 0xa9, 0x45, 0x9e, 0x3d, 0x74, 0x4a, 0x87, 0x54, 0x2d, 0x69, 0xff, 0x53, 0x80, - 0x15, 0x94, 0xe7, 0xd0, 0x8f, 0xe2, 0x89, 0xfb, 0x92, 0xec, 0x41, 0x43, 0x98, 0xdd, 0xa9, 0x2c, - 0xe8, 0xb9, 0x33, 0x68, 0x8b, 0x7b, 0x96, 0x68, 0x31, 0x90, 0x75, 0xb4, 0x9b, 0x3e, 0x27, 0x21, - 0x45, 0x41, 0xa7, 0xbf, 0x22, 0xa4, 0xbc, 0x05, 0x95, 0x67, 0x6c, 0xe2, 0x87, 0x22, 0x04, 0xd6, - 0x76, 0x4a, 0x71, 0x38, 0x67, 0x54, 0xd2, 0xda, 0x36, 0xc0, 0xf9, 0xfa, 0xe4, 0x01, 0xac, 0x26, - 0xc6, 0x66, 0xa1, 0x71, 0x89, 0x93, 0x5b, 0x49, 0x88, 0x83, 0x5c, 0x75, 0xa3, 0x5c, 0xab, 0xba, - 0xd1, 0xbe, 0x86, 0xd5, 0x64, 0x3f, 0xe2, 0xfc, 0x54, 0x21, 0x79, 0x01, 0x63, 0xca, 0x82, 0x8c, - 0xca, 0x45, 0x19, 0xb5, 0x9f, 0x41, 0x6d, 0xe4, 0xd9, 0x41, 0x74, 0xe2, 0xc7, 0xdc, 0x7a, 0xe2, - 0x48, 0xfa, 0xaa, 0x12, 0x47, 0x9a, 0x06, 0x15, 0x7e, 0x38, 0xf3, 0x88, 0xbb, 0xbf, 0x31, 0xe8, - 0xee, 0x99, 0xc6, 0xb7, 0xba, 0xfa, 0x06, 0x01, 0xa8, 0xc8, 0xe7, 0x82, 0xa6, 0x41, 0xd3, 0x90, - 0xed, 0xd8, 0x63, 0x66, 0x3b, 0x2c, 0xe4, 0x12, 0xfc, 0xe0, 0x47, 0x89, 0x04, 0x3f, 0xf8, 0x91, - 0xf6, 0x17, 0x05, 0x68, 0x98, 0xa1, 0xed, 0x45, 0xb6, 0x30, 0xf7, 0xcf, 0xa0, 0x72, 0x82, 0x58, - 0x74, 0xa3, 0xc6, 0x82, 0x7f, 0x66, 0x17, 0xa3, 0x12, 0x48, 0xee, 0x40, 0xe5, 0xc4, 0xf6, 0x9c, - 0xa9, 0xd0, 0x5a, 0x85, 0xca, 0x51, 0x92, 0x1b, 0x95, 0xf3, 0xdc, 0xb8, 0x05, 0x2b, 0x33, 0x3b, - 0x7c, 0x6e, 0x8d, 0x4f, 0x6c, 0xef, 0x98, 0x45, 0xf2, 0x60, 0xa4, 0x05, 0x36, 0x38, 0x6b, 0x4f, - 0x70, 0xb4, 0xbf, 0x5f, 0x81, 0xf2, 0x37, 0x73, 0x16, 0x9e, 0x65, 0x04, 0xfa, 0xe0, 0xba, 0x02, - 0xc9, 0x17, 0x17, 0x2e, 0x4b, 0xca, 0x6f, 0x2f, 0x26, 0x65, 0x22, 0x53, 0x84, 0xc8, 0x95, 0x22, - 0x0b, 0x7c, 0x9a, 0x09, 0x63, 0xeb, 0x57, 0xd8, 0xda, 0x79, 0x70, 0x7b, 0x08, 0x95, 0x89, 0x3b, - 0x8d, 0x51, 0x75, 0x8b, 0xd5, 0x08, 0xee, 0xa5, 0xf3, 0x08, 0xd9, 0x54, 0xc2, 0xc8, 0xbb, 0xb0, - 0x22, 0x2a, 0x59, 0xeb, 0x07, 0xce, 0xc6, 0x82, 0x95, 0xf7, 0xa6, 0x48, 0x13, 0xbb, 0xff, 0x18, - 0xca, 0x7e, 0xc8, 0x37, 0x5f, 0xc7, 0x25, 0xef, 0x5c, 0x58, 0x72, 0xc8, 0xb9, 0x54, 0x80, 0xc8, - 0x87, 0x50, 0x3a, 0x71, 0xbd, 0x18, 0xb3, 0x46, 0x73, 0xfb, 0xf6, 0x05, 0xf0, 0x63, 0xd7, 0x8b, - 0x29, 0x42, 0x78, 0x98, 0x1f, 0xfb, 0x73, 0x2f, 0x6e, 0xdd, 0xc5, 0x0c, 0x23, 0x06, 0xe4, 0x1e, - 0x54, 0xfc, 0xc9, 0x24, 0x62, 0x31, 0x76, 0x96, 0xe5, 0x9d, 0xc2, 0xa7, 0x54, 0x12, 0xf8, 0x84, - 0xa9, 0x3b, 0x73, 0x63, 0xec, 0x43, 0xca, 0x54, 0x0c, 0xc8, 0x2e, 0xac, 0x8d, 0xfd, 0x59, 0xe0, - 0x4e, 0x99, 0x63, 0x8d, 0xe7, 0x61, 0xe4, 0x87, 0xad, 0x77, 0x2e, 0x1c, 0xd3, 0x9e, 0x44, 0xec, - 0x21, 0x80, 0x36, 0xc7, 0xb9, 0x31, 0x31, 0x60, 0x83, 0x79, 0x8e, 0xb5, 0xb8, 0xce, 0xfd, 0xd7, - 0xad, 0xb3, 0xce, 0x3c, 0x27, 0x4f, 0x4a, 0xc4, 0xc1, 0x48, 0x68, 0x61, 0xcc, 0x68, 0x6d, 0x60, - 0x90, 0xb9, 0x77, 0x69, 0xac, 0x14, 0xe2, 0x64, 0xc2, 0xf7, 0x6f, 0xc0, 0x2d, 0x19, 0x22, 0xad, - 0x80, 0x85, 0x13, 0x36, 0x8e, 0xad, 0x60, 0x6a, 0x7b, 0x58, 0xca, 0xa5, 0xc6, 0x4a, 0x24, 0xe4, - 0x50, 0x20, 0x0e, 0xa7, 0xb6, 0x47, 0x34, 0xa8, 0x3f, 0x67, 0x67, 0x91, 0xc5, 0x23, 0x29, 0x76, - 0xae, 0x29, 0xba, 0xc6, 0xe9, 0x43, 0x6f, 0x7a, 0x46, 0x7e, 0x02, 0x8d, 0xf8, 0xdc, 0xdb, 0xb0, - 0x61, 0x6d, 0xe4, 0x4e, 0x35, 0xe3, 0x8b, 0x34, 0x0b, 0x25, 0xf7, 0xa1, 0x2a, 0x35, 0xd4, 0xba, - 0x97, 0x5d, 0x3b, 0xa1, 0xf2, 0xc4, 0x3c, 0xb1, 0xdd, 0xa9, 0x7f, 0xca, 0x42, 0x6b, 0x16, 0xb5, - 0xda, 0xe2, 0xb6, 0x24, 0x21, 0x1d, 0x44, 0xdc, 0x4f, 0xa3, 0x38, 0xf4, 0xbd, 0xe3, 0xd6, 0x26, - 0xde, 0x93, 0xc8, 0xd1, 0xc5, 0xe0, 0xf7, 0x2e, 0x66, 0xfe, 0x7c, 0xf0, 0xfb, 0x1c, 0xee, 0x60, - 0x65, 0x66, 0x3d, 0x3b, 0xb3, 0xf2, 0x68, 0x0d, 0xd1, 0x1b, 0xc8, 0xdd, 0x3d, 0x3b, 0xcc, 0x4e, - 0x6a, 0x43, 0xcd, 0x71, 0xa3, 0xd8, 0xf5, 0xc6, 0x71, 0xab, 0x85, 0xef, 0x4c, 0xc7, 0xe4, 0x33, - 0xb8, 0x3d, 0x73, 0x3d, 0x2b, 0xb2, 0x27, 0xcc, 0x8a, 0x5d, 0xee, 0x9b, 0x6c, 0xec, 0x7b, 0x4e, - 0xd4, 0x7a, 0x80, 0x82, 0x93, 0x99, 0xeb, 0x8d, 0xec, 0x09, 0x33, 0xdd, 0x19, 0x1b, 0x09, 0x0e, - 0xf9, 0x08, 0xd6, 0x11, 0x1e, 0xb2, 0x60, 0xea, 0x8e, 0x6d, 0xf1, 0xfa, 0x1f, 0xe1, 0xeb, 0xd7, - 0x38, 0x83, 0x0a, 0x3a, 0xbe, 0xfa, 0x63, 0x68, 0x06, 0x2c, 0x8c, 0xdc, 0x28, 0xb6, 0xa4, 0x45, - 0xbf, 0x97, 0xd5, 0xda, 0xaa, 0x64, 0x0e, 0x91, 0xd7, 0xfe, 0xcf, 0x02, 0x54, 0x84, 0x73, 0x92, - 0x4f, 0x41, 0xf1, 0x03, 0xbc, 0x06, 0x69, 0x6e, 0x6f, 0x5e, 0xe2, 0xc1, 0x9d, 0x61, 0xc0, 0xeb, - 0x5e, 0x3f, 0xa4, 0x8a, 0x1f, 0xdc, 0xb8, 0x28, 0xd4, 0xfe, 0x10, 0x6a, 0xc9, 0x02, 0xbc, 0xbc, - 0xe8, 0xeb, 0xa3, 0x91, 0x65, 0x3e, 0xee, 0x0e, 0xd4, 0x02, 0xb9, 0x03, 0x24, 0x1d, 0x5a, 0x43, - 0x6a, 0xe9, 0xdf, 0x1c, 0x75, 0xfb, 0xaa, 0x82, 0x5d, 0x1a, 0xd5, 0xbb, 0xa6, 0x4e, 0x05, 0xb2, - 0x48, 0xee, 0xc1, 0xed, 0x2c, 0xe5, 0x1c, 0x5c, 0xc2, 0x14, 0x8c, 0x8f, 0x65, 0x52, 0x01, 0xc5, - 0x18, 0xa8, 0x15, 0x9e, 0x16, 0xf4, 0xef, 0x8d, 0x91, 0x39, 0x52, 0xab, 0xed, 0xbf, 0x29, 0x40, - 0x19, 0xc3, 0x06, 0x3f, 0x9f, 0x54, 0x72, 0x71, 0x5d, 0x73, 0x5e, 0xb9, 0x1a, 0xd9, 0x92, 0xaa, - 0x81, 0x01, 0x65, 0x73, 0x79, 0xf4, 0xf9, 0xb5, 0xd6, 0x53, 0x3f, 0x85, 0x12, 0x8f, 0x52, 0xbc, - 0x43, 0x1c, 0xd2, 0x9e, 0x4e, 0xad, 0x47, 0x06, 0x1d, 0xf1, 0x2a, 0x97, 0x40, 0xb3, 0x3b, 0xd8, - 0xd3, 0x47, 0xe6, 0x30, 0xa1, 0xa1, 0x56, 0x1e, 0x19, 0x7d, 0x33, 0x45, 0x15, 0xb5, 0x9f, 0xd7, - 0x60, 0x35, 0x89, 0x09, 0x22, 0x82, 0x3e, 0x82, 0x46, 0x10, 0xba, 0x33, 0x3b, 0x3c, 0x8b, 0xc6, - 0xb6, 0x87, 0x49, 0x01, 0xb6, 0x7f, 0xb4, 0x24, 0xaa, 0x88, 0x1d, 0x1d, 0x0a, 0xec, 0x68, 0x6c, - 0x7b, 0x34, 0x3b, 0x91, 0xf4, 0x61, 0x75, 0xc6, 0xc2, 0x63, 0xf6, 0x7b, 0xbe, 0xeb, 0xe1, 0x4a, - 0x55, 0x8c, 0xc8, 0xef, 0x5f, 0xba, 0xd2, 0x01, 0x47, 0xff, 0x8e, 0xef, 0x7a, 0xb8, 0x56, 0x7e, - 0x32, 0xf9, 0x04, 0xea, 0xa2, 0x12, 0x72, 0xd8, 0x04, 0x63, 0xc5, 0xb2, 0xda, 0x4f, 0xd4, 0xe8, - 0x3d, 0x36, 0xc9, 0xc4, 0x65, 0xb8, 0x34, 0x2e, 0x37, 0xb2, 0x71, 0xf9, 0xcd, 0x6c, 0x2c, 0x5a, - 0x11, 0x55, 0x78, 0x1a, 0x84, 0x2e, 0x38, 0x7c, 0x6b, 0x89, 0xc3, 0x77, 0x60, 0x23, 0xf1, 0x55, - 0xcb, 0xf5, 0x26, 0xee, 0x4b, 0x2b, 0x72, 0x5f, 0x89, 0xd8, 0x53, 0xa6, 0xeb, 0x09, 0xcb, 0xe0, - 0x9c, 0x91, 0xfb, 0x8a, 0x11, 0x23, 0xe9, 0xe0, 0x64, 0x0e, 0x5c, 0xc5, 0xab, 0xc9, 0xf7, 0x2e, - 0x55, 0x8f, 0x68, 0xbe, 0x64, 0x46, 0xcc, 0x4d, 0x6d, 0xff, 0x52, 0x81, 0x46, 0xe6, 0x1c, 0x78, - 0xf6, 0x16, 0xca, 0x42, 0x61, 0xc5, 0x55, 0x94, 0x50, 0x1f, 0x4a, 0xfa, 0x26, 0xd4, 0xa3, 0xd8, - 0x0e, 0x63, 0x8b, 0x17, 0x57, 0xb2, 0xdd, 0x45, 0xc2, 0x13, 0x76, 0x46, 0x3e, 0x80, 0x35, 0xc1, - 0x74, 0xbd, 0xf1, 0x74, 0x1e, 0xb9, 0xa7, 0xa2, 0x99, 0xaf, 0xd1, 0x26, 0x92, 0x8d, 0x84, 0x4a, - 0xee, 0x42, 0x95, 0x67, 0x21, 0xbe, 0x86, 0x68, 0xfa, 0x2a, 0xcc, 0x73, 0xf8, 0x0a, 0x0f, 0x60, - 0x95, 0x33, 0xce, 0xe7, 0x57, 0xc4, 0x2d, 0x33, 0xf3, 0x9c, 0xf3, 0xd9, 0x1d, 0xd8, 0x10, 0xaf, - 0x09, 0x44, 0xf1, 0x2a, 0x2b, 0xdc, 0x3b, 0xa8, 0xd8, 0x75, 0x64, 0xc9, 0xb2, 0x56, 0x14, 0x9c, - 0x1f, 0x01, 0xcf, 0x5e, 0x0b, 0xe8, 0xbb, 0x22, 0x94, 0x31, 0xcf, 0xc9, 0x61, 0x77, 0xe1, 0x1d, - 0x8e, 0x9d, 0x7b, 0x76, 0x10, 0x4c, 0x5d, 0xe6, 0x58, 0x53, 0xff, 0x18, 0x43, 0x66, 0x14, 0xdb, - 0xb3, 0xc0, 0x9a, 0x47, 0xad, 0x0d, 0x0c, 0x99, 0x6d, 0xe6, 0x39, 0x47, 0x09, 0xa8, 0xef, 0x1f, - 0x9b, 0x09, 0xe4, 0x28, 0x6a, 0xff, 0x3e, 0xac, 0xe6, 0xec, 0x71, 0x41, 0xa7, 0x35, 0x74, 0xfe, - 0x8c, 0x4e, 0xdf, 0x85, 0x95, 0x20, 0x64, 0xe7, 0xa2, 0xd5, 0x51, 0xb4, 0x86, 0xa0, 0x09, 0xb1, - 0xb6, 0x60, 0x05, 0x79, 0x96, 0x20, 0xe6, 0xf3, 0x63, 0x03, 0x59, 0x87, 0xc8, 0x69, 0xbf, 0x80, - 0x95, 0xec, 0x69, 0x93, 0x77, 0x33, 0x69, 0xa1, 0x99, 0xcb, 0x93, 0x69, 0x76, 0x48, 0x2a, 0xb2, - 0xf5, 0x4b, 0x2a, 0x32, 0x72, 0x9d, 0x8a, 0x4c, 0xfb, 0x2f, 0xd9, 0x9c, 0x65, 0x2a, 0x84, 0x9f, - 0x41, 0x2d, 0x90, 0xf5, 0x38, 0x5a, 0x52, 0xfe, 0x12, 0x3e, 0x0f, 0xee, 0x24, 0x95, 0x3b, 0x4d, - 0xe7, 0xb4, 0xff, 0x56, 0x81, 0x5a, 0x5a, 0xd0, 0xe7, 0x2c, 0xef, 0xcd, 0x05, 0xcb, 0x3b, 0x90, - 0x1a, 0x16, 0x0a, 0x7c, 0x1b, 0xa3, 0xc5, 0x27, 0xaf, 0x7f, 0xd7, 0xc5, 0xb6, 0xe7, 0x34, 0xdb, - 0xf6, 0x6c, 0xbe, 0xae, 0xed, 0xf9, 0xe4, 0xa2, 0xc1, 0xbf, 0x95, 0xe9, 0x2d, 0x16, 0xcc, 0xbe, - 0xfd, 0x7d, 0xae, 0x0f, 0xca, 0x26, 0x84, 0x77, 0xc4, 0x7e, 0xd2, 0x84, 0x90, 0xb6, 0x3f, 0xf7, - 0xaf, 0xd7, 0xfe, 0x6c, 0x43, 0x45, 0xea, 0xfc, 0x0e, 0x54, 0x64, 0x4d, 0x27, 0x1b, 0x04, 0x31, - 0x3a, 0x6f, 0x10, 0x0a, 0xb2, 0x4e, 0xd7, 0x7e, 0xae, 0x40, 0x59, 0x0f, 0x43, 0x3f, 0xd4, 0xfe, - 0x48, 0x81, 0x3a, 0x3e, 0xed, 0xf9, 0x0e, 0xe3, 0xd9, 0x60, 0xb7, 0xdb, 0xb3, 0xa8, 0xfe, 0xcd, - 0x91, 0x8e, 0xd9, 0xa0, 0x0d, 0x77, 0xf6, 0x86, 0x83, 0xbd, 0x23, 0x4a, 0xf5, 0x81, 0x69, 0x99, - 0xb4, 0x3b, 0x18, 0xf1, 0xb6, 0x67, 0x38, 0x50, 0x15, 0x9e, 0x29, 0x8c, 0x81, 0xa9, 0xd3, 0x41, - 0xb7, 0x6f, 0x89, 0x56, 0xb4, 0x88, 0x77, 0xb3, 0xba, 0xde, 0xb3, 0xf0, 0xd6, 0x51, 0x2d, 0xf1, - 0x96, 0xd5, 0x34, 0x0e, 0xf4, 0xe1, 0x91, 0xa9, 0x96, 0xc9, 0x6d, 0x58, 0x3f, 0xd4, 0xe9, 0x81, - 0x31, 0x1a, 0x19, 0xc3, 0x81, 0xd5, 0xd3, 0x07, 0x86, 0xde, 0x53, 0x2b, 0x7c, 0x9d, 0x5d, 0x63, - 0xdf, 0xec, 0xee, 0xf6, 0x75, 0xb9, 0x4e, 0x95, 0x6c, 0xc2, 0x5b, 0x7b, 0xc3, 0x83, 0x03, 0xc3, - 0x34, 0xf5, 0x9e, 0xb5, 0x7b, 0x64, 0x5a, 0x23, 0xd3, 0xe8, 0xf7, 0xad, 0xee, 0xe1, 0x61, 0xff, - 0x29, 0x4f, 0x60, 0x35, 0x72, 0x17, 0x36, 0xf6, 0xba, 0x87, 0xdd, 0x5d, 0xa3, 0x6f, 0x98, 0x4f, - 0xad, 0x9e, 0x31, 0xe2, 0xf3, 0x7b, 0x6a, 0x9d, 0x27, 0x6c, 0x93, 0x3e, 0xb5, 0xba, 0x7d, 0x14, - 0xcd, 0xd4, 0xad, 0xdd, 0xee, 0xde, 0x13, 0x7d, 0xd0, 0x53, 0x81, 0x0b, 0x30, 0xea, 0x3e, 0xd2, - 0x2d, 0x2e, 0x92, 0x65, 0x0e, 0x87, 0xd6, 0xb0, 0xdf, 0x53, 0x1b, 0xda, 0xbf, 0x14, 0xa1, 0xb4, - 0xe7, 0x47, 0x31, 0xf7, 0x46, 0xe1, 0xac, 0x2f, 0x42, 0x37, 0x66, 0xa2, 0x7f, 0x2b, 0x53, 0xd1, - 0x4b, 0x7f, 0x87, 0x24, 0x1e, 0x50, 0x32, 0x10, 0xeb, 0xd9, 0x19, 0xc7, 0x29, 0x88, 0x5b, 0x3b, - 0xc7, 0xed, 0x72, 0xb2, 0x88, 0x68, 0x78, 0x85, 0x23, 0xd7, 0x2b, 0x22, 0x4e, 0x06, 0x61, 0xb9, - 0xe0, 0xc7, 0x40, 0xb2, 0x20, 0xb9, 0x62, 0x09, 0x91, 0x6a, 0x06, 0x29, 0x96, 0xdc, 0x01, 0x18, - 0xfb, 0xb3, 0x99, 0x1b, 0x8f, 0xfd, 0x28, 0x96, 0x5f, 0xc8, 0xda, 0x39, 0x63, 0x8f, 0x62, 0x6e, - 0xf1, 0x33, 0x37, 0xe6, 0x8f, 0x34, 0x83, 0x26, 0x3b, 0x70, 0xcf, 0x0e, 0x82, 0xd0, 0x7f, 0xe9, - 0xce, 0xec, 0x98, 0x59, 0xdc, 0x73, 0xed, 0x63, 0x66, 0x39, 0x6c, 0x1a, 0xdb, 0xd8, 0x13, 0x95, - 0xe9, 0xdd, 0x0c, 0x60, 0x24, 0xf8, 0x3d, 0xce, 0xe6, 0x71, 0xd7, 0x75, 0xac, 0x88, 0xfd, 0x30, - 0xe7, 0x1e, 0x60, 0xcd, 0x03, 0xc7, 0xe6, 0x62, 0xd6, 0x45, 0x96, 0x72, 0x9d, 0x91, 0xe4, 0x1c, - 0x09, 0x46, 0xfb, 0x15, 0xc0, 0xb9, 0x14, 0x64, 0x1b, 0x6e, 0xf3, 0x3a, 0x9e, 0x45, 0x31, 0x73, - 0x2c, 0xb9, 0xdb, 0x60, 0x1e, 0x47, 0x18, 0xe2, 0xcb, 0x74, 0x23, 0x65, 0xca, 0x9b, 0xc2, 0x79, - 0x1c, 0x91, 0x9f, 0x40, 0xeb, 0xc2, 0x1c, 0x87, 0x4d, 0x19, 0x7f, 0x6d, 0x15, 0xa7, 0xdd, 0x59, - 0x98, 0xd6, 0x13, 0x5c, 0xed, 0x4f, 0x14, 0x80, 0x7d, 0x16, 0x53, 0xc1, 0xcd, 0x34, 0xb6, 0x95, - 0xeb, 0x36, 0xb6, 0xef, 0x27, 0x17, 0x08, 0xc5, 0xab, 0x63, 0xc0, 0x42, 0x97, 0xa1, 0xdc, 0xa4, - 0xcb, 0xc8, 0x35, 0x11, 0xc5, 0x2b, 0x9a, 0x88, 0x52, 0xae, 0x89, 0xf8, 0x18, 0x9a, 0xf6, 0x74, - 0xea, 0xbf, 0xe0, 0x05, 0x0d, 0x0b, 0x43, 0xe6, 0xa0, 0x11, 0x9c, 0xd7, 0xdb, 0xc8, 0xec, 0x49, - 0x9e, 0xf6, 0xe7, 0x0a, 0x34, 0x50, 0x15, 0x51, 0xe0, 0x7b, 0x11, 0x23, 0x5f, 0x42, 0x45, 0x5e, - 0x44, 0x8b, 0x8b, 0xfc, 0xb7, 0x33, 0xb2, 0x66, 0x70, 0xb2, 0x68, 0xa0, 0x12, 0xcc, 0x33, 0x42, - 0xe6, 0x75, 0x97, 0x2b, 0x25, 0x45, 0x91, 0xfb, 0x50, 0x73, 0x3d, 0x4b, 0xb4, 0xd4, 0x95, 0x4c, - 0x58, 0xac, 0xba, 0x1e, 0xd6, 0xb2, 0xed, 0x57, 0x50, 0x11, 0x2f, 0x21, 0x9d, 0x54, 0xa6, 0x8b, - 0xfa, 0xcb, 0xdc, 0x1c, 0xa7, 0xc2, 0xc8, 0xc3, 0x29, 0xbd, 0x2e, 0x40, 0xb7, 0xa0, 0x7a, 0xca, - 0x9b, 0x0f, 0xbc, 0xf4, 0xe3, 0xea, 0x4d, 0x86, 0xda, 0x1f, 0x97, 0x00, 0x0e, 0xe7, 0x4b, 0x0c, - 0xa4, 0x71, 0x5d, 0x03, 0xe9, 0xe4, 0xf4, 0xf8, 0x7a, 0x99, 0x7f, 0x75, 0x43, 0x59, 0xd2, 0x69, - 0x17, 0x6f, 0xda, 0x69, 0xdf, 0x87, 0x6a, 0x1c, 0xce, 0xb9, 0xa3, 0x08, 0x63, 0x4a, 0x5b, 0x5a, - 0x49, 0x25, 0x6f, 0x42, 0x79, 0xe2, 0x87, 0x63, 0x86, 0x8e, 0x95, 0xb2, 0x05, 0xed, 0xc2, 0x65, - 0x52, 0xed, 0xb2, 0xcb, 0x24, 0xde, 0xa0, 0x45, 0xf2, 0x1e, 0x0d, 0x0b, 0x99, 0x7c, 0x83, 0x96, - 0x5c, 0xb1, 0xd1, 0x14, 0x44, 0xbe, 0x81, 0xa6, 0x3d, 0x8f, 0x7d, 0xcb, 0xe5, 0x15, 0xda, 0xd4, - 0x1d, 0x9f, 0x61, 0xd9, 0xdd, 0xcc, 0x7f, 0xaf, 0x4f, 0x0f, 0xaa, 0xd3, 0x9d, 0xc7, 0xbe, 0xe1, - 0x1c, 0x22, 0x72, 0xa7, 0x2a, 0x93, 0x12, 0x5d, 0xb1, 0x33, 0x64, 0xed, 0xc7, 0xb0, 0x92, 0x85, - 0xf1, 0x04, 0x24, 0x81, 0xea, 0x1b, 0x3c, 0x3b, 0x8d, 0x78, 0x6a, 0x1b, 0x98, 0x46, 0xb7, 0xaf, - 0x16, 0xb4, 0x18, 0x1a, 0xb8, 0xbc, 0xf4, 0x8e, 0xeb, 0xba, 0xfd, 0x03, 0x28, 0x61, 0xf8, 0x55, - 0x2e, 0x7c, 0x0f, 0xc1, 0x98, 0x8b, 0xcc, 0xbc, 0xf9, 0x15, 0xb3, 0xe6, 0xf7, 0xdf, 0x05, 0x58, - 0x31, 0xfd, 0xf9, 0xf8, 0xe4, 0xa2, 0x01, 0xc2, 0xaf, 0x3b, 0x42, 0x2d, 0x31, 0x1f, 0xe5, 0xa6, - 0xe6, 0x93, 0x5a, 0x47, 0x71, 0x89, 0x75, 0xdc, 0xf4, 0xcc, 0xb5, 0x2f, 0x60, 0x55, 0x6e, 0x5e, - 0x6a, 0x3d, 0xd1, 0x66, 0xe1, 0x0a, 0x6d, 0x6a, 0xbf, 0x50, 0x60, 0x55, 0xc4, 0xf7, 0xff, 0xbb, - 0xd2, 0x2a, 0x37, 0x0c, 0xeb, 0xe5, 0x1b, 0x5d, 0x1e, 0xfd, 0xbf, 0xf4, 0x34, 0x6d, 0x08, 0xcd, - 0x44, 0x7d, 0x37, 0x50, 0xfb, 0x15, 0x46, 0xfc, 0x8b, 0x02, 0x34, 0x06, 0xec, 0xe5, 0x92, 0x20, - 0x5a, 0xbe, 0xee, 0x71, 0x7c, 0x98, 0x2b, 0x57, 0x1b, 0xdb, 0xeb, 0x59, 0x19, 0xc4, 0xd5, 0x63, - 0x52, 0xc1, 0xa6, 0xb7, 0xa8, 0xca, 0xf2, 0x5b, 0xd4, 0xd2, 0x62, 0xb7, 0x9e, 0xb9, 0xc5, 0x2b, - 0x2e, 0xbb, 0xc5, 0xd3, 0xfe, 0xad, 0x08, 0x0d, 0x6c, 0x90, 0x29, 0x8b, 0xe6, 0xd3, 0x38, 0x27, - 0x4c, 0xe1, 0x6a, 0x61, 0x3a, 0x50, 0x09, 0x71, 0x92, 0x74, 0xa5, 0x4b, 0x83, 0xbf, 0x40, 0x61, - 0x6b, 0xfc, 0xdc, 0x0d, 0x02, 0xe6, 0x58, 0x82, 0x92, 0x14, 0x30, 0x4d, 0x49, 0x16, 0x22, 0x44, - 0xbc, 0xfc, 0x9c, 0xf9, 0x21, 0x4b, 0x51, 0x45, 0xbc, 0x4f, 0x68, 0x70, 0x5a, 0x02, 0xc9, 0xdd, - 0x37, 0x88, 0xca, 0xe0, 0xfc, 0xbe, 0x21, 0xed, 0x35, 0x91, 0x5b, 0x47, 0xae, 0xe8, 0x35, 0x91, - 0xcd, 0xbb, 0xa8, 0x99, 0x3d, 0x9d, 0x5a, 0x7e, 0x10, 0xa1, 0xd3, 0xd4, 0x68, 0x0d, 0x09, 0xc3, - 0x20, 0x22, 0x5f, 0x43, 0x7a, 0x5d, 0x2c, 0x6f, 0xc9, 0xc5, 0x39, 0xb6, 0x2e, 0xbb, 0x58, 0xa0, - 0xab, 0xe3, 0xdc, 0xfd, 0xcf, 0x92, 0x1b, 0xea, 0xca, 0x4d, 0x6f, 0xa8, 0x1f, 0x42, 0x59, 0xc4, - 0xa8, 0xda, 0xeb, 0x62, 0x94, 0xc0, 0x65, 0xed, 0xb3, 0x91, 0xb7, 0xcf, 0x5f, 0x16, 0x80, 0x74, - 0xa7, 0x53, 0x7f, 0x6c, 0xc7, 0xcc, 0x70, 0xa2, 0x8b, 0x66, 0x7a, 0xed, 0xcf, 0x2e, 0x9f, 0x41, - 0x7d, 0xe6, 0x3b, 0x6c, 0x6a, 0x25, 0xdf, 0x94, 0x2e, 0xad, 0x7e, 0x10, 0xc6, 0x5b, 0x52, 0x02, - 0x25, 0xbc, 0xc4, 0x51, 0xb0, 0xee, 0xc0, 0x67, 0xde, 0x84, 0xcd, 0xec, 0x97, 0xb2, 0x14, 0xe1, - 0x8f, 0xa4, 0x03, 0xd5, 0x90, 0x45, 0x2c, 0x3c, 0x65, 0x57, 0x16, 0x55, 0x09, 0x48, 0x7b, 0x06, - 0x1b, 0xb9, 0x1d, 0x49, 0x47, 0xbe, 0x85, 0x5f, 0x2b, 0xc3, 0x58, 0x7e, 0xb4, 0x12, 0x03, 0xfe, - 0x3a, 0xe6, 0x25, 0x9f, 0x41, 0xf9, 0x63, 0xea, 0xf0, 0xc5, 0xab, 0xe2, 0xec, 0x1e, 0xa8, 0x59, - 0x4d, 0xbb, 0x63, 0x0c, 0x36, 0xf2, 0x54, 0x0a, 0xd7, 0x3b, 0x15, 0xed, 0xef, 0x0a, 0xb0, 0xde, - 0x75, 0x1c, 0xf1, 0x77, 0xc3, 0x25, 0xaa, 0x2f, 0x5e, 0x57, 0xf5, 0x0b, 0x81, 0x58, 0x84, 0x89, - 0x6b, 0x05, 0xe2, 0x0f, 0xa1, 0x92, 0xd6, 0x5a, 0xc5, 0x05, 0x77, 0x16, 0x72, 0x51, 0x09, 0xd0, - 0x6e, 0x01, 0xc9, 0x0a, 0x2b, 0xb4, 0xaa, 0xfd, 0x69, 0x11, 0xee, 0xee, 0xb2, 0x63, 0xd7, 0xcb, - 0xbe, 0xe2, 0x57, 0xdf, 0xc9, 0xc5, 0x4f, 0x65, 0x9f, 0xc1, 0xba, 0x28, 0xe4, 0x93, 0x7f, 0x62, - 0x59, 0xec, 0x58, 0x7e, 0x9d, 0x94, 0xb1, 0x6a, 0x0d, 0xf9, 0x07, 0x92, 0xad, 0xe3, 0x7f, 0xc5, - 0x1c, 0x3b, 0xb6, 0x9f, 0xd9, 0x11, 0xb3, 0x5c, 0x47, 0xfe, 0x59, 0x06, 0x12, 0x92, 0xe1, 0x90, - 0x21, 0x94, 0xb8, 0x0d, 0xa2, 0xeb, 0x36, 0xb7, 0xb7, 0x33, 0x62, 0x5d, 0xb2, 0x95, 0xac, 0x02, - 0x0f, 0x7c, 0x87, 0xed, 0x54, 0x8f, 0x06, 0x4f, 0x06, 0xc3, 0xef, 0x06, 0x14, 0x17, 0x22, 0x06, - 0xdc, 0x0a, 0x42, 0x76, 0xea, 0xfa, 0xf3, 0xc8, 0xca, 0x9e, 0x44, 0xf5, 0xca, 0x94, 0xb8, 0x91, - 0xcc, 0xc9, 0x10, 0xb5, 0x9f, 0xc2, 0xda, 0xc2, 0xcb, 0x78, 0x6d, 0x26, 0x5f, 0xa7, 0xbe, 0x41, - 0x56, 0xa1, 0x8e, 0x1f, 0xbb, 0x97, 0x7f, 0xfb, 0xd6, 0xfe, 0xb5, 0x80, 0x57, 0x4c, 0x33, 0x37, - 0xbe, 0x59, 0x06, 0xfb, 0xcd, 0x7c, 0x06, 0x83, 0xed, 0x77, 0xf3, 0xe6, 0x9b, 0x59, 0xb0, 0xf3, - 0xad, 0x00, 0xa6, 0x41, 0xa4, 0x6d, 0x43, 0x55, 0xd2, 0xc8, 0x6f, 0xc1, 0x5a, 0xe8, 0xfb, 0x71, - 0xd2, 0x89, 0x8a, 0x0e, 0xe4, 0xf2, 0x3f, 0xdb, 0xac, 0x72, 0xb0, 0x48, 0x06, 0x4f, 0xf2, 0xbd, - 0x48, 0x59, 0xfc, 0x0d, 0x44, 0x0e, 0x77, 0x1b, 0xbf, 0x5b, 0x4f, 0xff, 0xb7, 0xfb, 0xbf, 0x01, - 0x00, 0x00, 0xff, 0xff, 0x35, 0x9f, 0x30, 0x98, 0xf2, 0x2b, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto deleted file mode 100644 index 497b4d9a9..000000000 --- a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto +++ /dev/null @@ -1,551 +0,0 @@ -syntax = "proto2"; -option go_package = "datastore"; - -package appengine; - -message Action{} - -message PropertyValue { - optional int64 int64Value = 1; - optional bool booleanValue = 2; - optional string stringValue = 3; - optional double doubleValue = 4; - - optional group PointValue = 5 { - required double x = 6; - required double y = 7; - } - - optional group UserValue = 8 { - required string email = 9; - required string auth_domain = 10; - optional string nickname = 11; - optional string federated_identity = 21; - optional string federated_provider = 22; - } - - optional group ReferenceValue = 12 { - required string app = 13; - optional string name_space = 20; - repeated group PathElement = 14 { - required string type = 15; - optional int64 id = 16; - optional string name = 17; - } - } -} - -message Property { - enum Meaning { - NO_MEANING = 0; - BLOB = 14; - TEXT = 15; - BYTESTRING = 16; - - ATOM_CATEGORY = 1; - ATOM_LINK = 2; - ATOM_TITLE = 3; - ATOM_CONTENT = 4; - ATOM_SUMMARY = 5; - ATOM_AUTHOR = 6; - - GD_WHEN = 7; - GD_EMAIL = 8; - GEORSS_POINT = 9; - GD_IM = 10; - - GD_PHONENUMBER = 11; - GD_POSTALADDRESS = 12; - - GD_RATING = 13; - - BLOBKEY = 17; - ENTITY_PROTO = 19; - - INDEX_VALUE = 18; - }; - - optional Meaning meaning = 1 [default = NO_MEANING]; - optional string meaning_uri = 2; - - required string name = 3; - - required PropertyValue value = 5; - - required bool multiple = 4; - - optional bool searchable = 6 [default=false]; - - enum FtsTokenizationOption { - HTML = 1; - ATOM = 2; - } - - optional FtsTokenizationOption fts_tokenization_option = 8; - - optional string locale = 9 [default = "en"]; -} - -message Path { - repeated group Element = 1 { - required string type = 2; - optional int64 id = 3; - optional string name = 4; - } -} - -message Reference { - required string app = 13; - optional string name_space = 20; - required Path path = 14; -} - -message User { - required string email = 1; - required string auth_domain = 2; - optional string nickname = 3; - optional string federated_identity = 6; - optional string federated_provider = 7; -} - -message EntityProto { - required Reference key = 13; - required Path entity_group = 16; - optional User owner = 17; - - enum Kind { - GD_CONTACT = 1; - GD_EVENT = 2; - GD_MESSAGE = 3; - } - optional Kind kind = 4; - optional string kind_uri = 5; - - repeated Property property = 14; - repeated Property raw_property = 15; - - optional int32 rank = 18; -} - -message CompositeProperty { - required int64 index_id = 1; - repeated string value = 2; -} - -message Index { - required string entity_type = 1; - required bool ancestor = 5; - repeated group Property = 2 { - required string name = 3; - enum Direction { - ASCENDING = 1; - DESCENDING = 2; - } - optional Direction direction = 4 [default = ASCENDING]; - } -} - -message CompositeIndex { - required string app_id = 1; - required int64 id = 2; - required Index definition = 3; - - enum State { - WRITE_ONLY = 1; - READ_WRITE = 2; - DELETED = 3; - ERROR = 4; - } - required State state = 4; - - optional bool only_use_if_required = 6 [default = false]; -} - -message IndexPostfix { - message IndexValue { - required string property_name = 1; - required PropertyValue value = 2; - } - - repeated IndexValue index_value = 1; - - optional Reference key = 2; - - optional bool before = 3 [default=true]; -} - -message IndexPosition { - optional string key = 1; - - optional bool before = 2 [default=true]; -} - -message Snapshot { - enum Status { - INACTIVE = 0; - ACTIVE = 1; - } - - required int64 ts = 1; -} - -message InternalHeader { - optional string qos = 1; -} - -message Transaction { - optional InternalHeader header = 4; - required fixed64 handle = 1; - required string app = 2; - optional bool mark_changes = 3 [default = false]; -} - -message Query { - optional InternalHeader header = 39; - - required string app = 1; - optional string name_space = 29; - - optional string kind = 3; - optional Reference ancestor = 17; - - repeated group Filter = 4 { - enum Operator { - LESS_THAN = 1; - LESS_THAN_OR_EQUAL = 2; - GREATER_THAN = 3; - GREATER_THAN_OR_EQUAL = 4; - EQUAL = 5; - IN = 6; - EXISTS = 7; - } - - required Operator op = 6; - repeated Property property = 14; - } - - optional string search_query = 8; - - repeated group Order = 9 { - enum Direction { - ASCENDING = 1; - DESCENDING = 2; - } - - required string property = 10; - optional Direction direction = 11 [default = ASCENDING]; - } - - enum Hint { - ORDER_FIRST = 1; - ANCESTOR_FIRST = 2; - FILTER_FIRST = 3; - } - optional Hint hint = 18; - - optional int32 count = 23; - - optional int32 offset = 12 [default = 0]; - - optional int32 limit = 16; - - optional CompiledCursor compiled_cursor = 30; - optional CompiledCursor end_compiled_cursor = 31; - - repeated CompositeIndex composite_index = 19; - - optional bool require_perfect_plan = 20 [default = false]; - - optional bool keys_only = 21 [default = false]; - - optional Transaction transaction = 22; - - optional bool compile = 25 [default = false]; - - optional int64 failover_ms = 26; - - optional bool strong = 32; - - repeated string property_name = 33; - - repeated string group_by_property_name = 34; - - optional bool distinct = 24; - - optional int64 min_safe_time_seconds = 35; - - repeated string safe_replica_name = 36; - - optional bool persist_offset = 37 [default=false]; -} - -message CompiledQuery { - required group PrimaryScan = 1 { - optional string index_name = 2; - - optional string start_key = 3; - optional bool start_inclusive = 4; - optional string end_key = 5; - optional bool end_inclusive = 6; - - repeated string start_postfix_value = 22; - repeated string end_postfix_value = 23; - - optional int64 end_unapplied_log_timestamp_us = 19; - } - - repeated group MergeJoinScan = 7 { - required string index_name = 8; - - repeated string prefix_value = 9; - - optional bool value_prefix = 20 [default=false]; - } - - optional Index index_def = 21; - - optional int32 offset = 10 [default = 0]; - - optional int32 limit = 11; - - required bool keys_only = 12; - - repeated string property_name = 24; - - optional int32 distinct_infix_size = 25; - - optional group EntityFilter = 13 { - optional bool distinct = 14 [default=false]; - - optional string kind = 17; - optional Reference ancestor = 18; - } -} - -message CompiledCursor { - optional group Position = 2 { - optional string start_key = 27; - - repeated group IndexValue = 29 { - optional string property = 30; - required PropertyValue value = 31; - } - - optional Reference key = 32; - - optional bool start_inclusive = 28 [default=true]; - } -} - -message Cursor { - required fixed64 cursor = 1; - - optional string app = 2; -} - -message Error { - enum ErrorCode { - BAD_REQUEST = 1; - CONCURRENT_TRANSACTION = 2; - INTERNAL_ERROR = 3; - NEED_INDEX = 4; - TIMEOUT = 5; - PERMISSION_DENIED = 6; - BIGTABLE_ERROR = 7; - COMMITTED_BUT_STILL_APPLYING = 8; - CAPABILITY_DISABLED = 9; - TRY_ALTERNATE_BACKEND = 10; - SAFE_TIME_TOO_OLD = 11; - } -} - -message Cost { - optional int32 index_writes = 1; - optional int32 index_write_bytes = 2; - optional int32 entity_writes = 3; - optional int32 entity_write_bytes = 4; - optional group CommitCost = 5 { - optional int32 requested_entity_puts = 6; - optional int32 requested_entity_deletes = 7; - }; - optional int32 approximate_storage_delta = 8; - optional int32 id_sequence_updates = 9; -} - -message GetRequest { - optional InternalHeader header = 6; - - repeated Reference key = 1; - optional Transaction transaction = 2; - - optional int64 failover_ms = 3; - - optional bool strong = 4; - - optional bool allow_deferred = 5 [default=false]; -} - -message GetResponse { - repeated group Entity = 1 { - optional EntityProto entity = 2; - optional Reference key = 4; - - optional int64 version = 3; - } - - repeated Reference deferred = 5; - - optional bool in_order = 6 [default=true]; -} - -message PutRequest { - optional InternalHeader header = 11; - - repeated EntityProto entity = 1; - optional Transaction transaction = 2; - repeated CompositeIndex composite_index = 3; - - optional bool trusted = 4 [default = false]; - - optional bool force = 7 [default = false]; - - optional bool mark_changes = 8 [default = false]; - repeated Snapshot snapshot = 9; - - enum AutoIdPolicy { - CURRENT = 0; - SEQUENTIAL = 1; - } - optional AutoIdPolicy auto_id_policy = 10 [default = CURRENT]; -} - -message PutResponse { - repeated Reference key = 1; - optional Cost cost = 2; - repeated int64 version = 3; -} - -message TouchRequest { - optional InternalHeader header = 10; - - repeated Reference key = 1; - repeated CompositeIndex composite_index = 2; - optional bool force = 3 [default = false]; - repeated Snapshot snapshot = 9; -} - -message TouchResponse { - optional Cost cost = 1; -} - -message DeleteRequest { - optional InternalHeader header = 10; - - repeated Reference key = 6; - optional Transaction transaction = 5; - - optional bool trusted = 4 [default = false]; - - optional bool force = 7 [default = false]; - - optional bool mark_changes = 8 [default = false]; - repeated Snapshot snapshot = 9; -} - -message DeleteResponse { - optional Cost cost = 1; - repeated int64 version = 3; -} - -message NextRequest { - optional InternalHeader header = 5; - - required Cursor cursor = 1; - optional int32 count = 2; - - optional int32 offset = 4 [default = 0]; - - optional bool compile = 3 [default = false]; -} - -message QueryResult { - optional Cursor cursor = 1; - - repeated EntityProto result = 2; - - optional int32 skipped_results = 7; - - required bool more_results = 3; - - optional bool keys_only = 4; - - optional bool index_only = 9; - - optional bool small_ops = 10; - - optional CompiledQuery compiled_query = 5; - - optional CompiledCursor compiled_cursor = 6; - - repeated CompositeIndex index = 8; - - repeated int64 version = 11; -} - -message AllocateIdsRequest { - optional InternalHeader header = 4; - - optional Reference model_key = 1; - - optional int64 size = 2; - - optional int64 max = 3; - - repeated Reference reserve = 5; -} - -message AllocateIdsResponse { - required int64 start = 1; - required int64 end = 2; - optional Cost cost = 3; -} - -message CompositeIndices { - repeated CompositeIndex index = 1; -} - -message AddActionsRequest { - optional InternalHeader header = 3; - - required Transaction transaction = 1; - repeated Action action = 2; -} - -message AddActionsResponse { -} - -message BeginTransactionRequest { - optional InternalHeader header = 3; - - required string app = 1; - optional bool allow_multiple_eg = 2 [default = false]; - optional string database_id = 4; - - enum TransactionMode { - UNKNOWN = 0; - READ_ONLY = 1; - READ_WRITE = 2; - } - optional TransactionMode mode = 5 [default = UNKNOWN]; - - optional Transaction previous_transaction = 7; -} - -message CommitResponse { - optional Cost cost = 1; - - repeated group Version = 3 { - required Reference root_entity_key = 4; - required int64 version = 5; - } -} diff --git a/vendor/google.golang.org/appengine/internal/identity.go b/vendor/google.golang.org/appengine/internal/identity.go deleted file mode 100644 index 9b4134e42..000000000 --- a/vendor/google.golang.org/appengine/internal/identity.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -import ( - "os" - - netcontext "golang.org/x/net/context" -) - -var ( - // This is set to true in identity_classic.go, which is behind the appengine build tag. - // The appengine build tag is set for the first generation runtimes (<= Go 1.9) but not - // the second generation runtimes (>= Go 1.11), so this indicates whether we're on a - // first-gen runtime. See IsStandard below for the second-gen check. - appengineStandard bool - - // This is set to true in identity_flex.go, which is behind the appenginevm build tag. - appengineFlex bool -) - -// AppID is the implementation of the wrapper function of the same name in -// ../identity.go. See that file for commentary. -func AppID(c netcontext.Context) string { - return appID(FullyQualifiedAppID(c)) -} - -// IsStandard is the implementation of the wrapper function of the same name in -// ../appengine.go. See that file for commentary. -func IsStandard() bool { - // appengineStandard will be true for first-gen runtimes (<= Go 1.9) but not - // second-gen (>= Go 1.11). - return appengineStandard || IsSecondGen() -} - -// IsStandard is the implementation of the wrapper function of the same name in -// ../appengine.go. See that file for commentary. -func IsSecondGen() bool { - // Second-gen runtimes set $GAE_ENV so we use that to check if we're on a second-gen runtime. - return os.Getenv("GAE_ENV") == "standard" -} - -// IsFlex is the implementation of the wrapper function of the same name in -// ../appengine.go. See that file for commentary. -func IsFlex() bool { - return appengineFlex -} - -// IsAppEngine is the implementation of the wrapper function of the same name in -// ../appengine.go. See that file for commentary. -func IsAppEngine() bool { - return IsStandard() || IsFlex() -} diff --git a/vendor/google.golang.org/appengine/internal/identity_classic.go b/vendor/google.golang.org/appengine/internal/identity_classic.go deleted file mode 100644 index 4e979f45e..000000000 --- a/vendor/google.golang.org/appengine/internal/identity_classic.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// +build appengine - -package internal - -import ( - "appengine" - - netcontext "golang.org/x/net/context" -) - -func init() { - appengineStandard = true -} - -func DefaultVersionHostname(ctx netcontext.Context) string { - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - return appengine.DefaultVersionHostname(c) -} - -func Datacenter(_ netcontext.Context) string { return appengine.Datacenter() } -func ServerSoftware() string { return appengine.ServerSoftware() } -func InstanceID() string { return appengine.InstanceID() } -func IsDevAppServer() bool { return appengine.IsDevAppServer() } - -func RequestID(ctx netcontext.Context) string { - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - return appengine.RequestID(c) -} - -func ModuleName(ctx netcontext.Context) string { - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - return appengine.ModuleName(c) -} -func VersionID(ctx netcontext.Context) string { - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - return appengine.VersionID(c) -} - -func fullyQualifiedAppID(ctx netcontext.Context) string { - c := fromContext(ctx) - if c == nil { - panic(errNotAppEngineContext) - } - return c.FullyQualifiedAppID() -} diff --git a/vendor/google.golang.org/appengine/internal/identity_flex.go b/vendor/google.golang.org/appengine/internal/identity_flex.go deleted file mode 100644 index d5e2e7b5e..000000000 --- a/vendor/google.golang.org/appengine/internal/identity_flex.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2018 Google LLC. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// +build appenginevm - -package internal - -func init() { - appengineFlex = true -} diff --git a/vendor/google.golang.org/appengine/internal/identity_vm.go b/vendor/google.golang.org/appengine/internal/identity_vm.go deleted file mode 100644 index 5d8067263..000000000 --- a/vendor/google.golang.org/appengine/internal/identity_vm.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// +build !appengine - -package internal - -import ( - "log" - "net/http" - "os" - "strings" - - netcontext "golang.org/x/net/context" -) - -// These functions are implementations of the wrapper functions -// in ../appengine/identity.go. See that file for commentary. - -const ( - hDefaultVersionHostname = "X-AppEngine-Default-Version-Hostname" - hRequestLogId = "X-AppEngine-Request-Log-Id" - hDatacenter = "X-AppEngine-Datacenter" -) - -func ctxHeaders(ctx netcontext.Context) http.Header { - c := fromContext(ctx) - if c == nil { - return nil - } - return c.Request().Header -} - -func DefaultVersionHostname(ctx netcontext.Context) string { - return ctxHeaders(ctx).Get(hDefaultVersionHostname) -} - -func RequestID(ctx netcontext.Context) string { - return ctxHeaders(ctx).Get(hRequestLogId) -} - -func Datacenter(ctx netcontext.Context) string { - if dc := ctxHeaders(ctx).Get(hDatacenter); dc != "" { - return dc - } - // If the header isn't set, read zone from the metadata service. - // It has the format projects/[NUMERIC_PROJECT_ID]/zones/[ZONE] - zone, err := getMetadata("instance/zone") - if err != nil { - log.Printf("Datacenter: %v", err) - return "" - } - parts := strings.Split(string(zone), "/") - if len(parts) == 0 { - return "" - } - return parts[len(parts)-1] -} - -func ServerSoftware() string { - // TODO(dsymonds): Remove fallback when we've verified this. - if s := os.Getenv("SERVER_SOFTWARE"); s != "" { - return s - } - if s := os.Getenv("GAE_ENV"); s != "" { - return s - } - return "Google App Engine/1.x.x" -} - -// TODO(dsymonds): Remove the metadata fetches. - -func ModuleName(_ netcontext.Context) string { - if s := os.Getenv("GAE_MODULE_NAME"); s != "" { - return s - } - if s := os.Getenv("GAE_SERVICE"); s != "" { - return s - } - return string(mustGetMetadata("instance/attributes/gae_backend_name")) -} - -func VersionID(_ netcontext.Context) string { - if s1, s2 := os.Getenv("GAE_MODULE_VERSION"), os.Getenv("GAE_MINOR_VERSION"); s1 != "" && s2 != "" { - return s1 + "." + s2 - } - if s1, s2 := os.Getenv("GAE_VERSION"), os.Getenv("GAE_DEPLOYMENT_ID"); s1 != "" && s2 != "" { - return s1 + "." + s2 - } - return string(mustGetMetadata("instance/attributes/gae_backend_version")) + "." + string(mustGetMetadata("instance/attributes/gae_backend_minor_version")) -} - -func InstanceID() string { - if s := os.Getenv("GAE_MODULE_INSTANCE"); s != "" { - return s - } - if s := os.Getenv("GAE_INSTANCE"); s != "" { - return s - } - return string(mustGetMetadata("instance/attributes/gae_backend_instance")) -} - -func partitionlessAppID() string { - // gae_project has everything except the partition prefix. - if appID := os.Getenv("GAE_LONG_APP_ID"); appID != "" { - return appID - } - if project := os.Getenv("GOOGLE_CLOUD_PROJECT"); project != "" { - return project - } - return string(mustGetMetadata("instance/attributes/gae_project")) -} - -func fullyQualifiedAppID(_ netcontext.Context) string { - if s := os.Getenv("GAE_APPLICATION"); s != "" { - return s - } - appID := partitionlessAppID() - - part := os.Getenv("GAE_PARTITION") - if part == "" { - part = string(mustGetMetadata("instance/attributes/gae_partition")) - } - - if part != "" { - appID = part + "~" + appID - } - return appID -} - -func IsDevAppServer() bool { - return os.Getenv("RUN_WITH_DEVAPPSERVER") != "" -} diff --git a/vendor/google.golang.org/appengine/internal/internal.go b/vendor/google.golang.org/appengine/internal/internal.go deleted file mode 100644 index 051ea3980..000000000 --- a/vendor/google.golang.org/appengine/internal/internal.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// Package internal provides support for package appengine. -// -// Programs should not use this package directly. Its API is not stable. -// Use packages appengine and appengine/* instead. -package internal - -import ( - "fmt" - - "github.com/golang/protobuf/proto" - - remotepb "google.golang.org/appengine/internal/remote_api" -) - -// errorCodeMaps is a map of service name to the error code map for the service. -var errorCodeMaps = make(map[string]map[int32]string) - -// RegisterErrorCodeMap is called from API implementations to register their -// error code map. This should only be called from init functions. -func RegisterErrorCodeMap(service string, m map[int32]string) { - errorCodeMaps[service] = m -} - -type timeoutCodeKey struct { - service string - code int32 -} - -// timeoutCodes is the set of service+code pairs that represent timeouts. -var timeoutCodes = make(map[timeoutCodeKey]bool) - -func RegisterTimeoutErrorCode(service string, code int32) { - timeoutCodes[timeoutCodeKey{service, code}] = true -} - -// APIError is the type returned by appengine.Context's Call method -// when an API call fails in an API-specific way. This may be, for instance, -// a taskqueue API call failing with TaskQueueServiceError::UNKNOWN_QUEUE. -type APIError struct { - Service string - Detail string - Code int32 // API-specific error code -} - -func (e *APIError) Error() string { - if e.Code == 0 { - if e.Detail == "" { - return "APIError " - } - return e.Detail - } - s := fmt.Sprintf("API error %d", e.Code) - if m, ok := errorCodeMaps[e.Service]; ok { - s += " (" + e.Service + ": " + m[e.Code] + ")" - } else { - // Shouldn't happen, but provide a bit more detail if it does. - s = e.Service + " " + s - } - if e.Detail != "" { - s += ": " + e.Detail - } - return s -} - -func (e *APIError) IsTimeout() bool { - return timeoutCodes[timeoutCodeKey{e.Service, e.Code}] -} - -// CallError is the type returned by appengine.Context's Call method when an -// API call fails in a generic way, such as RpcError::CAPABILITY_DISABLED. -type CallError struct { - Detail string - Code int32 - // TODO: Remove this if we get a distinguishable error code. - Timeout bool -} - -func (e *CallError) Error() string { - var msg string - switch remotepb.RpcError_ErrorCode(e.Code) { - case remotepb.RpcError_UNKNOWN: - return e.Detail - case remotepb.RpcError_OVER_QUOTA: - msg = "Over quota" - case remotepb.RpcError_CAPABILITY_DISABLED: - msg = "Capability disabled" - case remotepb.RpcError_CANCELLED: - msg = "Canceled" - default: - msg = fmt.Sprintf("Call error %d", e.Code) - } - s := msg + ": " + e.Detail - if e.Timeout { - s += " (timeout)" - } - return s -} - -func (e *CallError) IsTimeout() bool { - return e.Timeout -} - -// NamespaceMods is a map from API service to a function that will mutate an RPC request to attach a namespace. -// The function should be prepared to be called on the same message more than once; it should only modify the -// RPC request the first time. -var NamespaceMods = make(map[string]func(m proto.Message, namespace string)) diff --git a/vendor/google.golang.org/appengine/internal/log/log_service.pb.go b/vendor/google.golang.org/appengine/internal/log/log_service.pb.go deleted file mode 100644 index 8545ac4ad..000000000 --- a/vendor/google.golang.org/appengine/internal/log/log_service.pb.go +++ /dev/null @@ -1,1313 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/log/log_service.proto - -package log - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type LogServiceError_ErrorCode int32 - -const ( - LogServiceError_OK LogServiceError_ErrorCode = 0 - LogServiceError_INVALID_REQUEST LogServiceError_ErrorCode = 1 - LogServiceError_STORAGE_ERROR LogServiceError_ErrorCode = 2 -) - -var LogServiceError_ErrorCode_name = map[int32]string{ - 0: "OK", - 1: "INVALID_REQUEST", - 2: "STORAGE_ERROR", -} -var LogServiceError_ErrorCode_value = map[string]int32{ - "OK": 0, - "INVALID_REQUEST": 1, - "STORAGE_ERROR": 2, -} - -func (x LogServiceError_ErrorCode) Enum() *LogServiceError_ErrorCode { - p := new(LogServiceError_ErrorCode) - *p = x - return p -} -func (x LogServiceError_ErrorCode) String() string { - return proto.EnumName(LogServiceError_ErrorCode_name, int32(x)) -} -func (x *LogServiceError_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(LogServiceError_ErrorCode_value, data, "LogServiceError_ErrorCode") - if err != nil { - return err - } - *x = LogServiceError_ErrorCode(value) - return nil -} -func (LogServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{0, 0} -} - -type LogServiceError struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogServiceError) Reset() { *m = LogServiceError{} } -func (m *LogServiceError) String() string { return proto.CompactTextString(m) } -func (*LogServiceError) ProtoMessage() {} -func (*LogServiceError) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{0} -} -func (m *LogServiceError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogServiceError.Unmarshal(m, b) -} -func (m *LogServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogServiceError.Marshal(b, m, deterministic) -} -func (dst *LogServiceError) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogServiceError.Merge(dst, src) -} -func (m *LogServiceError) XXX_Size() int { - return xxx_messageInfo_LogServiceError.Size(m) -} -func (m *LogServiceError) XXX_DiscardUnknown() { - xxx_messageInfo_LogServiceError.DiscardUnknown(m) -} - -var xxx_messageInfo_LogServiceError proto.InternalMessageInfo - -type UserAppLogLine struct { - TimestampUsec *int64 `protobuf:"varint,1,req,name=timestamp_usec,json=timestampUsec" json:"timestamp_usec,omitempty"` - Level *int64 `protobuf:"varint,2,req,name=level" json:"level,omitempty"` - Message *string `protobuf:"bytes,3,req,name=message" json:"message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UserAppLogLine) Reset() { *m = UserAppLogLine{} } -func (m *UserAppLogLine) String() string { return proto.CompactTextString(m) } -func (*UserAppLogLine) ProtoMessage() {} -func (*UserAppLogLine) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{1} -} -func (m *UserAppLogLine) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UserAppLogLine.Unmarshal(m, b) -} -func (m *UserAppLogLine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UserAppLogLine.Marshal(b, m, deterministic) -} -func (dst *UserAppLogLine) XXX_Merge(src proto.Message) { - xxx_messageInfo_UserAppLogLine.Merge(dst, src) -} -func (m *UserAppLogLine) XXX_Size() int { - return xxx_messageInfo_UserAppLogLine.Size(m) -} -func (m *UserAppLogLine) XXX_DiscardUnknown() { - xxx_messageInfo_UserAppLogLine.DiscardUnknown(m) -} - -var xxx_messageInfo_UserAppLogLine proto.InternalMessageInfo - -func (m *UserAppLogLine) GetTimestampUsec() int64 { - if m != nil && m.TimestampUsec != nil { - return *m.TimestampUsec - } - return 0 -} - -func (m *UserAppLogLine) GetLevel() int64 { - if m != nil && m.Level != nil { - return *m.Level - } - return 0 -} - -func (m *UserAppLogLine) GetMessage() string { - if m != nil && m.Message != nil { - return *m.Message - } - return "" -} - -type UserAppLogGroup struct { - LogLine []*UserAppLogLine `protobuf:"bytes,2,rep,name=log_line,json=logLine" json:"log_line,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UserAppLogGroup) Reset() { *m = UserAppLogGroup{} } -func (m *UserAppLogGroup) String() string { return proto.CompactTextString(m) } -func (*UserAppLogGroup) ProtoMessage() {} -func (*UserAppLogGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{2} -} -func (m *UserAppLogGroup) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UserAppLogGroup.Unmarshal(m, b) -} -func (m *UserAppLogGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UserAppLogGroup.Marshal(b, m, deterministic) -} -func (dst *UserAppLogGroup) XXX_Merge(src proto.Message) { - xxx_messageInfo_UserAppLogGroup.Merge(dst, src) -} -func (m *UserAppLogGroup) XXX_Size() int { - return xxx_messageInfo_UserAppLogGroup.Size(m) -} -func (m *UserAppLogGroup) XXX_DiscardUnknown() { - xxx_messageInfo_UserAppLogGroup.DiscardUnknown(m) -} - -var xxx_messageInfo_UserAppLogGroup proto.InternalMessageInfo - -func (m *UserAppLogGroup) GetLogLine() []*UserAppLogLine { - if m != nil { - return m.LogLine - } - return nil -} - -type FlushRequest struct { - Logs []byte `protobuf:"bytes,1,opt,name=logs" json:"logs,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FlushRequest) Reset() { *m = FlushRequest{} } -func (m *FlushRequest) String() string { return proto.CompactTextString(m) } -func (*FlushRequest) ProtoMessage() {} -func (*FlushRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{3} -} -func (m *FlushRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FlushRequest.Unmarshal(m, b) -} -func (m *FlushRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FlushRequest.Marshal(b, m, deterministic) -} -func (dst *FlushRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_FlushRequest.Merge(dst, src) -} -func (m *FlushRequest) XXX_Size() int { - return xxx_messageInfo_FlushRequest.Size(m) -} -func (m *FlushRequest) XXX_DiscardUnknown() { - xxx_messageInfo_FlushRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_FlushRequest proto.InternalMessageInfo - -func (m *FlushRequest) GetLogs() []byte { - if m != nil { - return m.Logs - } - return nil -} - -type SetStatusRequest struct { - Status *string `protobuf:"bytes,1,req,name=status" json:"status,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetStatusRequest) Reset() { *m = SetStatusRequest{} } -func (m *SetStatusRequest) String() string { return proto.CompactTextString(m) } -func (*SetStatusRequest) ProtoMessage() {} -func (*SetStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{4} -} -func (m *SetStatusRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetStatusRequest.Unmarshal(m, b) -} -func (m *SetStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetStatusRequest.Marshal(b, m, deterministic) -} -func (dst *SetStatusRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetStatusRequest.Merge(dst, src) -} -func (m *SetStatusRequest) XXX_Size() int { - return xxx_messageInfo_SetStatusRequest.Size(m) -} -func (m *SetStatusRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetStatusRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetStatusRequest proto.InternalMessageInfo - -func (m *SetStatusRequest) GetStatus() string { - if m != nil && m.Status != nil { - return *m.Status - } - return "" -} - -type LogOffset struct { - RequestId []byte `protobuf:"bytes,1,opt,name=request_id,json=requestId" json:"request_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogOffset) Reset() { *m = LogOffset{} } -func (m *LogOffset) String() string { return proto.CompactTextString(m) } -func (*LogOffset) ProtoMessage() {} -func (*LogOffset) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{5} -} -func (m *LogOffset) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogOffset.Unmarshal(m, b) -} -func (m *LogOffset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogOffset.Marshal(b, m, deterministic) -} -func (dst *LogOffset) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogOffset.Merge(dst, src) -} -func (m *LogOffset) XXX_Size() int { - return xxx_messageInfo_LogOffset.Size(m) -} -func (m *LogOffset) XXX_DiscardUnknown() { - xxx_messageInfo_LogOffset.DiscardUnknown(m) -} - -var xxx_messageInfo_LogOffset proto.InternalMessageInfo - -func (m *LogOffset) GetRequestId() []byte { - if m != nil { - return m.RequestId - } - return nil -} - -type LogLine struct { - Time *int64 `protobuf:"varint,1,req,name=time" json:"time,omitempty"` - Level *int32 `protobuf:"varint,2,req,name=level" json:"level,omitempty"` - LogMessage *string `protobuf:"bytes,3,req,name=log_message,json=logMessage" json:"log_message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogLine) Reset() { *m = LogLine{} } -func (m *LogLine) String() string { return proto.CompactTextString(m) } -func (*LogLine) ProtoMessage() {} -func (*LogLine) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{6} -} -func (m *LogLine) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogLine.Unmarshal(m, b) -} -func (m *LogLine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogLine.Marshal(b, m, deterministic) -} -func (dst *LogLine) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogLine.Merge(dst, src) -} -func (m *LogLine) XXX_Size() int { - return xxx_messageInfo_LogLine.Size(m) -} -func (m *LogLine) XXX_DiscardUnknown() { - xxx_messageInfo_LogLine.DiscardUnknown(m) -} - -var xxx_messageInfo_LogLine proto.InternalMessageInfo - -func (m *LogLine) GetTime() int64 { - if m != nil && m.Time != nil { - return *m.Time - } - return 0 -} - -func (m *LogLine) GetLevel() int32 { - if m != nil && m.Level != nil { - return *m.Level - } - return 0 -} - -func (m *LogLine) GetLogMessage() string { - if m != nil && m.LogMessage != nil { - return *m.LogMessage - } - return "" -} - -type RequestLog struct { - AppId *string `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"` - ModuleId *string `protobuf:"bytes,37,opt,name=module_id,json=moduleId,def=default" json:"module_id,omitempty"` - VersionId *string `protobuf:"bytes,2,req,name=version_id,json=versionId" json:"version_id,omitempty"` - RequestId []byte `protobuf:"bytes,3,req,name=request_id,json=requestId" json:"request_id,omitempty"` - Offset *LogOffset `protobuf:"bytes,35,opt,name=offset" json:"offset,omitempty"` - Ip *string `protobuf:"bytes,4,req,name=ip" json:"ip,omitempty"` - Nickname *string `protobuf:"bytes,5,opt,name=nickname" json:"nickname,omitempty"` - StartTime *int64 `protobuf:"varint,6,req,name=start_time,json=startTime" json:"start_time,omitempty"` - EndTime *int64 `protobuf:"varint,7,req,name=end_time,json=endTime" json:"end_time,omitempty"` - Latency *int64 `protobuf:"varint,8,req,name=latency" json:"latency,omitempty"` - Mcycles *int64 `protobuf:"varint,9,req,name=mcycles" json:"mcycles,omitempty"` - Method *string `protobuf:"bytes,10,req,name=method" json:"method,omitempty"` - Resource *string `protobuf:"bytes,11,req,name=resource" json:"resource,omitempty"` - HttpVersion *string `protobuf:"bytes,12,req,name=http_version,json=httpVersion" json:"http_version,omitempty"` - Status *int32 `protobuf:"varint,13,req,name=status" json:"status,omitempty"` - ResponseSize *int64 `protobuf:"varint,14,req,name=response_size,json=responseSize" json:"response_size,omitempty"` - Referrer *string `protobuf:"bytes,15,opt,name=referrer" json:"referrer,omitempty"` - UserAgent *string `protobuf:"bytes,16,opt,name=user_agent,json=userAgent" json:"user_agent,omitempty"` - UrlMapEntry *string `protobuf:"bytes,17,req,name=url_map_entry,json=urlMapEntry" json:"url_map_entry,omitempty"` - Combined *string `protobuf:"bytes,18,req,name=combined" json:"combined,omitempty"` - ApiMcycles *int64 `protobuf:"varint,19,opt,name=api_mcycles,json=apiMcycles" json:"api_mcycles,omitempty"` - Host *string `protobuf:"bytes,20,opt,name=host" json:"host,omitempty"` - Cost *float64 `protobuf:"fixed64,21,opt,name=cost" json:"cost,omitempty"` - TaskQueueName *string `protobuf:"bytes,22,opt,name=task_queue_name,json=taskQueueName" json:"task_queue_name,omitempty"` - TaskName *string `protobuf:"bytes,23,opt,name=task_name,json=taskName" json:"task_name,omitempty"` - WasLoadingRequest *bool `protobuf:"varint,24,opt,name=was_loading_request,json=wasLoadingRequest" json:"was_loading_request,omitempty"` - PendingTime *int64 `protobuf:"varint,25,opt,name=pending_time,json=pendingTime" json:"pending_time,omitempty"` - ReplicaIndex *int32 `protobuf:"varint,26,opt,name=replica_index,json=replicaIndex,def=-1" json:"replica_index,omitempty"` - Finished *bool `protobuf:"varint,27,opt,name=finished,def=1" json:"finished,omitempty"` - CloneKey []byte `protobuf:"bytes,28,opt,name=clone_key,json=cloneKey" json:"clone_key,omitempty"` - Line []*LogLine `protobuf:"bytes,29,rep,name=line" json:"line,omitempty"` - LinesIncomplete *bool `protobuf:"varint,36,opt,name=lines_incomplete,json=linesIncomplete" json:"lines_incomplete,omitempty"` - AppEngineRelease []byte `protobuf:"bytes,38,opt,name=app_engine_release,json=appEngineRelease" json:"app_engine_release,omitempty"` - ExitReason *int32 `protobuf:"varint,30,opt,name=exit_reason,json=exitReason" json:"exit_reason,omitempty"` - WasThrottledForTime *bool `protobuf:"varint,31,opt,name=was_throttled_for_time,json=wasThrottledForTime" json:"was_throttled_for_time,omitempty"` - WasThrottledForRequests *bool `protobuf:"varint,32,opt,name=was_throttled_for_requests,json=wasThrottledForRequests" json:"was_throttled_for_requests,omitempty"` - ThrottledTime *int64 `protobuf:"varint,33,opt,name=throttled_time,json=throttledTime" json:"throttled_time,omitempty"` - ServerName []byte `protobuf:"bytes,34,opt,name=server_name,json=serverName" json:"server_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RequestLog) Reset() { *m = RequestLog{} } -func (m *RequestLog) String() string { return proto.CompactTextString(m) } -func (*RequestLog) ProtoMessage() {} -func (*RequestLog) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{7} -} -func (m *RequestLog) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RequestLog.Unmarshal(m, b) -} -func (m *RequestLog) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RequestLog.Marshal(b, m, deterministic) -} -func (dst *RequestLog) XXX_Merge(src proto.Message) { - xxx_messageInfo_RequestLog.Merge(dst, src) -} -func (m *RequestLog) XXX_Size() int { - return xxx_messageInfo_RequestLog.Size(m) -} -func (m *RequestLog) XXX_DiscardUnknown() { - xxx_messageInfo_RequestLog.DiscardUnknown(m) -} - -var xxx_messageInfo_RequestLog proto.InternalMessageInfo - -const Default_RequestLog_ModuleId string = "default" -const Default_RequestLog_ReplicaIndex int32 = -1 -const Default_RequestLog_Finished bool = true - -func (m *RequestLog) GetAppId() string { - if m != nil && m.AppId != nil { - return *m.AppId - } - return "" -} - -func (m *RequestLog) GetModuleId() string { - if m != nil && m.ModuleId != nil { - return *m.ModuleId - } - return Default_RequestLog_ModuleId -} - -func (m *RequestLog) GetVersionId() string { - if m != nil && m.VersionId != nil { - return *m.VersionId - } - return "" -} - -func (m *RequestLog) GetRequestId() []byte { - if m != nil { - return m.RequestId - } - return nil -} - -func (m *RequestLog) GetOffset() *LogOffset { - if m != nil { - return m.Offset - } - return nil -} - -func (m *RequestLog) GetIp() string { - if m != nil && m.Ip != nil { - return *m.Ip - } - return "" -} - -func (m *RequestLog) GetNickname() string { - if m != nil && m.Nickname != nil { - return *m.Nickname - } - return "" -} - -func (m *RequestLog) GetStartTime() int64 { - if m != nil && m.StartTime != nil { - return *m.StartTime - } - return 0 -} - -func (m *RequestLog) GetEndTime() int64 { - if m != nil && m.EndTime != nil { - return *m.EndTime - } - return 0 -} - -func (m *RequestLog) GetLatency() int64 { - if m != nil && m.Latency != nil { - return *m.Latency - } - return 0 -} - -func (m *RequestLog) GetMcycles() int64 { - if m != nil && m.Mcycles != nil { - return *m.Mcycles - } - return 0 -} - -func (m *RequestLog) GetMethod() string { - if m != nil && m.Method != nil { - return *m.Method - } - return "" -} - -func (m *RequestLog) GetResource() string { - if m != nil && m.Resource != nil { - return *m.Resource - } - return "" -} - -func (m *RequestLog) GetHttpVersion() string { - if m != nil && m.HttpVersion != nil { - return *m.HttpVersion - } - return "" -} - -func (m *RequestLog) GetStatus() int32 { - if m != nil && m.Status != nil { - return *m.Status - } - return 0 -} - -func (m *RequestLog) GetResponseSize() int64 { - if m != nil && m.ResponseSize != nil { - return *m.ResponseSize - } - return 0 -} - -func (m *RequestLog) GetReferrer() string { - if m != nil && m.Referrer != nil { - return *m.Referrer - } - return "" -} - -func (m *RequestLog) GetUserAgent() string { - if m != nil && m.UserAgent != nil { - return *m.UserAgent - } - return "" -} - -func (m *RequestLog) GetUrlMapEntry() string { - if m != nil && m.UrlMapEntry != nil { - return *m.UrlMapEntry - } - return "" -} - -func (m *RequestLog) GetCombined() string { - if m != nil && m.Combined != nil { - return *m.Combined - } - return "" -} - -func (m *RequestLog) GetApiMcycles() int64 { - if m != nil && m.ApiMcycles != nil { - return *m.ApiMcycles - } - return 0 -} - -func (m *RequestLog) GetHost() string { - if m != nil && m.Host != nil { - return *m.Host - } - return "" -} - -func (m *RequestLog) GetCost() float64 { - if m != nil && m.Cost != nil { - return *m.Cost - } - return 0 -} - -func (m *RequestLog) GetTaskQueueName() string { - if m != nil && m.TaskQueueName != nil { - return *m.TaskQueueName - } - return "" -} - -func (m *RequestLog) GetTaskName() string { - if m != nil && m.TaskName != nil { - return *m.TaskName - } - return "" -} - -func (m *RequestLog) GetWasLoadingRequest() bool { - if m != nil && m.WasLoadingRequest != nil { - return *m.WasLoadingRequest - } - return false -} - -func (m *RequestLog) GetPendingTime() int64 { - if m != nil && m.PendingTime != nil { - return *m.PendingTime - } - return 0 -} - -func (m *RequestLog) GetReplicaIndex() int32 { - if m != nil && m.ReplicaIndex != nil { - return *m.ReplicaIndex - } - return Default_RequestLog_ReplicaIndex -} - -func (m *RequestLog) GetFinished() bool { - if m != nil && m.Finished != nil { - return *m.Finished - } - return Default_RequestLog_Finished -} - -func (m *RequestLog) GetCloneKey() []byte { - if m != nil { - return m.CloneKey - } - return nil -} - -func (m *RequestLog) GetLine() []*LogLine { - if m != nil { - return m.Line - } - return nil -} - -func (m *RequestLog) GetLinesIncomplete() bool { - if m != nil && m.LinesIncomplete != nil { - return *m.LinesIncomplete - } - return false -} - -func (m *RequestLog) GetAppEngineRelease() []byte { - if m != nil { - return m.AppEngineRelease - } - return nil -} - -func (m *RequestLog) GetExitReason() int32 { - if m != nil && m.ExitReason != nil { - return *m.ExitReason - } - return 0 -} - -func (m *RequestLog) GetWasThrottledForTime() bool { - if m != nil && m.WasThrottledForTime != nil { - return *m.WasThrottledForTime - } - return false -} - -func (m *RequestLog) GetWasThrottledForRequests() bool { - if m != nil && m.WasThrottledForRequests != nil { - return *m.WasThrottledForRequests - } - return false -} - -func (m *RequestLog) GetThrottledTime() int64 { - if m != nil && m.ThrottledTime != nil { - return *m.ThrottledTime - } - return 0 -} - -func (m *RequestLog) GetServerName() []byte { - if m != nil { - return m.ServerName - } - return nil -} - -type LogModuleVersion struct { - ModuleId *string `protobuf:"bytes,1,opt,name=module_id,json=moduleId,def=default" json:"module_id,omitempty"` - VersionId *string `protobuf:"bytes,2,opt,name=version_id,json=versionId" json:"version_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogModuleVersion) Reset() { *m = LogModuleVersion{} } -func (m *LogModuleVersion) String() string { return proto.CompactTextString(m) } -func (*LogModuleVersion) ProtoMessage() {} -func (*LogModuleVersion) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{8} -} -func (m *LogModuleVersion) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogModuleVersion.Unmarshal(m, b) -} -func (m *LogModuleVersion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogModuleVersion.Marshal(b, m, deterministic) -} -func (dst *LogModuleVersion) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogModuleVersion.Merge(dst, src) -} -func (m *LogModuleVersion) XXX_Size() int { - return xxx_messageInfo_LogModuleVersion.Size(m) -} -func (m *LogModuleVersion) XXX_DiscardUnknown() { - xxx_messageInfo_LogModuleVersion.DiscardUnknown(m) -} - -var xxx_messageInfo_LogModuleVersion proto.InternalMessageInfo - -const Default_LogModuleVersion_ModuleId string = "default" - -func (m *LogModuleVersion) GetModuleId() string { - if m != nil && m.ModuleId != nil { - return *m.ModuleId - } - return Default_LogModuleVersion_ModuleId -} - -func (m *LogModuleVersion) GetVersionId() string { - if m != nil && m.VersionId != nil { - return *m.VersionId - } - return "" -} - -type LogReadRequest struct { - AppId *string `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"` - VersionId []string `protobuf:"bytes,2,rep,name=version_id,json=versionId" json:"version_id,omitempty"` - ModuleVersion []*LogModuleVersion `protobuf:"bytes,19,rep,name=module_version,json=moduleVersion" json:"module_version,omitempty"` - StartTime *int64 `protobuf:"varint,3,opt,name=start_time,json=startTime" json:"start_time,omitempty"` - EndTime *int64 `protobuf:"varint,4,opt,name=end_time,json=endTime" json:"end_time,omitempty"` - Offset *LogOffset `protobuf:"bytes,5,opt,name=offset" json:"offset,omitempty"` - RequestId [][]byte `protobuf:"bytes,6,rep,name=request_id,json=requestId" json:"request_id,omitempty"` - MinimumLogLevel *int32 `protobuf:"varint,7,opt,name=minimum_log_level,json=minimumLogLevel" json:"minimum_log_level,omitempty"` - IncludeIncomplete *bool `protobuf:"varint,8,opt,name=include_incomplete,json=includeIncomplete" json:"include_incomplete,omitempty"` - Count *int64 `protobuf:"varint,9,opt,name=count" json:"count,omitempty"` - CombinedLogRegex *string `protobuf:"bytes,14,opt,name=combined_log_regex,json=combinedLogRegex" json:"combined_log_regex,omitempty"` - HostRegex *string `protobuf:"bytes,15,opt,name=host_regex,json=hostRegex" json:"host_regex,omitempty"` - ReplicaIndex *int32 `protobuf:"varint,16,opt,name=replica_index,json=replicaIndex" json:"replica_index,omitempty"` - IncludeAppLogs *bool `protobuf:"varint,10,opt,name=include_app_logs,json=includeAppLogs" json:"include_app_logs,omitempty"` - AppLogsPerRequest *int32 `protobuf:"varint,17,opt,name=app_logs_per_request,json=appLogsPerRequest" json:"app_logs_per_request,omitempty"` - IncludeHost *bool `protobuf:"varint,11,opt,name=include_host,json=includeHost" json:"include_host,omitempty"` - IncludeAll *bool `protobuf:"varint,12,opt,name=include_all,json=includeAll" json:"include_all,omitempty"` - CacheIterator *bool `protobuf:"varint,13,opt,name=cache_iterator,json=cacheIterator" json:"cache_iterator,omitempty"` - NumShards *int32 `protobuf:"varint,18,opt,name=num_shards,json=numShards" json:"num_shards,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogReadRequest) Reset() { *m = LogReadRequest{} } -func (m *LogReadRequest) String() string { return proto.CompactTextString(m) } -func (*LogReadRequest) ProtoMessage() {} -func (*LogReadRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{9} -} -func (m *LogReadRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogReadRequest.Unmarshal(m, b) -} -func (m *LogReadRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogReadRequest.Marshal(b, m, deterministic) -} -func (dst *LogReadRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogReadRequest.Merge(dst, src) -} -func (m *LogReadRequest) XXX_Size() int { - return xxx_messageInfo_LogReadRequest.Size(m) -} -func (m *LogReadRequest) XXX_DiscardUnknown() { - xxx_messageInfo_LogReadRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_LogReadRequest proto.InternalMessageInfo - -func (m *LogReadRequest) GetAppId() string { - if m != nil && m.AppId != nil { - return *m.AppId - } - return "" -} - -func (m *LogReadRequest) GetVersionId() []string { - if m != nil { - return m.VersionId - } - return nil -} - -func (m *LogReadRequest) GetModuleVersion() []*LogModuleVersion { - if m != nil { - return m.ModuleVersion - } - return nil -} - -func (m *LogReadRequest) GetStartTime() int64 { - if m != nil && m.StartTime != nil { - return *m.StartTime - } - return 0 -} - -func (m *LogReadRequest) GetEndTime() int64 { - if m != nil && m.EndTime != nil { - return *m.EndTime - } - return 0 -} - -func (m *LogReadRequest) GetOffset() *LogOffset { - if m != nil { - return m.Offset - } - return nil -} - -func (m *LogReadRequest) GetRequestId() [][]byte { - if m != nil { - return m.RequestId - } - return nil -} - -func (m *LogReadRequest) GetMinimumLogLevel() int32 { - if m != nil && m.MinimumLogLevel != nil { - return *m.MinimumLogLevel - } - return 0 -} - -func (m *LogReadRequest) GetIncludeIncomplete() bool { - if m != nil && m.IncludeIncomplete != nil { - return *m.IncludeIncomplete - } - return false -} - -func (m *LogReadRequest) GetCount() int64 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *LogReadRequest) GetCombinedLogRegex() string { - if m != nil && m.CombinedLogRegex != nil { - return *m.CombinedLogRegex - } - return "" -} - -func (m *LogReadRequest) GetHostRegex() string { - if m != nil && m.HostRegex != nil { - return *m.HostRegex - } - return "" -} - -func (m *LogReadRequest) GetReplicaIndex() int32 { - if m != nil && m.ReplicaIndex != nil { - return *m.ReplicaIndex - } - return 0 -} - -func (m *LogReadRequest) GetIncludeAppLogs() bool { - if m != nil && m.IncludeAppLogs != nil { - return *m.IncludeAppLogs - } - return false -} - -func (m *LogReadRequest) GetAppLogsPerRequest() int32 { - if m != nil && m.AppLogsPerRequest != nil { - return *m.AppLogsPerRequest - } - return 0 -} - -func (m *LogReadRequest) GetIncludeHost() bool { - if m != nil && m.IncludeHost != nil { - return *m.IncludeHost - } - return false -} - -func (m *LogReadRequest) GetIncludeAll() bool { - if m != nil && m.IncludeAll != nil { - return *m.IncludeAll - } - return false -} - -func (m *LogReadRequest) GetCacheIterator() bool { - if m != nil && m.CacheIterator != nil { - return *m.CacheIterator - } - return false -} - -func (m *LogReadRequest) GetNumShards() int32 { - if m != nil && m.NumShards != nil { - return *m.NumShards - } - return 0 -} - -type LogReadResponse struct { - Log []*RequestLog `protobuf:"bytes,1,rep,name=log" json:"log,omitempty"` - Offset *LogOffset `protobuf:"bytes,2,opt,name=offset" json:"offset,omitempty"` - LastEndTime *int64 `protobuf:"varint,3,opt,name=last_end_time,json=lastEndTime" json:"last_end_time,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogReadResponse) Reset() { *m = LogReadResponse{} } -func (m *LogReadResponse) String() string { return proto.CompactTextString(m) } -func (*LogReadResponse) ProtoMessage() {} -func (*LogReadResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{10} -} -func (m *LogReadResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogReadResponse.Unmarshal(m, b) -} -func (m *LogReadResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogReadResponse.Marshal(b, m, deterministic) -} -func (dst *LogReadResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogReadResponse.Merge(dst, src) -} -func (m *LogReadResponse) XXX_Size() int { - return xxx_messageInfo_LogReadResponse.Size(m) -} -func (m *LogReadResponse) XXX_DiscardUnknown() { - xxx_messageInfo_LogReadResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_LogReadResponse proto.InternalMessageInfo - -func (m *LogReadResponse) GetLog() []*RequestLog { - if m != nil { - return m.Log - } - return nil -} - -func (m *LogReadResponse) GetOffset() *LogOffset { - if m != nil { - return m.Offset - } - return nil -} - -func (m *LogReadResponse) GetLastEndTime() int64 { - if m != nil && m.LastEndTime != nil { - return *m.LastEndTime - } - return 0 -} - -type LogUsageRecord struct { - VersionId *string `protobuf:"bytes,1,opt,name=version_id,json=versionId" json:"version_id,omitempty"` - StartTime *int32 `protobuf:"varint,2,opt,name=start_time,json=startTime" json:"start_time,omitempty"` - EndTime *int32 `protobuf:"varint,3,opt,name=end_time,json=endTime" json:"end_time,omitempty"` - Count *int64 `protobuf:"varint,4,opt,name=count" json:"count,omitempty"` - TotalSize *int64 `protobuf:"varint,5,opt,name=total_size,json=totalSize" json:"total_size,omitempty"` - Records *int32 `protobuf:"varint,6,opt,name=records" json:"records,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogUsageRecord) Reset() { *m = LogUsageRecord{} } -func (m *LogUsageRecord) String() string { return proto.CompactTextString(m) } -func (*LogUsageRecord) ProtoMessage() {} -func (*LogUsageRecord) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{11} -} -func (m *LogUsageRecord) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogUsageRecord.Unmarshal(m, b) -} -func (m *LogUsageRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogUsageRecord.Marshal(b, m, deterministic) -} -func (dst *LogUsageRecord) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogUsageRecord.Merge(dst, src) -} -func (m *LogUsageRecord) XXX_Size() int { - return xxx_messageInfo_LogUsageRecord.Size(m) -} -func (m *LogUsageRecord) XXX_DiscardUnknown() { - xxx_messageInfo_LogUsageRecord.DiscardUnknown(m) -} - -var xxx_messageInfo_LogUsageRecord proto.InternalMessageInfo - -func (m *LogUsageRecord) GetVersionId() string { - if m != nil && m.VersionId != nil { - return *m.VersionId - } - return "" -} - -func (m *LogUsageRecord) GetStartTime() int32 { - if m != nil && m.StartTime != nil { - return *m.StartTime - } - return 0 -} - -func (m *LogUsageRecord) GetEndTime() int32 { - if m != nil && m.EndTime != nil { - return *m.EndTime - } - return 0 -} - -func (m *LogUsageRecord) GetCount() int64 { - if m != nil && m.Count != nil { - return *m.Count - } - return 0 -} - -func (m *LogUsageRecord) GetTotalSize() int64 { - if m != nil && m.TotalSize != nil { - return *m.TotalSize - } - return 0 -} - -func (m *LogUsageRecord) GetRecords() int32 { - if m != nil && m.Records != nil { - return *m.Records - } - return 0 -} - -type LogUsageRequest struct { - AppId *string `protobuf:"bytes,1,req,name=app_id,json=appId" json:"app_id,omitempty"` - VersionId []string `protobuf:"bytes,2,rep,name=version_id,json=versionId" json:"version_id,omitempty"` - StartTime *int32 `protobuf:"varint,3,opt,name=start_time,json=startTime" json:"start_time,omitempty"` - EndTime *int32 `protobuf:"varint,4,opt,name=end_time,json=endTime" json:"end_time,omitempty"` - ResolutionHours *uint32 `protobuf:"varint,5,opt,name=resolution_hours,json=resolutionHours,def=1" json:"resolution_hours,omitempty"` - CombineVersions *bool `protobuf:"varint,6,opt,name=combine_versions,json=combineVersions" json:"combine_versions,omitempty"` - UsageVersion *int32 `protobuf:"varint,7,opt,name=usage_version,json=usageVersion" json:"usage_version,omitempty"` - VersionsOnly *bool `protobuf:"varint,8,opt,name=versions_only,json=versionsOnly" json:"versions_only,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogUsageRequest) Reset() { *m = LogUsageRequest{} } -func (m *LogUsageRequest) String() string { return proto.CompactTextString(m) } -func (*LogUsageRequest) ProtoMessage() {} -func (*LogUsageRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{12} -} -func (m *LogUsageRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogUsageRequest.Unmarshal(m, b) -} -func (m *LogUsageRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogUsageRequest.Marshal(b, m, deterministic) -} -func (dst *LogUsageRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogUsageRequest.Merge(dst, src) -} -func (m *LogUsageRequest) XXX_Size() int { - return xxx_messageInfo_LogUsageRequest.Size(m) -} -func (m *LogUsageRequest) XXX_DiscardUnknown() { - xxx_messageInfo_LogUsageRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_LogUsageRequest proto.InternalMessageInfo - -const Default_LogUsageRequest_ResolutionHours uint32 = 1 - -func (m *LogUsageRequest) GetAppId() string { - if m != nil && m.AppId != nil { - return *m.AppId - } - return "" -} - -func (m *LogUsageRequest) GetVersionId() []string { - if m != nil { - return m.VersionId - } - return nil -} - -func (m *LogUsageRequest) GetStartTime() int32 { - if m != nil && m.StartTime != nil { - return *m.StartTime - } - return 0 -} - -func (m *LogUsageRequest) GetEndTime() int32 { - if m != nil && m.EndTime != nil { - return *m.EndTime - } - return 0 -} - -func (m *LogUsageRequest) GetResolutionHours() uint32 { - if m != nil && m.ResolutionHours != nil { - return *m.ResolutionHours - } - return Default_LogUsageRequest_ResolutionHours -} - -func (m *LogUsageRequest) GetCombineVersions() bool { - if m != nil && m.CombineVersions != nil { - return *m.CombineVersions - } - return false -} - -func (m *LogUsageRequest) GetUsageVersion() int32 { - if m != nil && m.UsageVersion != nil { - return *m.UsageVersion - } - return 0 -} - -func (m *LogUsageRequest) GetVersionsOnly() bool { - if m != nil && m.VersionsOnly != nil { - return *m.VersionsOnly - } - return false -} - -type LogUsageResponse struct { - Usage []*LogUsageRecord `protobuf:"bytes,1,rep,name=usage" json:"usage,omitempty"` - Summary *LogUsageRecord `protobuf:"bytes,2,opt,name=summary" json:"summary,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LogUsageResponse) Reset() { *m = LogUsageResponse{} } -func (m *LogUsageResponse) String() string { return proto.CompactTextString(m) } -func (*LogUsageResponse) ProtoMessage() {} -func (*LogUsageResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_log_service_f054fd4b5012319d, []int{13} -} -func (m *LogUsageResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LogUsageResponse.Unmarshal(m, b) -} -func (m *LogUsageResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LogUsageResponse.Marshal(b, m, deterministic) -} -func (dst *LogUsageResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_LogUsageResponse.Merge(dst, src) -} -func (m *LogUsageResponse) XXX_Size() int { - return xxx_messageInfo_LogUsageResponse.Size(m) -} -func (m *LogUsageResponse) XXX_DiscardUnknown() { - xxx_messageInfo_LogUsageResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_LogUsageResponse proto.InternalMessageInfo - -func (m *LogUsageResponse) GetUsage() []*LogUsageRecord { - if m != nil { - return m.Usage - } - return nil -} - -func (m *LogUsageResponse) GetSummary() *LogUsageRecord { - if m != nil { - return m.Summary - } - return nil -} - -func init() { - proto.RegisterType((*LogServiceError)(nil), "appengine.LogServiceError") - proto.RegisterType((*UserAppLogLine)(nil), "appengine.UserAppLogLine") - proto.RegisterType((*UserAppLogGroup)(nil), "appengine.UserAppLogGroup") - proto.RegisterType((*FlushRequest)(nil), "appengine.FlushRequest") - proto.RegisterType((*SetStatusRequest)(nil), "appengine.SetStatusRequest") - proto.RegisterType((*LogOffset)(nil), "appengine.LogOffset") - proto.RegisterType((*LogLine)(nil), "appengine.LogLine") - proto.RegisterType((*RequestLog)(nil), "appengine.RequestLog") - proto.RegisterType((*LogModuleVersion)(nil), "appengine.LogModuleVersion") - proto.RegisterType((*LogReadRequest)(nil), "appengine.LogReadRequest") - proto.RegisterType((*LogReadResponse)(nil), "appengine.LogReadResponse") - proto.RegisterType((*LogUsageRecord)(nil), "appengine.LogUsageRecord") - proto.RegisterType((*LogUsageRequest)(nil), "appengine.LogUsageRequest") - proto.RegisterType((*LogUsageResponse)(nil), "appengine.LogUsageResponse") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/log/log_service.proto", fileDescriptor_log_service_f054fd4b5012319d) -} - -var fileDescriptor_log_service_f054fd4b5012319d = []byte{ - // 1553 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xdd, 0x72, 0xdb, 0xc6, - 0x15, 0x2e, 0x48, 0x51, 0x24, 0x0f, 0x49, 0x91, 0x5a, 0xcb, 0xce, 0xda, 0xae, 0x6b, 0x1a, 0x4e, - 0x1c, 0xd6, 0x93, 0x48, 0x93, 0xa4, 0x57, 0xca, 0x95, 0xd3, 0x2a, 0x8e, 0x26, 0xb4, 0xd5, 0x40, - 0x72, 0x3a, 0xd3, 0x1b, 0x0c, 0x0a, 0x1c, 0x81, 0x18, 0x2f, 0xb1, 0xc8, 0xee, 0xc2, 0x91, 0x72, - 0xdb, 0xdb, 0x3e, 0x46, 0x1f, 0xa2, 0xaf, 0xd2, 0xb7, 0xe9, 0xec, 0xd9, 0x05, 0x44, 0x2a, 0x4d, - 0xc6, 0x33, 0xb9, 0xe0, 0x10, 0xfb, 0x9d, 0x83, 0xdd, 0xf3, 0xf3, 0x9d, 0x6f, 0x01, 0xc7, 0xb9, - 0x94, 0xb9, 0xc0, 0xc3, 0x5c, 0x8a, 0xa4, 0xcc, 0x0f, 0xa5, 0xca, 0x8f, 0x92, 0xaa, 0xc2, 0x32, - 0x2f, 0x4a, 0x3c, 0x2a, 0x4a, 0x83, 0xaa, 0x4c, 0xc4, 0x91, 0x90, 0xb9, 0xfd, 0xc5, 0x1a, 0xd5, - 0xbb, 0x22, 0xc5, 0xc3, 0x4a, 0x49, 0x23, 0xd9, 0xb0, 0xf5, 0x0c, 0x5f, 0xc3, 0x74, 0x29, 0xf3, - 0x73, 0x67, 0x3e, 0x51, 0x4a, 0xaa, 0xf0, 0x4b, 0x18, 0xd2, 0xc3, 0x9f, 0x65, 0x86, 0x6c, 0x17, - 0x3a, 0x67, 0xdf, 0xce, 0x7e, 0xc7, 0xee, 0xc0, 0xf4, 0xf4, 0xf5, 0xf7, 0x2f, 0x96, 0xa7, 0x7f, - 0x89, 0xa3, 0x93, 0xef, 0xde, 0x9c, 0x9c, 0x5f, 0xcc, 0x02, 0xb6, 0x0f, 0x93, 0xf3, 0x8b, 0xb3, - 0xe8, 0xc5, 0xcb, 0x93, 0xf8, 0x24, 0x8a, 0xce, 0xa2, 0x59, 0x27, 0xcc, 0x61, 0xef, 0x8d, 0x46, - 0xf5, 0xa2, 0xaa, 0x96, 0x32, 0x5f, 0x16, 0x25, 0xb2, 0x8f, 0x60, 0xcf, 0x14, 0x6b, 0xd4, 0x26, - 0x59, 0x57, 0x71, 0xad, 0x31, 0xe5, 0xc1, 0xbc, 0xb3, 0xe8, 0x46, 0x93, 0x16, 0x7d, 0xa3, 0x31, - 0x65, 0x07, 0xd0, 0x13, 0xf8, 0x0e, 0x05, 0xef, 0x90, 0xd5, 0x2d, 0x18, 0x87, 0xfe, 0x1a, 0xb5, - 0x4e, 0x72, 0xe4, 0xdd, 0x79, 0x67, 0x31, 0x8c, 0x9a, 0x65, 0xf8, 0x12, 0xa6, 0x37, 0x07, 0xbd, - 0x54, 0xb2, 0xae, 0xd8, 0x9f, 0x60, 0x60, 0x73, 0x15, 0x45, 0x89, 0xbc, 0x33, 0xef, 0x2e, 0x46, - 0x9f, 0xdf, 0x3f, 0x6c, 0x33, 0x3d, 0xdc, 0x0e, 0x2b, 0xea, 0x0b, 0xf7, 0x10, 0x86, 0x30, 0xfe, - 0x5a, 0xd4, 0x7a, 0x15, 0xe1, 0x0f, 0x35, 0x6a, 0xc3, 0x18, 0xec, 0x08, 0x99, 0x6b, 0x1e, 0xcc, - 0x83, 0xc5, 0x38, 0xa2, 0xe7, 0xf0, 0x39, 0xcc, 0xce, 0xd1, 0x9c, 0x9b, 0xc4, 0xd4, 0xba, 0xf1, - 0xbb, 0x07, 0xbb, 0x9a, 0x00, 0xca, 0x67, 0x18, 0xf9, 0x55, 0xf8, 0x1c, 0x86, 0x4b, 0x99, 0x9f, - 0x5d, 0x5e, 0x6a, 0x34, 0xec, 0x11, 0x80, 0x72, 0xfe, 0x71, 0x91, 0xf9, 0x2d, 0x87, 0x1e, 0x39, - 0xcd, 0xc2, 0x0b, 0xe8, 0x37, 0x65, 0x62, 0xb0, 0x63, 0x0b, 0xe2, 0x8b, 0x43, 0xcf, 0xdb, 0x35, - 0xe9, 0x35, 0x35, 0x79, 0x0c, 0x23, 0x9b, 0xe6, 0x76, 0x5d, 0x40, 0xc8, 0xfc, 0x95, 0x2f, 0xcd, - 0x3f, 0x01, 0xc0, 0x47, 0xb9, 0x94, 0x39, 0xbb, 0x0b, 0xbb, 0x49, 0x55, 0xb9, 0xf3, 0xad, 0x6b, - 0x2f, 0xa9, 0xaa, 0xd3, 0x8c, 0x7d, 0x08, 0xc3, 0xb5, 0xcc, 0x6a, 0x81, 0xd6, 0xf2, 0xd1, 0x3c, - 0x58, 0x0c, 0x8f, 0xfb, 0x19, 0x5e, 0x26, 0xb5, 0x30, 0xd1, 0xc0, 0x59, 0x4e, 0x33, 0x9b, 0xc0, - 0x3b, 0x54, 0xba, 0x90, 0xa5, 0x75, 0xeb, 0xd0, 0x06, 0x43, 0x8f, 0x38, 0xf3, 0x46, 0x7e, 0x36, - 0x94, 0xcd, 0xfc, 0xd8, 0x27, 0xb0, 0x2b, 0xa9, 0x10, 0xfc, 0xe9, 0x3c, 0x58, 0x8c, 0x3e, 0x3f, - 0xd8, 0xe8, 0x47, 0x5b, 0xa4, 0xc8, 0xfb, 0xb0, 0x3d, 0xe8, 0x14, 0x15, 0xdf, 0xa1, 0x33, 0x3a, - 0x45, 0xc5, 0x1e, 0xc0, 0xa0, 0x2c, 0xd2, 0xb7, 0x65, 0xb2, 0x46, 0xde, 0xb3, 0x01, 0x46, 0xed, - 0xda, 0x1e, 0xac, 0x4d, 0xa2, 0x4c, 0x4c, 0x45, 0xdb, 0xa5, 0xa2, 0x0d, 0x09, 0xb9, 0xb0, 0x95, - 0xbb, 0x0f, 0x03, 0x2c, 0x33, 0x67, 0xec, 0x93, 0xb1, 0x8f, 0x65, 0x46, 0x26, 0x0e, 0x7d, 0x91, - 0x18, 0x2c, 0xd3, 0x6b, 0x3e, 0x70, 0x16, 0xbf, 0x24, 0xb2, 0xa5, 0xd7, 0xa9, 0x40, 0xcd, 0x87, - 0xce, 0xe2, 0x97, 0xb6, 0xd7, 0x6b, 0x34, 0x2b, 0x99, 0x71, 0x70, 0xbd, 0x76, 0x2b, 0x1b, 0xa1, - 0x42, 0x2d, 0x6b, 0x95, 0x22, 0x1f, 0x91, 0xa5, 0x5d, 0xb3, 0x27, 0x30, 0x5e, 0x19, 0x53, 0xc5, - 0xbe, 0x58, 0x7c, 0x4c, 0xf6, 0x91, 0xc5, 0xbe, 0x77, 0xd0, 0x06, 0x85, 0x26, 0xd4, 0x60, 0xbf, - 0x62, 0x4f, 0x61, 0xa2, 0x50, 0x57, 0xb2, 0xd4, 0x18, 0xeb, 0xe2, 0x27, 0xe4, 0x7b, 0x14, 0xce, - 0xb8, 0x01, 0xcf, 0x8b, 0x9f, 0xd0, 0x9d, 0x7d, 0x89, 0x4a, 0xa1, 0xe2, 0x53, 0x57, 0x9d, 0x66, - 0x6d, 0xab, 0x53, 0x6b, 0x54, 0x71, 0x92, 0x63, 0x69, 0xf8, 0x8c, 0xac, 0x43, 0x8b, 0xbc, 0xb0, - 0x00, 0x0b, 0x61, 0x52, 0x2b, 0x11, 0xaf, 0x93, 0x2a, 0xc6, 0xd2, 0xa8, 0x6b, 0xbe, 0xef, 0x62, - 0xab, 0x95, 0x78, 0x95, 0x54, 0x27, 0x16, 0xb2, 0xdb, 0xa7, 0x72, 0xfd, 0x8f, 0xa2, 0xc4, 0x8c, - 0x33, 0x97, 0x5a, 0xb3, 0xb6, 0x0c, 0x4c, 0xaa, 0x22, 0x6e, 0x8a, 0x75, 0x67, 0x1e, 0x2c, 0xba, - 0x11, 0x24, 0x55, 0xf1, 0xca, 0xd7, 0x8b, 0xc1, 0xce, 0x4a, 0x6a, 0xc3, 0x0f, 0xe8, 0x64, 0x7a, - 0xb6, 0x58, 0x6a, 0xb1, 0xbb, 0xf3, 0x60, 0x11, 0x44, 0xf4, 0xcc, 0x9e, 0xc1, 0xd4, 0x24, 0xfa, - 0x6d, 0xfc, 0x43, 0x8d, 0x35, 0xc6, 0xd4, 0xe8, 0x7b, 0xf4, 0xca, 0xc4, 0xc2, 0xdf, 0x59, 0xf4, - 0xb5, 0xed, 0xf6, 0x43, 0x18, 0x92, 0x1f, 0x79, 0x7c, 0xe0, 0x92, 0xb5, 0x00, 0x19, 0x0f, 0xe1, - 0xce, 0x8f, 0x89, 0x8e, 0x85, 0x4c, 0xb2, 0xa2, 0xcc, 0x63, 0xcf, 0x3e, 0xce, 0xe7, 0xc1, 0x62, - 0x10, 0xed, 0xff, 0x98, 0xe8, 0xa5, 0xb3, 0x34, 0x83, 0xfb, 0x04, 0xc6, 0x15, 0x96, 0xe4, 0x4b, - 0xfc, 0xb8, 0x4f, 0xe1, 0x8f, 0x3c, 0x46, 0x1c, 0xf9, 0xd8, 0x36, 0xa0, 0x12, 0x45, 0x9a, 0xc4, - 0x45, 0x99, 0xe1, 0x15, 0x7f, 0x30, 0x0f, 0x16, 0xbd, 0xe3, 0xce, 0xa7, 0x9f, 0xd9, 0x26, 0x90, - 0xe1, 0xd4, 0xe2, 0x6c, 0x0e, 0x83, 0xcb, 0xa2, 0x2c, 0xf4, 0x0a, 0x33, 0xfe, 0xd0, 0x1e, 0x78, - 0xbc, 0x63, 0x54, 0x8d, 0x51, 0x8b, 0xda, 0xd0, 0x53, 0x21, 0x4b, 0x8c, 0xdf, 0xe2, 0x35, 0xff, - 0x3d, 0x09, 0xc0, 0x80, 0x80, 0x6f, 0xf1, 0x9a, 0x3d, 0x83, 0x1d, 0x52, 0xab, 0x47, 0xa4, 0x56, - 0x6c, 0x7b, 0x3a, 0x48, 0xa6, 0xc8, 0xce, 0xfe, 0x08, 0x33, 0xfb, 0xaf, 0xe3, 0xa2, 0x4c, 0xe5, - 0xba, 0x12, 0x68, 0x90, 0x7f, 0x48, 0xf9, 0x4d, 0x09, 0x3f, 0x6d, 0x61, 0xf6, 0x09, 0x30, 0x3b, - 0xed, 0x6e, 0x9b, 0x58, 0xa1, 0xc0, 0x44, 0x23, 0x7f, 0x46, 0x07, 0xcf, 0x92, 0xaa, 0x3a, 0x21, - 0x43, 0xe4, 0x70, 0xdb, 0x49, 0xbc, 0x2a, 0x4c, 0xac, 0x30, 0xd1, 0xb2, 0xe4, 0x7f, 0xb0, 0x69, - 0x46, 0x60, 0xa1, 0x88, 0x10, 0xf6, 0x05, 0xdc, 0xb3, 0xc5, 0x35, 0x2b, 0x25, 0x8d, 0x11, 0x98, - 0xc5, 0x97, 0x52, 0xb9, 0xb2, 0x3d, 0xa6, 0xf3, 0x6d, 0xe9, 0x2f, 0x1a, 0xe3, 0xd7, 0x52, 0x51, - 0xf9, 0xbe, 0x84, 0x07, 0x3f, 0x7f, 0xc9, 0xf7, 0x45, 0xf3, 0x39, 0xbd, 0xf8, 0xc1, 0xad, 0x17, - 0x7d, 0x77, 0x34, 0xdd, 0x17, 0xed, 0x8b, 0x74, 0xd2, 0x13, 0x6a, 0xd0, 0xa4, 0x45, 0xe9, 0x8c, - 0xc7, 0x30, 0xb2, 0x97, 0x1a, 0x2a, 0x47, 0x8a, 0x90, 0x12, 0x04, 0x07, 0x59, 0x5a, 0x84, 0x7f, - 0x83, 0xd9, 0x52, 0xe6, 0xaf, 0x48, 0xc8, 0x9a, 0x81, 0xdb, 0xd2, 0xbc, 0xe0, 0x7d, 0x35, 0x2f, - 0xd8, 0xd2, 0xbc, 0xf0, 0xbf, 0x3d, 0xd8, 0x5b, 0xca, 0x3c, 0xc2, 0x24, 0x6b, 0x28, 0xf5, 0x0b, - 0x12, 0x7b, 0x7b, 0xa3, 0xee, 0xb6, 0x78, 0x7e, 0x05, 0x7b, 0x3e, 0x9a, 0x46, 0x23, 0xee, 0x10, - 0x0f, 0x1e, 0x6e, 0xf3, 0x60, 0x2b, 0x85, 0x68, 0xb2, 0xde, 0xca, 0x68, 0x5b, 0x07, 0xbb, 0x54, - 0xa9, 0x5f, 0xd0, 0xc1, 0x1d, 0x32, 0xb6, 0x3a, 0x78, 0xa3, 0xcd, 0xbd, 0xf7, 0xd0, 0xe6, 0x6d, - 0xa1, 0xdf, 0x9d, 0x77, 0xb7, 0x85, 0xfe, 0x39, 0xec, 0xaf, 0x8b, 0xb2, 0x58, 0xd7, 0xeb, 0x98, - 0xae, 0x60, 0xba, 0xb5, 0xfa, 0xc4, 0xa6, 0xa9, 0x37, 0x58, 0x46, 0xd3, 0xfd, 0xf5, 0x29, 0xb0, - 0xa2, 0x4c, 0x45, 0x9d, 0xe1, 0x26, 0x9d, 0x07, 0x6e, 0x5c, 0xbd, 0x65, 0x83, 0xd0, 0x07, 0xd0, - 0x4b, 0x65, 0x5d, 0x1a, 0x3e, 0xa4, 0xf8, 0xdd, 0xc2, 0xd2, 0xbc, 0x91, 0x23, 0x3a, 0x51, 0x61, - 0x8e, 0x57, 0x7c, 0x8f, 0x7a, 0x35, 0x6b, 0x2c, 0xd4, 0xa5, 0x1c, 0xaf, 0x6c, 0xf4, 0x56, 0x83, - 0xbc, 0x97, 0x53, 0xcb, 0xa1, 0x45, 0x9c, 0xf9, 0xe9, 0xed, 0x71, 0x9f, 0x51, 0xe4, 0xdb, 0xa3, - 0xbe, 0x80, 0x59, 0x13, 0xb6, 0xed, 0x35, 0x7d, 0x23, 0x00, 0x05, 0xbd, 0xe7, 0x71, 0xf7, 0x75, - 0xa1, 0xd9, 0x11, 0x1c, 0x34, 0x1e, 0x71, 0x85, 0x2d, 0xf3, 0xf9, 0x3e, 0xed, 0xba, 0x9f, 0x38, - 0xb7, 0xbf, 0xa2, 0xda, 0x50, 0xa4, 0x66, 0x6b, 0x92, 0xcd, 0x11, 0x6d, 0x3b, 0xf2, 0xd8, 0x37, - 0x56, 0x29, 0x1f, 0xc3, 0xa8, 0x3d, 0x5d, 0x08, 0x3e, 0x26, 0x0f, 0x68, 0x0e, 0x16, 0xc2, 0x8e, - 0x4d, 0x9a, 0xa4, 0x2b, 0x8c, 0x0b, 0x83, 0x2a, 0x31, 0x52, 0xf1, 0x09, 0xf9, 0x4c, 0x08, 0x3d, - 0xf5, 0xa0, 0xad, 0x44, 0x59, 0xaf, 0x63, 0xbd, 0x4a, 0x54, 0xa6, 0x39, 0xa3, 0x88, 0x86, 0x65, - 0xbd, 0x3e, 0x27, 0x20, 0xfc, 0x57, 0x40, 0xdf, 0x83, 0x8e, 0xdb, 0xee, 0xb2, 0x61, 0x1f, 0x43, - 0x57, 0xc8, 0x9c, 0x07, 0xc4, 0xcd, 0xbb, 0x1b, 0x2c, 0xb9, 0xf9, 0xc6, 0x88, 0xac, 0xc7, 0x06, - 0xa3, 0x3a, 0xef, 0xc1, 0xa8, 0x10, 0x26, 0x22, 0xd1, 0x26, 0x6e, 0xf9, 0xe9, 0xc8, 0x3b, 0xb2, - 0xe0, 0x89, 0xe3, 0x68, 0xf8, 0x9f, 0x80, 0x46, 0xed, 0x8d, 0xfd, 0xac, 0x89, 0x30, 0x95, 0xea, - 0xf6, 0x4c, 0x05, 0xb7, 0x86, 0xf3, 0xd6, 0x3c, 0x74, 0x5c, 0x7e, 0xff, 0x7f, 0x1e, 0xba, 0x64, - 0x6c, 0xe7, 0xa1, 0xe5, 0xd9, 0xce, 0x26, 0xcf, 0x1e, 0x01, 0x18, 0x69, 0x12, 0xe1, 0xee, 0xe1, - 0x9e, 0x9b, 0x2f, 0x42, 0xe8, 0x12, 0xe6, 0xd0, 0x57, 0x14, 0x97, 0xe6, 0xbb, 0x6e, 0x3b, 0xbf, - 0x0c, 0xff, 0xdd, 0xa1, 0x4a, 0xfa, 0xd0, 0x7f, 0x8b, 0x4c, 0xfc, 0x7c, 0xc4, 0x7b, 0xbf, 0x36, - 0xe2, 0xbd, 0xcd, 0x11, 0x9f, 0xd9, 0xcf, 0x11, 0x51, 0x1b, 0xbb, 0xf7, 0x4a, 0xd6, 0x4a, 0x53, - 0x0a, 0x93, 0xe3, 0xe0, 0xb3, 0x68, 0x7a, 0x63, 0xfa, 0xc6, 0x5a, 0xec, 0x25, 0xe3, 0x07, 0xa7, - 0xd1, 0x23, 0x97, 0xd4, 0x20, 0x9a, 0x7a, 0xdc, 0x8b, 0x0e, 0x7d, 0xa0, 0xd4, 0x36, 0xb1, 0x56, - 0xb8, 0xdc, 0xa8, 0x8f, 0x09, 0x6c, 0xa4, 0xe9, 0x29, 0x4c, 0x9a, 0x7d, 0x62, 0x59, 0x8a, 0x6b, - 0x3f, 0xe2, 0xe3, 0x06, 0x3c, 0x2b, 0xc5, 0x75, 0x78, 0x45, 0x2a, 0xed, 0xab, 0xe4, 0x09, 0x77, - 0x04, 0x3d, 0xda, 0xc8, 0x53, 0xee, 0xfe, 0x36, 0x8d, 0x36, 0xc8, 0x10, 0x39, 0x3f, 0xf6, 0x05, - 0xf4, 0x75, 0xbd, 0x5e, 0x27, 0xea, 0xda, 0x33, 0xef, 0x57, 0x5e, 0x69, 0x3c, 0xbf, 0xea, 0xfd, - 0xdd, 0x92, 0xf6, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x70, 0xd9, 0xa0, 0xf8, 0x48, 0x0d, 0x00, - 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/log/log_service.proto b/vendor/google.golang.org/appengine/internal/log/log_service.proto deleted file mode 100644 index 8981dc475..000000000 --- a/vendor/google.golang.org/appengine/internal/log/log_service.proto +++ /dev/null @@ -1,150 +0,0 @@ -syntax = "proto2"; -option go_package = "log"; - -package appengine; - -message LogServiceError { - enum ErrorCode { - OK = 0; - INVALID_REQUEST = 1; - STORAGE_ERROR = 2; - } -} - -message UserAppLogLine { - required int64 timestamp_usec = 1; - required int64 level = 2; - required string message = 3; -} - -message UserAppLogGroup { - repeated UserAppLogLine log_line = 2; -} - -message FlushRequest { - optional bytes logs = 1; -} - -message SetStatusRequest { - required string status = 1; -} - - -message LogOffset { - optional bytes request_id = 1; -} - -message LogLine { - required int64 time = 1; - required int32 level = 2; - required string log_message = 3; -} - -message RequestLog { - required string app_id = 1; - optional string module_id = 37 [default="default"]; - required string version_id = 2; - required bytes request_id = 3; - optional LogOffset offset = 35; - required string ip = 4; - optional string nickname = 5; - required int64 start_time = 6; - required int64 end_time = 7; - required int64 latency = 8; - required int64 mcycles = 9; - required string method = 10; - required string resource = 11; - required string http_version = 12; - required int32 status = 13; - required int64 response_size = 14; - optional string referrer = 15; - optional string user_agent = 16; - required string url_map_entry = 17; - required string combined = 18; - optional int64 api_mcycles = 19; - optional string host = 20; - optional double cost = 21; - - optional string task_queue_name = 22; - optional string task_name = 23; - - optional bool was_loading_request = 24; - optional int64 pending_time = 25; - optional int32 replica_index = 26 [default = -1]; - optional bool finished = 27 [default = true]; - optional bytes clone_key = 28; - - repeated LogLine line = 29; - - optional bool lines_incomplete = 36; - optional bytes app_engine_release = 38; - - optional int32 exit_reason = 30; - optional bool was_throttled_for_time = 31; - optional bool was_throttled_for_requests = 32; - optional int64 throttled_time = 33; - - optional bytes server_name = 34; -} - -message LogModuleVersion { - optional string module_id = 1 [default="default"]; - optional string version_id = 2; -} - -message LogReadRequest { - required string app_id = 1; - repeated string version_id = 2; - repeated LogModuleVersion module_version = 19; - - optional int64 start_time = 3; - optional int64 end_time = 4; - optional LogOffset offset = 5; - repeated bytes request_id = 6; - - optional int32 minimum_log_level = 7; - optional bool include_incomplete = 8; - optional int64 count = 9; - - optional string combined_log_regex = 14; - optional string host_regex = 15; - optional int32 replica_index = 16; - - optional bool include_app_logs = 10; - optional int32 app_logs_per_request = 17; - optional bool include_host = 11; - optional bool include_all = 12; - optional bool cache_iterator = 13; - optional int32 num_shards = 18; -} - -message LogReadResponse { - repeated RequestLog log = 1; - optional LogOffset offset = 2; - optional int64 last_end_time = 3; -} - -message LogUsageRecord { - optional string version_id = 1; - optional int32 start_time = 2; - optional int32 end_time = 3; - optional int64 count = 4; - optional int64 total_size = 5; - optional int32 records = 6; -} - -message LogUsageRequest { - required string app_id = 1; - repeated string version_id = 2; - optional int32 start_time = 3; - optional int32 end_time = 4; - optional uint32 resolution_hours = 5 [default = 1]; - optional bool combine_versions = 6; - optional int32 usage_version = 7; - optional bool versions_only = 8; -} - -message LogUsageResponse { - repeated LogUsageRecord usage = 1; - optional LogUsageRecord summary = 2; -} diff --git a/vendor/google.golang.org/appengine/internal/main.go b/vendor/google.golang.org/appengine/internal/main.go deleted file mode 100644 index 1e765312f..000000000 --- a/vendor/google.golang.org/appengine/internal/main.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// +build appengine - -package internal - -import ( - "appengine_internal" -) - -func Main() { - MainPath = "" - appengine_internal.Main() -} diff --git a/vendor/google.golang.org/appengine/internal/main_common.go b/vendor/google.golang.org/appengine/internal/main_common.go deleted file mode 100644 index 357dce4dd..000000000 --- a/vendor/google.golang.org/appengine/internal/main_common.go +++ /dev/null @@ -1,7 +0,0 @@ -package internal - -// MainPath stores the file path of the main package. On App Engine Standard -// using Go version 1.9 and below, this will be unset. On App Engine Flex and -// App Engine Standard second-gen (Go 1.11 and above), this will be the -// filepath to package main. -var MainPath string diff --git a/vendor/google.golang.org/appengine/internal/main_vm.go b/vendor/google.golang.org/appengine/internal/main_vm.go deleted file mode 100644 index ddb79a333..000000000 --- a/vendor/google.golang.org/appengine/internal/main_vm.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// +build !appengine - -package internal - -import ( - "io" - "log" - "net/http" - "net/url" - "os" - "path/filepath" - "runtime" -) - -func Main() { - MainPath = filepath.Dir(findMainPath()) - installHealthChecker(http.DefaultServeMux) - - port := "8080" - if s := os.Getenv("PORT"); s != "" { - port = s - } - - host := "" - if IsDevAppServer() { - host = "127.0.0.1" - } - if err := http.ListenAndServe(host+":"+port, http.HandlerFunc(handleHTTP)); err != nil { - log.Fatalf("http.ListenAndServe: %v", err) - } -} - -// Find the path to package main by looking at the root Caller. -func findMainPath() string { - pc := make([]uintptr, 100) - n := runtime.Callers(2, pc) - frames := runtime.CallersFrames(pc[:n]) - for { - frame, more := frames.Next() - // Tests won't have package main, instead they have testing.tRunner - if frame.Function == "main.main" || frame.Function == "testing.tRunner" { - return frame.File - } - if !more { - break - } - } - return "" -} - -func installHealthChecker(mux *http.ServeMux) { - // If no health check handler has been installed by this point, add a trivial one. - const healthPath = "/_ah/health" - hreq := &http.Request{ - Method: "GET", - URL: &url.URL{ - Path: healthPath, - }, - } - if _, pat := mux.Handler(hreq); pat != healthPath { - mux.HandleFunc(healthPath, func(w http.ResponseWriter, r *http.Request) { - io.WriteString(w, "ok") - }) - } -} diff --git a/vendor/google.golang.org/appengine/internal/metadata.go b/vendor/google.golang.org/appengine/internal/metadata.go deleted file mode 100644 index c4ba63bb4..000000000 --- a/vendor/google.golang.org/appengine/internal/metadata.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -// This file has code for accessing metadata. -// -// References: -// https://cloud.google.com/compute/docs/metadata - -import ( - "fmt" - "io/ioutil" - "net/http" - "net/url" -) - -const ( - metadataHost = "metadata" - metadataPath = "/computeMetadata/v1/" -) - -var ( - metadataRequestHeaders = http.Header{ - "Metadata-Flavor": []string{"Google"}, - } -) - -// TODO(dsymonds): Do we need to support default values, like Python? -func mustGetMetadata(key string) []byte { - b, err := getMetadata(key) - if err != nil { - panic(fmt.Sprintf("Metadata fetch failed for '%s': %v", key, err)) - } - return b -} - -func getMetadata(key string) ([]byte, error) { - // TODO(dsymonds): May need to use url.Parse to support keys with query args. - req := &http.Request{ - Method: "GET", - URL: &url.URL{ - Scheme: "http", - Host: metadataHost, - Path: metadataPath + key, - }, - Header: metadataRequestHeaders, - Host: metadataHost, - } - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - if resp.StatusCode != 200 { - return nil, fmt.Errorf("metadata server returned HTTP %d", resp.StatusCode) - } - return ioutil.ReadAll(resp.Body) -} diff --git a/vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go b/vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go deleted file mode 100644 index ddfc0c04a..000000000 --- a/vendor/google.golang.org/appengine/internal/modules/modules_service.pb.go +++ /dev/null @@ -1,786 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/modules/modules_service.proto - -package modules - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type ModulesServiceError_ErrorCode int32 - -const ( - ModulesServiceError_OK ModulesServiceError_ErrorCode = 0 - ModulesServiceError_INVALID_MODULE ModulesServiceError_ErrorCode = 1 - ModulesServiceError_INVALID_VERSION ModulesServiceError_ErrorCode = 2 - ModulesServiceError_INVALID_INSTANCES ModulesServiceError_ErrorCode = 3 - ModulesServiceError_TRANSIENT_ERROR ModulesServiceError_ErrorCode = 4 - ModulesServiceError_UNEXPECTED_STATE ModulesServiceError_ErrorCode = 5 -) - -var ModulesServiceError_ErrorCode_name = map[int32]string{ - 0: "OK", - 1: "INVALID_MODULE", - 2: "INVALID_VERSION", - 3: "INVALID_INSTANCES", - 4: "TRANSIENT_ERROR", - 5: "UNEXPECTED_STATE", -} -var ModulesServiceError_ErrorCode_value = map[string]int32{ - "OK": 0, - "INVALID_MODULE": 1, - "INVALID_VERSION": 2, - "INVALID_INSTANCES": 3, - "TRANSIENT_ERROR": 4, - "UNEXPECTED_STATE": 5, -} - -func (x ModulesServiceError_ErrorCode) Enum() *ModulesServiceError_ErrorCode { - p := new(ModulesServiceError_ErrorCode) - *p = x - return p -} -func (x ModulesServiceError_ErrorCode) String() string { - return proto.EnumName(ModulesServiceError_ErrorCode_name, int32(x)) -} -func (x *ModulesServiceError_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(ModulesServiceError_ErrorCode_value, data, "ModulesServiceError_ErrorCode") - if err != nil { - return err - } - *x = ModulesServiceError_ErrorCode(value) - return nil -} -func (ModulesServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{0, 0} -} - -type ModulesServiceError struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ModulesServiceError) Reset() { *m = ModulesServiceError{} } -func (m *ModulesServiceError) String() string { return proto.CompactTextString(m) } -func (*ModulesServiceError) ProtoMessage() {} -func (*ModulesServiceError) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{0} -} -func (m *ModulesServiceError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ModulesServiceError.Unmarshal(m, b) -} -func (m *ModulesServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ModulesServiceError.Marshal(b, m, deterministic) -} -func (dst *ModulesServiceError) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModulesServiceError.Merge(dst, src) -} -func (m *ModulesServiceError) XXX_Size() int { - return xxx_messageInfo_ModulesServiceError.Size(m) -} -func (m *ModulesServiceError) XXX_DiscardUnknown() { - xxx_messageInfo_ModulesServiceError.DiscardUnknown(m) -} - -var xxx_messageInfo_ModulesServiceError proto.InternalMessageInfo - -type GetModulesRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetModulesRequest) Reset() { *m = GetModulesRequest{} } -func (m *GetModulesRequest) String() string { return proto.CompactTextString(m) } -func (*GetModulesRequest) ProtoMessage() {} -func (*GetModulesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{1} -} -func (m *GetModulesRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetModulesRequest.Unmarshal(m, b) -} -func (m *GetModulesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetModulesRequest.Marshal(b, m, deterministic) -} -func (dst *GetModulesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetModulesRequest.Merge(dst, src) -} -func (m *GetModulesRequest) XXX_Size() int { - return xxx_messageInfo_GetModulesRequest.Size(m) -} -func (m *GetModulesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetModulesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetModulesRequest proto.InternalMessageInfo - -type GetModulesResponse struct { - Module []string `protobuf:"bytes,1,rep,name=module" json:"module,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetModulesResponse) Reset() { *m = GetModulesResponse{} } -func (m *GetModulesResponse) String() string { return proto.CompactTextString(m) } -func (*GetModulesResponse) ProtoMessage() {} -func (*GetModulesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{2} -} -func (m *GetModulesResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetModulesResponse.Unmarshal(m, b) -} -func (m *GetModulesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetModulesResponse.Marshal(b, m, deterministic) -} -func (dst *GetModulesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetModulesResponse.Merge(dst, src) -} -func (m *GetModulesResponse) XXX_Size() int { - return xxx_messageInfo_GetModulesResponse.Size(m) -} -func (m *GetModulesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetModulesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetModulesResponse proto.InternalMessageInfo - -func (m *GetModulesResponse) GetModule() []string { - if m != nil { - return m.Module - } - return nil -} - -type GetVersionsRequest struct { - Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetVersionsRequest) Reset() { *m = GetVersionsRequest{} } -func (m *GetVersionsRequest) String() string { return proto.CompactTextString(m) } -func (*GetVersionsRequest) ProtoMessage() {} -func (*GetVersionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{3} -} -func (m *GetVersionsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetVersionsRequest.Unmarshal(m, b) -} -func (m *GetVersionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetVersionsRequest.Marshal(b, m, deterministic) -} -func (dst *GetVersionsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetVersionsRequest.Merge(dst, src) -} -func (m *GetVersionsRequest) XXX_Size() int { - return xxx_messageInfo_GetVersionsRequest.Size(m) -} -func (m *GetVersionsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetVersionsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetVersionsRequest proto.InternalMessageInfo - -func (m *GetVersionsRequest) GetModule() string { - if m != nil && m.Module != nil { - return *m.Module - } - return "" -} - -type GetVersionsResponse struct { - Version []string `protobuf:"bytes,1,rep,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetVersionsResponse) Reset() { *m = GetVersionsResponse{} } -func (m *GetVersionsResponse) String() string { return proto.CompactTextString(m) } -func (*GetVersionsResponse) ProtoMessage() {} -func (*GetVersionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{4} -} -func (m *GetVersionsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetVersionsResponse.Unmarshal(m, b) -} -func (m *GetVersionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetVersionsResponse.Marshal(b, m, deterministic) -} -func (dst *GetVersionsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetVersionsResponse.Merge(dst, src) -} -func (m *GetVersionsResponse) XXX_Size() int { - return xxx_messageInfo_GetVersionsResponse.Size(m) -} -func (m *GetVersionsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetVersionsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetVersionsResponse proto.InternalMessageInfo - -func (m *GetVersionsResponse) GetVersion() []string { - if m != nil { - return m.Version - } - return nil -} - -type GetDefaultVersionRequest struct { - Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetDefaultVersionRequest) Reset() { *m = GetDefaultVersionRequest{} } -func (m *GetDefaultVersionRequest) String() string { return proto.CompactTextString(m) } -func (*GetDefaultVersionRequest) ProtoMessage() {} -func (*GetDefaultVersionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{5} -} -func (m *GetDefaultVersionRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetDefaultVersionRequest.Unmarshal(m, b) -} -func (m *GetDefaultVersionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetDefaultVersionRequest.Marshal(b, m, deterministic) -} -func (dst *GetDefaultVersionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetDefaultVersionRequest.Merge(dst, src) -} -func (m *GetDefaultVersionRequest) XXX_Size() int { - return xxx_messageInfo_GetDefaultVersionRequest.Size(m) -} -func (m *GetDefaultVersionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetDefaultVersionRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetDefaultVersionRequest proto.InternalMessageInfo - -func (m *GetDefaultVersionRequest) GetModule() string { - if m != nil && m.Module != nil { - return *m.Module - } - return "" -} - -type GetDefaultVersionResponse struct { - Version *string `protobuf:"bytes,1,req,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetDefaultVersionResponse) Reset() { *m = GetDefaultVersionResponse{} } -func (m *GetDefaultVersionResponse) String() string { return proto.CompactTextString(m) } -func (*GetDefaultVersionResponse) ProtoMessage() {} -func (*GetDefaultVersionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{6} -} -func (m *GetDefaultVersionResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetDefaultVersionResponse.Unmarshal(m, b) -} -func (m *GetDefaultVersionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetDefaultVersionResponse.Marshal(b, m, deterministic) -} -func (dst *GetDefaultVersionResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetDefaultVersionResponse.Merge(dst, src) -} -func (m *GetDefaultVersionResponse) XXX_Size() int { - return xxx_messageInfo_GetDefaultVersionResponse.Size(m) -} -func (m *GetDefaultVersionResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetDefaultVersionResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetDefaultVersionResponse proto.InternalMessageInfo - -func (m *GetDefaultVersionResponse) GetVersion() string { - if m != nil && m.Version != nil { - return *m.Version - } - return "" -} - -type GetNumInstancesRequest struct { - Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` - Version *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetNumInstancesRequest) Reset() { *m = GetNumInstancesRequest{} } -func (m *GetNumInstancesRequest) String() string { return proto.CompactTextString(m) } -func (*GetNumInstancesRequest) ProtoMessage() {} -func (*GetNumInstancesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{7} -} -func (m *GetNumInstancesRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetNumInstancesRequest.Unmarshal(m, b) -} -func (m *GetNumInstancesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetNumInstancesRequest.Marshal(b, m, deterministic) -} -func (dst *GetNumInstancesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetNumInstancesRequest.Merge(dst, src) -} -func (m *GetNumInstancesRequest) XXX_Size() int { - return xxx_messageInfo_GetNumInstancesRequest.Size(m) -} -func (m *GetNumInstancesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetNumInstancesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetNumInstancesRequest proto.InternalMessageInfo - -func (m *GetNumInstancesRequest) GetModule() string { - if m != nil && m.Module != nil { - return *m.Module - } - return "" -} - -func (m *GetNumInstancesRequest) GetVersion() string { - if m != nil && m.Version != nil { - return *m.Version - } - return "" -} - -type GetNumInstancesResponse struct { - Instances *int64 `protobuf:"varint,1,req,name=instances" json:"instances,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetNumInstancesResponse) Reset() { *m = GetNumInstancesResponse{} } -func (m *GetNumInstancesResponse) String() string { return proto.CompactTextString(m) } -func (*GetNumInstancesResponse) ProtoMessage() {} -func (*GetNumInstancesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{8} -} -func (m *GetNumInstancesResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetNumInstancesResponse.Unmarshal(m, b) -} -func (m *GetNumInstancesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetNumInstancesResponse.Marshal(b, m, deterministic) -} -func (dst *GetNumInstancesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetNumInstancesResponse.Merge(dst, src) -} -func (m *GetNumInstancesResponse) XXX_Size() int { - return xxx_messageInfo_GetNumInstancesResponse.Size(m) -} -func (m *GetNumInstancesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetNumInstancesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetNumInstancesResponse proto.InternalMessageInfo - -func (m *GetNumInstancesResponse) GetInstances() int64 { - if m != nil && m.Instances != nil { - return *m.Instances - } - return 0 -} - -type SetNumInstancesRequest struct { - Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` - Version *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"` - Instances *int64 `protobuf:"varint,3,req,name=instances" json:"instances,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetNumInstancesRequest) Reset() { *m = SetNumInstancesRequest{} } -func (m *SetNumInstancesRequest) String() string { return proto.CompactTextString(m) } -func (*SetNumInstancesRequest) ProtoMessage() {} -func (*SetNumInstancesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{9} -} -func (m *SetNumInstancesRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetNumInstancesRequest.Unmarshal(m, b) -} -func (m *SetNumInstancesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetNumInstancesRequest.Marshal(b, m, deterministic) -} -func (dst *SetNumInstancesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetNumInstancesRequest.Merge(dst, src) -} -func (m *SetNumInstancesRequest) XXX_Size() int { - return xxx_messageInfo_SetNumInstancesRequest.Size(m) -} -func (m *SetNumInstancesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetNumInstancesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetNumInstancesRequest proto.InternalMessageInfo - -func (m *SetNumInstancesRequest) GetModule() string { - if m != nil && m.Module != nil { - return *m.Module - } - return "" -} - -func (m *SetNumInstancesRequest) GetVersion() string { - if m != nil && m.Version != nil { - return *m.Version - } - return "" -} - -func (m *SetNumInstancesRequest) GetInstances() int64 { - if m != nil && m.Instances != nil { - return *m.Instances - } - return 0 -} - -type SetNumInstancesResponse struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetNumInstancesResponse) Reset() { *m = SetNumInstancesResponse{} } -func (m *SetNumInstancesResponse) String() string { return proto.CompactTextString(m) } -func (*SetNumInstancesResponse) ProtoMessage() {} -func (*SetNumInstancesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{10} -} -func (m *SetNumInstancesResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetNumInstancesResponse.Unmarshal(m, b) -} -func (m *SetNumInstancesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetNumInstancesResponse.Marshal(b, m, deterministic) -} -func (dst *SetNumInstancesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetNumInstancesResponse.Merge(dst, src) -} -func (m *SetNumInstancesResponse) XXX_Size() int { - return xxx_messageInfo_SetNumInstancesResponse.Size(m) -} -func (m *SetNumInstancesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_SetNumInstancesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_SetNumInstancesResponse proto.InternalMessageInfo - -type StartModuleRequest struct { - Module *string `protobuf:"bytes,1,req,name=module" json:"module,omitempty"` - Version *string `protobuf:"bytes,2,req,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StartModuleRequest) Reset() { *m = StartModuleRequest{} } -func (m *StartModuleRequest) String() string { return proto.CompactTextString(m) } -func (*StartModuleRequest) ProtoMessage() {} -func (*StartModuleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{11} -} -func (m *StartModuleRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StartModuleRequest.Unmarshal(m, b) -} -func (m *StartModuleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StartModuleRequest.Marshal(b, m, deterministic) -} -func (dst *StartModuleRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StartModuleRequest.Merge(dst, src) -} -func (m *StartModuleRequest) XXX_Size() int { - return xxx_messageInfo_StartModuleRequest.Size(m) -} -func (m *StartModuleRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StartModuleRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_StartModuleRequest proto.InternalMessageInfo - -func (m *StartModuleRequest) GetModule() string { - if m != nil && m.Module != nil { - return *m.Module - } - return "" -} - -func (m *StartModuleRequest) GetVersion() string { - if m != nil && m.Version != nil { - return *m.Version - } - return "" -} - -type StartModuleResponse struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StartModuleResponse) Reset() { *m = StartModuleResponse{} } -func (m *StartModuleResponse) String() string { return proto.CompactTextString(m) } -func (*StartModuleResponse) ProtoMessage() {} -func (*StartModuleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{12} -} -func (m *StartModuleResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StartModuleResponse.Unmarshal(m, b) -} -func (m *StartModuleResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StartModuleResponse.Marshal(b, m, deterministic) -} -func (dst *StartModuleResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_StartModuleResponse.Merge(dst, src) -} -func (m *StartModuleResponse) XXX_Size() int { - return xxx_messageInfo_StartModuleResponse.Size(m) -} -func (m *StartModuleResponse) XXX_DiscardUnknown() { - xxx_messageInfo_StartModuleResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_StartModuleResponse proto.InternalMessageInfo - -type StopModuleRequest struct { - Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` - Version *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StopModuleRequest) Reset() { *m = StopModuleRequest{} } -func (m *StopModuleRequest) String() string { return proto.CompactTextString(m) } -func (*StopModuleRequest) ProtoMessage() {} -func (*StopModuleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{13} -} -func (m *StopModuleRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StopModuleRequest.Unmarshal(m, b) -} -func (m *StopModuleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StopModuleRequest.Marshal(b, m, deterministic) -} -func (dst *StopModuleRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StopModuleRequest.Merge(dst, src) -} -func (m *StopModuleRequest) XXX_Size() int { - return xxx_messageInfo_StopModuleRequest.Size(m) -} -func (m *StopModuleRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StopModuleRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_StopModuleRequest proto.InternalMessageInfo - -func (m *StopModuleRequest) GetModule() string { - if m != nil && m.Module != nil { - return *m.Module - } - return "" -} - -func (m *StopModuleRequest) GetVersion() string { - if m != nil && m.Version != nil { - return *m.Version - } - return "" -} - -type StopModuleResponse struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StopModuleResponse) Reset() { *m = StopModuleResponse{} } -func (m *StopModuleResponse) String() string { return proto.CompactTextString(m) } -func (*StopModuleResponse) ProtoMessage() {} -func (*StopModuleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{14} -} -func (m *StopModuleResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StopModuleResponse.Unmarshal(m, b) -} -func (m *StopModuleResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StopModuleResponse.Marshal(b, m, deterministic) -} -func (dst *StopModuleResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_StopModuleResponse.Merge(dst, src) -} -func (m *StopModuleResponse) XXX_Size() int { - return xxx_messageInfo_StopModuleResponse.Size(m) -} -func (m *StopModuleResponse) XXX_DiscardUnknown() { - xxx_messageInfo_StopModuleResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_StopModuleResponse proto.InternalMessageInfo - -type GetHostnameRequest struct { - Module *string `protobuf:"bytes,1,opt,name=module" json:"module,omitempty"` - Version *string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"` - Instance *string `protobuf:"bytes,3,opt,name=instance" json:"instance,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetHostnameRequest) Reset() { *m = GetHostnameRequest{} } -func (m *GetHostnameRequest) String() string { return proto.CompactTextString(m) } -func (*GetHostnameRequest) ProtoMessage() {} -func (*GetHostnameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{15} -} -func (m *GetHostnameRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetHostnameRequest.Unmarshal(m, b) -} -func (m *GetHostnameRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetHostnameRequest.Marshal(b, m, deterministic) -} -func (dst *GetHostnameRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetHostnameRequest.Merge(dst, src) -} -func (m *GetHostnameRequest) XXX_Size() int { - return xxx_messageInfo_GetHostnameRequest.Size(m) -} -func (m *GetHostnameRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetHostnameRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetHostnameRequest proto.InternalMessageInfo - -func (m *GetHostnameRequest) GetModule() string { - if m != nil && m.Module != nil { - return *m.Module - } - return "" -} - -func (m *GetHostnameRequest) GetVersion() string { - if m != nil && m.Version != nil { - return *m.Version - } - return "" -} - -func (m *GetHostnameRequest) GetInstance() string { - if m != nil && m.Instance != nil { - return *m.Instance - } - return "" -} - -type GetHostnameResponse struct { - Hostname *string `protobuf:"bytes,1,req,name=hostname" json:"hostname,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetHostnameResponse) Reset() { *m = GetHostnameResponse{} } -func (m *GetHostnameResponse) String() string { return proto.CompactTextString(m) } -func (*GetHostnameResponse) ProtoMessage() {} -func (*GetHostnameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_modules_service_9cd3bffe4e91c59a, []int{16} -} -func (m *GetHostnameResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetHostnameResponse.Unmarshal(m, b) -} -func (m *GetHostnameResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetHostnameResponse.Marshal(b, m, deterministic) -} -func (dst *GetHostnameResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetHostnameResponse.Merge(dst, src) -} -func (m *GetHostnameResponse) XXX_Size() int { - return xxx_messageInfo_GetHostnameResponse.Size(m) -} -func (m *GetHostnameResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetHostnameResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetHostnameResponse proto.InternalMessageInfo - -func (m *GetHostnameResponse) GetHostname() string { - if m != nil && m.Hostname != nil { - return *m.Hostname - } - return "" -} - -func init() { - proto.RegisterType((*ModulesServiceError)(nil), "appengine.ModulesServiceError") - proto.RegisterType((*GetModulesRequest)(nil), "appengine.GetModulesRequest") - proto.RegisterType((*GetModulesResponse)(nil), "appengine.GetModulesResponse") - proto.RegisterType((*GetVersionsRequest)(nil), "appengine.GetVersionsRequest") - proto.RegisterType((*GetVersionsResponse)(nil), "appengine.GetVersionsResponse") - proto.RegisterType((*GetDefaultVersionRequest)(nil), "appengine.GetDefaultVersionRequest") - proto.RegisterType((*GetDefaultVersionResponse)(nil), "appengine.GetDefaultVersionResponse") - proto.RegisterType((*GetNumInstancesRequest)(nil), "appengine.GetNumInstancesRequest") - proto.RegisterType((*GetNumInstancesResponse)(nil), "appengine.GetNumInstancesResponse") - proto.RegisterType((*SetNumInstancesRequest)(nil), "appengine.SetNumInstancesRequest") - proto.RegisterType((*SetNumInstancesResponse)(nil), "appengine.SetNumInstancesResponse") - proto.RegisterType((*StartModuleRequest)(nil), "appengine.StartModuleRequest") - proto.RegisterType((*StartModuleResponse)(nil), "appengine.StartModuleResponse") - proto.RegisterType((*StopModuleRequest)(nil), "appengine.StopModuleRequest") - proto.RegisterType((*StopModuleResponse)(nil), "appengine.StopModuleResponse") - proto.RegisterType((*GetHostnameRequest)(nil), "appengine.GetHostnameRequest") - proto.RegisterType((*GetHostnameResponse)(nil), "appengine.GetHostnameResponse") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/modules/modules_service.proto", fileDescriptor_modules_service_9cd3bffe4e91c59a) -} - -var fileDescriptor_modules_service_9cd3bffe4e91c59a = []byte{ - // 457 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x94, 0xc1, 0x6f, 0xd3, 0x30, - 0x14, 0xc6, 0x69, 0x02, 0xdb, 0xf2, 0x0e, 0x90, 0x3a, 0x5b, 0xd7, 0x4d, 0x1c, 0x50, 0x4e, 0x1c, - 0x50, 0x2b, 0x90, 0x10, 0xe7, 0xae, 0x35, 0x25, 0xb0, 0xa5, 0x28, 0xce, 0x2a, 0xc4, 0xa5, 0x0a, - 0xdb, 0x23, 0x8b, 0x94, 0xda, 0xc1, 0x76, 0x77, 0xe4, 0xbf, 0xe0, 0xff, 0x45, 0x4b, 0xed, 0xb6, - 0x81, 0x4e, 0x45, 0x68, 0xa7, 0xe4, 0x7d, 0xfe, 0xfc, 0x7b, 0x9f, 0x5f, 0xac, 0xc0, 0x59, 0x2e, - 0x44, 0x5e, 0x62, 0x2f, 0x17, 0x65, 0xc6, 0xf3, 0x9e, 0x90, 0x79, 0x3f, 0xab, 0x2a, 0xe4, 0x79, - 0xc1, 0xb1, 0x5f, 0x70, 0x8d, 0x92, 0x67, 0x65, 0x7f, 0x2e, 0xae, 0x17, 0x25, 0x2a, 0xfb, 0x9c, - 0x29, 0x94, 0xb7, 0xc5, 0x15, 0xf6, 0x2a, 0x29, 0xb4, 0x20, 0xde, 0x6a, 0x47, 0xf8, 0xab, 0x05, - 0xc1, 0xc5, 0xd2, 0xc4, 0x96, 0x1e, 0x2a, 0xa5, 0x90, 0xe1, 0x4f, 0xf0, 0xea, 0x97, 0xa1, 0xb8, - 0x46, 0xb2, 0x07, 0xce, 0xe4, 0x93, 0xff, 0x88, 0x10, 0x78, 0x1a, 0xc5, 0xd3, 0xc1, 0x79, 0x34, - 0x9a, 0x5d, 0x4c, 0x46, 0x97, 0xe7, 0xd4, 0x6f, 0x91, 0x00, 0x9e, 0x59, 0x6d, 0x4a, 0x13, 0x16, - 0x4d, 0x62, 0xdf, 0x21, 0x47, 0xd0, 0xb6, 0x62, 0x14, 0xb3, 0x74, 0x10, 0x0f, 0x29, 0xf3, 0xdd, - 0x3b, 0x6f, 0x9a, 0x0c, 0x62, 0x16, 0xd1, 0x38, 0x9d, 0xd1, 0x24, 0x99, 0x24, 0xfe, 0x63, 0x72, - 0x08, 0xfe, 0x65, 0x4c, 0xbf, 0x7c, 0xa6, 0xc3, 0x94, 0x8e, 0x66, 0x2c, 0x1d, 0xa4, 0xd4, 0x7f, - 0x12, 0x06, 0xd0, 0x1e, 0xa3, 0x36, 0xc9, 0x12, 0xfc, 0xb1, 0x40, 0xa5, 0xc3, 0x57, 0x40, 0x36, - 0x45, 0x55, 0x09, 0xae, 0x90, 0x74, 0x60, 0x6f, 0x79, 0xcc, 0x6e, 0xeb, 0x85, 0xfb, 0xd2, 0x4b, - 0x4c, 0x65, 0xdc, 0x53, 0x94, 0xaa, 0x10, 0xdc, 0x32, 0x1a, 0xee, 0xd6, 0x86, 0xbb, 0x0f, 0x41, - 0xc3, 0x6d, 0xe0, 0x5d, 0xd8, 0xbf, 0x5d, 0x6a, 0x86, 0x6e, 0xcb, 0xf0, 0x0d, 0x74, 0xc7, 0xa8, - 0x47, 0xf8, 0x3d, 0x5b, 0x94, 0x76, 0xdf, 0xae, 0x26, 0x6f, 0xe1, 0x64, 0xcb, 0x9e, 0x6d, 0xad, - 0x9c, 0xcd, 0x56, 0x1f, 0xa1, 0x33, 0x46, 0x1d, 0x2f, 0xe6, 0x11, 0x57, 0x3a, 0xe3, 0x57, 0xb8, - 0xeb, 0x34, 0x9b, 0x2c, 0xa7, 0x5e, 0x58, 0xb1, 0xde, 0xc1, 0xf1, 0x5f, 0x2c, 0x13, 0xe0, 0x39, - 0x78, 0x85, 0x15, 0xeb, 0x08, 0x6e, 0xb2, 0x16, 0xc2, 0x1b, 0xe8, 0xb0, 0x07, 0x0a, 0xd1, 0xec, - 0xe4, 0xfe, 0xd9, 0xe9, 0x04, 0x8e, 0xd9, 0xf6, 0x88, 0xe1, 0x7b, 0x20, 0x4c, 0x67, 0xd2, 0xdc, - 0x81, 0x6d, 0x01, 0x9c, 0xfb, 0x02, 0x34, 0x26, 0x7a, 0x04, 0x41, 0x83, 0x63, 0xf0, 0x14, 0xda, - 0x4c, 0x8b, 0xea, 0x7e, 0xfa, 0xbf, 0xcd, 0xf8, 0xf0, 0x2e, 0xe5, 0x1a, 0x63, 0xe0, 0xdf, 0xea, - 0xfb, 0xf8, 0x41, 0x28, 0xcd, 0xb3, 0xf9, 0xff, 0xd3, 0xc9, 0x29, 0x1c, 0xd8, 0x59, 0x75, 0xdd, - 0x7a, 0x69, 0x55, 0x87, 0xaf, 0xeb, 0x5b, 0xbc, 0xee, 0x61, 0xbe, 0xec, 0x29, 0x1c, 0xdc, 0x18, - 0xcd, 0x8c, 0x68, 0x55, 0x9f, 0x79, 0x5f, 0xf7, 0xcd, 0x5f, 0xe2, 0x77, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x6e, 0xbc, 0xe0, 0x61, 0x5c, 0x04, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/modules/modules_service.proto b/vendor/google.golang.org/appengine/internal/modules/modules_service.proto deleted file mode 100644 index d29f0065a..000000000 --- a/vendor/google.golang.org/appengine/internal/modules/modules_service.proto +++ /dev/null @@ -1,80 +0,0 @@ -syntax = "proto2"; -option go_package = "modules"; - -package appengine; - -message ModulesServiceError { - enum ErrorCode { - OK = 0; - INVALID_MODULE = 1; - INVALID_VERSION = 2; - INVALID_INSTANCES = 3; - TRANSIENT_ERROR = 4; - UNEXPECTED_STATE = 5; - } -} - -message GetModulesRequest { -} - -message GetModulesResponse { - repeated string module = 1; -} - -message GetVersionsRequest { - optional string module = 1; -} - -message GetVersionsResponse { - repeated string version = 1; -} - -message GetDefaultVersionRequest { - optional string module = 1; -} - -message GetDefaultVersionResponse { - required string version = 1; -} - -message GetNumInstancesRequest { - optional string module = 1; - optional string version = 2; -} - -message GetNumInstancesResponse { - required int64 instances = 1; -} - -message SetNumInstancesRequest { - optional string module = 1; - optional string version = 2; - required int64 instances = 3; -} - -message SetNumInstancesResponse {} - -message StartModuleRequest { - required string module = 1; - required string version = 2; -} - -message StartModuleResponse {} - -message StopModuleRequest { - optional string module = 1; - optional string version = 2; -} - -message StopModuleResponse {} - -message GetHostnameRequest { - optional string module = 1; - optional string version = 2; - optional string instance = 3; -} - -message GetHostnameResponse { - required string hostname = 1; -} - diff --git a/vendor/google.golang.org/appengine/internal/net.go b/vendor/google.golang.org/appengine/internal/net.go deleted file mode 100644 index 3b94cf0c6..000000000 --- a/vendor/google.golang.org/appengine/internal/net.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2014 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -// This file implements a network dialer that limits the number of concurrent connections. -// It is only used for API calls. - -import ( - "log" - "net" - "runtime" - "sync" - "time" -) - -var limitSem = make(chan int, 100) // TODO(dsymonds): Use environment variable. - -func limitRelease() { - // non-blocking - select { - case <-limitSem: - default: - // This should not normally happen. - log.Print("appengine: unbalanced limitSem release!") - } -} - -func limitDial(network, addr string) (net.Conn, error) { - limitSem <- 1 - - // Dial with a timeout in case the API host is MIA. - // The connection should normally be very fast. - conn, err := net.DialTimeout(network, addr, 500*time.Millisecond) - if err != nil { - limitRelease() - return nil, err - } - lc := &limitConn{Conn: conn} - runtime.SetFinalizer(lc, (*limitConn).Close) // shouldn't usually be required - return lc, nil -} - -type limitConn struct { - close sync.Once - net.Conn -} - -func (lc *limitConn) Close() error { - defer lc.close.Do(func() { - limitRelease() - runtime.SetFinalizer(lc, nil) - }) - return lc.Conn.Close() -} diff --git a/vendor/google.golang.org/appengine/internal/regen.sh b/vendor/google.golang.org/appengine/internal/regen.sh deleted file mode 100644 index 2fdb546a6..000000000 --- a/vendor/google.golang.org/appengine/internal/regen.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash -e -# -# This script rebuilds the generated code for the protocol buffers. -# To run this you will need protoc and goprotobuf installed; -# see https://github.com/golang/protobuf for instructions. - -PKG=google.golang.org/appengine - -function die() { - echo 1>&2 $* - exit 1 -} - -# Sanity check that the right tools are accessible. -for tool in go protoc protoc-gen-go; do - q=$(which $tool) || die "didn't find $tool" - echo 1>&2 "$tool: $q" -done - -echo -n 1>&2 "finding package dir... " -pkgdir=$(go list -f '{{.Dir}}' $PKG) -echo 1>&2 $pkgdir -base=$(echo $pkgdir | sed "s,/$PKG\$,,") -echo 1>&2 "base: $base" -cd $base - -# Run protoc once per package. -for dir in $(find $PKG/internal -name '*.proto' | xargs dirname | sort | uniq); do - echo 1>&2 "* $dir" - protoc --go_out=. $dir/*.proto -done - -for f in $(find $PKG/internal -name '*.pb.go'); do - # Remove proto.RegisterEnum calls. - # These cause duplicate registration panics when these packages - # are used on classic App Engine. proto.RegisterEnum only affects - # parsing the text format; we don't care about that. - # https://code.google.com/p/googleappengine/issues/detail?id=11670#c17 - sed -i '/proto.RegisterEnum/d' $f -done diff --git a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go deleted file mode 100644 index 8d782a38e..000000000 --- a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go +++ /dev/null @@ -1,361 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/remote_api/remote_api.proto - -package remote_api - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type RpcError_ErrorCode int32 - -const ( - RpcError_UNKNOWN RpcError_ErrorCode = 0 - RpcError_CALL_NOT_FOUND RpcError_ErrorCode = 1 - RpcError_PARSE_ERROR RpcError_ErrorCode = 2 - RpcError_SECURITY_VIOLATION RpcError_ErrorCode = 3 - RpcError_OVER_QUOTA RpcError_ErrorCode = 4 - RpcError_REQUEST_TOO_LARGE RpcError_ErrorCode = 5 - RpcError_CAPABILITY_DISABLED RpcError_ErrorCode = 6 - RpcError_FEATURE_DISABLED RpcError_ErrorCode = 7 - RpcError_BAD_REQUEST RpcError_ErrorCode = 8 - RpcError_RESPONSE_TOO_LARGE RpcError_ErrorCode = 9 - RpcError_CANCELLED RpcError_ErrorCode = 10 - RpcError_REPLAY_ERROR RpcError_ErrorCode = 11 - RpcError_DEADLINE_EXCEEDED RpcError_ErrorCode = 12 -) - -var RpcError_ErrorCode_name = map[int32]string{ - 0: "UNKNOWN", - 1: "CALL_NOT_FOUND", - 2: "PARSE_ERROR", - 3: "SECURITY_VIOLATION", - 4: "OVER_QUOTA", - 5: "REQUEST_TOO_LARGE", - 6: "CAPABILITY_DISABLED", - 7: "FEATURE_DISABLED", - 8: "BAD_REQUEST", - 9: "RESPONSE_TOO_LARGE", - 10: "CANCELLED", - 11: "REPLAY_ERROR", - 12: "DEADLINE_EXCEEDED", -} -var RpcError_ErrorCode_value = map[string]int32{ - "UNKNOWN": 0, - "CALL_NOT_FOUND": 1, - "PARSE_ERROR": 2, - "SECURITY_VIOLATION": 3, - "OVER_QUOTA": 4, - "REQUEST_TOO_LARGE": 5, - "CAPABILITY_DISABLED": 6, - "FEATURE_DISABLED": 7, - "BAD_REQUEST": 8, - "RESPONSE_TOO_LARGE": 9, - "CANCELLED": 10, - "REPLAY_ERROR": 11, - "DEADLINE_EXCEEDED": 12, -} - -func (x RpcError_ErrorCode) Enum() *RpcError_ErrorCode { - p := new(RpcError_ErrorCode) - *p = x - return p -} -func (x RpcError_ErrorCode) String() string { - return proto.EnumName(RpcError_ErrorCode_name, int32(x)) -} -func (x *RpcError_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(RpcError_ErrorCode_value, data, "RpcError_ErrorCode") - if err != nil { - return err - } - *x = RpcError_ErrorCode(value) - return nil -} -func (RpcError_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_remote_api_1978114ec33a273d, []int{2, 0} -} - -type Request struct { - ServiceName *string `protobuf:"bytes,2,req,name=service_name,json=serviceName" json:"service_name,omitempty"` - Method *string `protobuf:"bytes,3,req,name=method" json:"method,omitempty"` - Request []byte `protobuf:"bytes,4,req,name=request" json:"request,omitempty"` - RequestId *string `protobuf:"bytes,5,opt,name=request_id,json=requestId" json:"request_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Request) Reset() { *m = Request{} } -func (m *Request) String() string { return proto.CompactTextString(m) } -func (*Request) ProtoMessage() {} -func (*Request) Descriptor() ([]byte, []int) { - return fileDescriptor_remote_api_1978114ec33a273d, []int{0} -} -func (m *Request) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Request.Unmarshal(m, b) -} -func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Request.Marshal(b, m, deterministic) -} -func (dst *Request) XXX_Merge(src proto.Message) { - xxx_messageInfo_Request.Merge(dst, src) -} -func (m *Request) XXX_Size() int { - return xxx_messageInfo_Request.Size(m) -} -func (m *Request) XXX_DiscardUnknown() { - xxx_messageInfo_Request.DiscardUnknown(m) -} - -var xxx_messageInfo_Request proto.InternalMessageInfo - -func (m *Request) GetServiceName() string { - if m != nil && m.ServiceName != nil { - return *m.ServiceName - } - return "" -} - -func (m *Request) GetMethod() string { - if m != nil && m.Method != nil { - return *m.Method - } - return "" -} - -func (m *Request) GetRequest() []byte { - if m != nil { - return m.Request - } - return nil -} - -func (m *Request) GetRequestId() string { - if m != nil && m.RequestId != nil { - return *m.RequestId - } - return "" -} - -type ApplicationError struct { - Code *int32 `protobuf:"varint,1,req,name=code" json:"code,omitempty"` - Detail *string `protobuf:"bytes,2,req,name=detail" json:"detail,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ApplicationError) Reset() { *m = ApplicationError{} } -func (m *ApplicationError) String() string { return proto.CompactTextString(m) } -func (*ApplicationError) ProtoMessage() {} -func (*ApplicationError) Descriptor() ([]byte, []int) { - return fileDescriptor_remote_api_1978114ec33a273d, []int{1} -} -func (m *ApplicationError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ApplicationError.Unmarshal(m, b) -} -func (m *ApplicationError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ApplicationError.Marshal(b, m, deterministic) -} -func (dst *ApplicationError) XXX_Merge(src proto.Message) { - xxx_messageInfo_ApplicationError.Merge(dst, src) -} -func (m *ApplicationError) XXX_Size() int { - return xxx_messageInfo_ApplicationError.Size(m) -} -func (m *ApplicationError) XXX_DiscardUnknown() { - xxx_messageInfo_ApplicationError.DiscardUnknown(m) -} - -var xxx_messageInfo_ApplicationError proto.InternalMessageInfo - -func (m *ApplicationError) GetCode() int32 { - if m != nil && m.Code != nil { - return *m.Code - } - return 0 -} - -func (m *ApplicationError) GetDetail() string { - if m != nil && m.Detail != nil { - return *m.Detail - } - return "" -} - -type RpcError struct { - Code *int32 `protobuf:"varint,1,req,name=code" json:"code,omitempty"` - Detail *string `protobuf:"bytes,2,opt,name=detail" json:"detail,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RpcError) Reset() { *m = RpcError{} } -func (m *RpcError) String() string { return proto.CompactTextString(m) } -func (*RpcError) ProtoMessage() {} -func (*RpcError) Descriptor() ([]byte, []int) { - return fileDescriptor_remote_api_1978114ec33a273d, []int{2} -} -func (m *RpcError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RpcError.Unmarshal(m, b) -} -func (m *RpcError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RpcError.Marshal(b, m, deterministic) -} -func (dst *RpcError) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcError.Merge(dst, src) -} -func (m *RpcError) XXX_Size() int { - return xxx_messageInfo_RpcError.Size(m) -} -func (m *RpcError) XXX_DiscardUnknown() { - xxx_messageInfo_RpcError.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcError proto.InternalMessageInfo - -func (m *RpcError) GetCode() int32 { - if m != nil && m.Code != nil { - return *m.Code - } - return 0 -} - -func (m *RpcError) GetDetail() string { - if m != nil && m.Detail != nil { - return *m.Detail - } - return "" -} - -type Response struct { - Response []byte `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"` - Exception []byte `protobuf:"bytes,2,opt,name=exception" json:"exception,omitempty"` - ApplicationError *ApplicationError `protobuf:"bytes,3,opt,name=application_error,json=applicationError" json:"application_error,omitempty"` - JavaException []byte `protobuf:"bytes,4,opt,name=java_exception,json=javaException" json:"java_exception,omitempty"` - RpcError *RpcError `protobuf:"bytes,5,opt,name=rpc_error,json=rpcError" json:"rpc_error,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Response) Reset() { *m = Response{} } -func (m *Response) String() string { return proto.CompactTextString(m) } -func (*Response) ProtoMessage() {} -func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_remote_api_1978114ec33a273d, []int{3} -} -func (m *Response) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Response.Unmarshal(m, b) -} -func (m *Response) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Response.Marshal(b, m, deterministic) -} -func (dst *Response) XXX_Merge(src proto.Message) { - xxx_messageInfo_Response.Merge(dst, src) -} -func (m *Response) XXX_Size() int { - return xxx_messageInfo_Response.Size(m) -} -func (m *Response) XXX_DiscardUnknown() { - xxx_messageInfo_Response.DiscardUnknown(m) -} - -var xxx_messageInfo_Response proto.InternalMessageInfo - -func (m *Response) GetResponse() []byte { - if m != nil { - return m.Response - } - return nil -} - -func (m *Response) GetException() []byte { - if m != nil { - return m.Exception - } - return nil -} - -func (m *Response) GetApplicationError() *ApplicationError { - if m != nil { - return m.ApplicationError - } - return nil -} - -func (m *Response) GetJavaException() []byte { - if m != nil { - return m.JavaException - } - return nil -} - -func (m *Response) GetRpcError() *RpcError { - if m != nil { - return m.RpcError - } - return nil -} - -func init() { - proto.RegisterType((*Request)(nil), "remote_api.Request") - proto.RegisterType((*ApplicationError)(nil), "remote_api.ApplicationError") - proto.RegisterType((*RpcError)(nil), "remote_api.RpcError") - proto.RegisterType((*Response)(nil), "remote_api.Response") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/remote_api/remote_api.proto", fileDescriptor_remote_api_1978114ec33a273d) -} - -var fileDescriptor_remote_api_1978114ec33a273d = []byte{ - // 531 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x51, 0x6e, 0xd3, 0x40, - 0x10, 0x86, 0xb1, 0x9b, 0x34, 0xf1, 0xc4, 0x2d, 0xdb, 0xa5, 0x14, 0x0b, 0x15, 0x29, 0x44, 0x42, - 0xca, 0x53, 0x2a, 0x38, 0x00, 0x62, 0x63, 0x6f, 0x91, 0x85, 0x65, 0xa7, 0x6b, 0xbb, 0x50, 0x5e, - 0x56, 0x2b, 0x67, 0x65, 0x8c, 0x12, 0xaf, 0xd9, 0x98, 0x8a, 0x17, 0x6e, 0xc0, 0xb5, 0x38, 0x0c, - 0xb7, 0x40, 0x36, 0x6e, 0x63, 0xf5, 0x89, 0xb7, 0x7f, 0x7e, 0x7b, 0xe6, 0x1b, 0xcd, 0xcc, 0xc2, - 0xbb, 0x5c, 0xa9, 0x7c, 0x23, 0x17, 0xb9, 0xda, 0x88, 0x32, 0x5f, 0x28, 0x9d, 0x5f, 0x88, 0xaa, - 0x92, 0x65, 0x5e, 0x94, 0xf2, 0xa2, 0x28, 0x6b, 0xa9, 0x4b, 0xb1, 0xb9, 0xd0, 0x72, 0xab, 0x6a, - 0xc9, 0x45, 0x55, 0xf4, 0xe4, 0xa2, 0xd2, 0xaa, 0x56, 0x18, 0xf6, 0xce, 0xec, 0x27, 0x8c, 0x98, - 0xfc, 0xf6, 0x5d, 0xee, 0x6a, 0xfc, 0x12, 0xec, 0x9d, 0xd4, 0xb7, 0x45, 0x26, 0x79, 0x29, 0xb6, - 0xd2, 0x31, 0xa7, 0xe6, 0xdc, 0x62, 0x93, 0xce, 0x0b, 0xc5, 0x56, 0xe2, 0x33, 0x38, 0xdc, 0xca, - 0xfa, 0x8b, 0x5a, 0x3b, 0x07, 0xed, 0xc7, 0x2e, 0xc2, 0x0e, 0x8c, 0xf4, 0xbf, 0x2a, 0xce, 0x60, - 0x6a, 0xce, 0x6d, 0x76, 0x17, 0xe2, 0x17, 0x00, 0x9d, 0xe4, 0xc5, 0xda, 0x19, 0x4e, 0x8d, 0xb9, - 0xc5, 0xac, 0xce, 0xf1, 0xd7, 0xb3, 0xb7, 0x80, 0x48, 0x55, 0x6d, 0x8a, 0x4c, 0xd4, 0x85, 0x2a, - 0xa9, 0xd6, 0x4a, 0x63, 0x0c, 0x83, 0x4c, 0xad, 0xa5, 0x63, 0x4c, 0xcd, 0xf9, 0x90, 0xb5, 0xba, - 0x01, 0xaf, 0x65, 0x2d, 0x8a, 0x4d, 0xd7, 0x55, 0x17, 0xcd, 0x7e, 0x9b, 0x30, 0x66, 0x55, 0xf6, - 0x7f, 0x89, 0x46, 0x2f, 0xf1, 0x97, 0x09, 0x56, 0x9b, 0xe5, 0x36, 0x7f, 0x4d, 0x60, 0x94, 0x86, - 0x1f, 0xc2, 0xe8, 0x63, 0x88, 0x1e, 0x61, 0x0c, 0xc7, 0x2e, 0x09, 0x02, 0x1e, 0x46, 0x09, 0xbf, - 0x8c, 0xd2, 0xd0, 0x43, 0x06, 0x7e, 0x0c, 0x93, 0x15, 0x61, 0x31, 0xe5, 0x94, 0xb1, 0x88, 0x21, - 0x13, 0x9f, 0x01, 0x8e, 0xa9, 0x9b, 0x32, 0x3f, 0xb9, 0xe1, 0xd7, 0x7e, 0x14, 0x90, 0xc4, 0x8f, - 0x42, 0x74, 0x80, 0x8f, 0x01, 0xa2, 0x6b, 0xca, 0xf8, 0x55, 0x1a, 0x25, 0x04, 0x0d, 0xf0, 0x53, - 0x38, 0x61, 0xf4, 0x2a, 0xa5, 0x71, 0xc2, 0x93, 0x28, 0xe2, 0x01, 0x61, 0xef, 0x29, 0x1a, 0xe2, - 0x67, 0xf0, 0xc4, 0x25, 0x2b, 0xb2, 0xf4, 0x83, 0xa6, 0x80, 0xe7, 0xc7, 0x64, 0x19, 0x50, 0x0f, - 0x1d, 0xe2, 0x53, 0x40, 0x97, 0x94, 0x24, 0x29, 0xa3, 0x7b, 0x77, 0xd4, 0xe0, 0x97, 0xc4, 0xe3, - 0x5d, 0x25, 0x34, 0x6e, 0xf0, 0x8c, 0xc6, 0xab, 0x28, 0x8c, 0x69, 0xaf, 0xae, 0x85, 0x8f, 0xc0, - 0x72, 0x49, 0xe8, 0xd2, 0xa0, 0xc9, 0x03, 0x8c, 0xc0, 0x66, 0x74, 0x15, 0x90, 0x9b, 0xae, 0xef, - 0x49, 0xd3, 0x8f, 0x47, 0x89, 0x17, 0xf8, 0x21, 0xe5, 0xf4, 0x93, 0x4b, 0xa9, 0x47, 0x3d, 0x64, - 0xcf, 0xfe, 0x18, 0x30, 0x66, 0x72, 0x57, 0xa9, 0x72, 0x27, 0xf1, 0x73, 0x18, 0xeb, 0x4e, 0x3b, - 0xc6, 0xd4, 0x98, 0xdb, 0xec, 0x3e, 0xc6, 0xe7, 0x60, 0xc9, 0x1f, 0x99, 0xac, 0x9a, 0x75, 0xb5, - 0x23, 0xb5, 0xd9, 0xde, 0xc0, 0x3e, 0x9c, 0x88, 0xfd, 0x3a, 0xb9, 0x6c, 0x06, 0xec, 0x1c, 0x4c, - 0x8d, 0xf9, 0xe4, 0xcd, 0xf9, 0xa2, 0x77, 0x87, 0x0f, 0x77, 0xce, 0x90, 0x78, 0x78, 0x05, 0xaf, - 0xe0, 0xf8, 0xab, 0xb8, 0x15, 0x7c, 0x4f, 0x1b, 0xb4, 0xb4, 0xa3, 0xc6, 0xa5, 0xf7, 0xc4, 0xd7, - 0x60, 0xe9, 0x2a, 0xeb, 0x48, 0xc3, 0x96, 0x74, 0xda, 0x27, 0xdd, 0x1d, 0x07, 0x1b, 0xeb, 0x4e, - 0x2d, 0xed, 0xcf, 0xbd, 0x07, 0xf0, 0x37, 0x00, 0x00, 0xff, 0xff, 0x38, 0xd1, 0x0f, 0x22, 0x4f, - 0x03, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto deleted file mode 100644 index f21763a4e..000000000 --- a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto +++ /dev/null @@ -1,44 +0,0 @@ -syntax = "proto2"; -option go_package = "remote_api"; - -package remote_api; - -message Request { - required string service_name = 2; - required string method = 3; - required bytes request = 4; - optional string request_id = 5; -} - -message ApplicationError { - required int32 code = 1; - required string detail = 2; -} - -message RpcError { - enum ErrorCode { - UNKNOWN = 0; - CALL_NOT_FOUND = 1; - PARSE_ERROR = 2; - SECURITY_VIOLATION = 3; - OVER_QUOTA = 4; - REQUEST_TOO_LARGE = 5; - CAPABILITY_DISABLED = 6; - FEATURE_DISABLED = 7; - BAD_REQUEST = 8; - RESPONSE_TOO_LARGE = 9; - CANCELLED = 10; - REPLAY_ERROR = 11; - DEADLINE_EXCEEDED = 12; - } - required int32 code = 1; - optional string detail = 2; -} - -message Response { - optional bytes response = 1; - optional bytes exception = 2; - optional ApplicationError application_error = 3; - optional bytes java_exception = 4; - optional RpcError rpc_error = 5; -} diff --git a/vendor/google.golang.org/appengine/internal/socket/socket_service.pb.go b/vendor/google.golang.org/appengine/internal/socket/socket_service.pb.go deleted file mode 100644 index 4ec872e46..000000000 --- a/vendor/google.golang.org/appengine/internal/socket/socket_service.pb.go +++ /dev/null @@ -1,2822 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/socket/socket_service.proto - -package socket - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type RemoteSocketServiceError_ErrorCode int32 - -const ( - RemoteSocketServiceError_SYSTEM_ERROR RemoteSocketServiceError_ErrorCode = 1 - RemoteSocketServiceError_GAI_ERROR RemoteSocketServiceError_ErrorCode = 2 - RemoteSocketServiceError_FAILURE RemoteSocketServiceError_ErrorCode = 4 - RemoteSocketServiceError_PERMISSION_DENIED RemoteSocketServiceError_ErrorCode = 5 - RemoteSocketServiceError_INVALID_REQUEST RemoteSocketServiceError_ErrorCode = 6 - RemoteSocketServiceError_SOCKET_CLOSED RemoteSocketServiceError_ErrorCode = 7 -) - -var RemoteSocketServiceError_ErrorCode_name = map[int32]string{ - 1: "SYSTEM_ERROR", - 2: "GAI_ERROR", - 4: "FAILURE", - 5: "PERMISSION_DENIED", - 6: "INVALID_REQUEST", - 7: "SOCKET_CLOSED", -} -var RemoteSocketServiceError_ErrorCode_value = map[string]int32{ - "SYSTEM_ERROR": 1, - "GAI_ERROR": 2, - "FAILURE": 4, - "PERMISSION_DENIED": 5, - "INVALID_REQUEST": 6, - "SOCKET_CLOSED": 7, -} - -func (x RemoteSocketServiceError_ErrorCode) Enum() *RemoteSocketServiceError_ErrorCode { - p := new(RemoteSocketServiceError_ErrorCode) - *p = x - return p -} -func (x RemoteSocketServiceError_ErrorCode) String() string { - return proto.EnumName(RemoteSocketServiceError_ErrorCode_name, int32(x)) -} -func (x *RemoteSocketServiceError_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(RemoteSocketServiceError_ErrorCode_value, data, "RemoteSocketServiceError_ErrorCode") - if err != nil { - return err - } - *x = RemoteSocketServiceError_ErrorCode(value) - return nil -} -func (RemoteSocketServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{0, 0} -} - -type RemoteSocketServiceError_SystemError int32 - -const ( - RemoteSocketServiceError_SYS_SUCCESS RemoteSocketServiceError_SystemError = 0 - RemoteSocketServiceError_SYS_EPERM RemoteSocketServiceError_SystemError = 1 - RemoteSocketServiceError_SYS_ENOENT RemoteSocketServiceError_SystemError = 2 - RemoteSocketServiceError_SYS_ESRCH RemoteSocketServiceError_SystemError = 3 - RemoteSocketServiceError_SYS_EINTR RemoteSocketServiceError_SystemError = 4 - RemoteSocketServiceError_SYS_EIO RemoteSocketServiceError_SystemError = 5 - RemoteSocketServiceError_SYS_ENXIO RemoteSocketServiceError_SystemError = 6 - RemoteSocketServiceError_SYS_E2BIG RemoteSocketServiceError_SystemError = 7 - RemoteSocketServiceError_SYS_ENOEXEC RemoteSocketServiceError_SystemError = 8 - RemoteSocketServiceError_SYS_EBADF RemoteSocketServiceError_SystemError = 9 - RemoteSocketServiceError_SYS_ECHILD RemoteSocketServiceError_SystemError = 10 - RemoteSocketServiceError_SYS_EAGAIN RemoteSocketServiceError_SystemError = 11 - RemoteSocketServiceError_SYS_EWOULDBLOCK RemoteSocketServiceError_SystemError = 11 - RemoteSocketServiceError_SYS_ENOMEM RemoteSocketServiceError_SystemError = 12 - RemoteSocketServiceError_SYS_EACCES RemoteSocketServiceError_SystemError = 13 - RemoteSocketServiceError_SYS_EFAULT RemoteSocketServiceError_SystemError = 14 - RemoteSocketServiceError_SYS_ENOTBLK RemoteSocketServiceError_SystemError = 15 - RemoteSocketServiceError_SYS_EBUSY RemoteSocketServiceError_SystemError = 16 - RemoteSocketServiceError_SYS_EEXIST RemoteSocketServiceError_SystemError = 17 - RemoteSocketServiceError_SYS_EXDEV RemoteSocketServiceError_SystemError = 18 - RemoteSocketServiceError_SYS_ENODEV RemoteSocketServiceError_SystemError = 19 - RemoteSocketServiceError_SYS_ENOTDIR RemoteSocketServiceError_SystemError = 20 - RemoteSocketServiceError_SYS_EISDIR RemoteSocketServiceError_SystemError = 21 - RemoteSocketServiceError_SYS_EINVAL RemoteSocketServiceError_SystemError = 22 - RemoteSocketServiceError_SYS_ENFILE RemoteSocketServiceError_SystemError = 23 - RemoteSocketServiceError_SYS_EMFILE RemoteSocketServiceError_SystemError = 24 - RemoteSocketServiceError_SYS_ENOTTY RemoteSocketServiceError_SystemError = 25 - RemoteSocketServiceError_SYS_ETXTBSY RemoteSocketServiceError_SystemError = 26 - RemoteSocketServiceError_SYS_EFBIG RemoteSocketServiceError_SystemError = 27 - RemoteSocketServiceError_SYS_ENOSPC RemoteSocketServiceError_SystemError = 28 - RemoteSocketServiceError_SYS_ESPIPE RemoteSocketServiceError_SystemError = 29 - RemoteSocketServiceError_SYS_EROFS RemoteSocketServiceError_SystemError = 30 - RemoteSocketServiceError_SYS_EMLINK RemoteSocketServiceError_SystemError = 31 - RemoteSocketServiceError_SYS_EPIPE RemoteSocketServiceError_SystemError = 32 - RemoteSocketServiceError_SYS_EDOM RemoteSocketServiceError_SystemError = 33 - RemoteSocketServiceError_SYS_ERANGE RemoteSocketServiceError_SystemError = 34 - RemoteSocketServiceError_SYS_EDEADLK RemoteSocketServiceError_SystemError = 35 - RemoteSocketServiceError_SYS_EDEADLOCK RemoteSocketServiceError_SystemError = 35 - RemoteSocketServiceError_SYS_ENAMETOOLONG RemoteSocketServiceError_SystemError = 36 - RemoteSocketServiceError_SYS_ENOLCK RemoteSocketServiceError_SystemError = 37 - RemoteSocketServiceError_SYS_ENOSYS RemoteSocketServiceError_SystemError = 38 - RemoteSocketServiceError_SYS_ENOTEMPTY RemoteSocketServiceError_SystemError = 39 - RemoteSocketServiceError_SYS_ELOOP RemoteSocketServiceError_SystemError = 40 - RemoteSocketServiceError_SYS_ENOMSG RemoteSocketServiceError_SystemError = 42 - RemoteSocketServiceError_SYS_EIDRM RemoteSocketServiceError_SystemError = 43 - RemoteSocketServiceError_SYS_ECHRNG RemoteSocketServiceError_SystemError = 44 - RemoteSocketServiceError_SYS_EL2NSYNC RemoteSocketServiceError_SystemError = 45 - RemoteSocketServiceError_SYS_EL3HLT RemoteSocketServiceError_SystemError = 46 - RemoteSocketServiceError_SYS_EL3RST RemoteSocketServiceError_SystemError = 47 - RemoteSocketServiceError_SYS_ELNRNG RemoteSocketServiceError_SystemError = 48 - RemoteSocketServiceError_SYS_EUNATCH RemoteSocketServiceError_SystemError = 49 - RemoteSocketServiceError_SYS_ENOCSI RemoteSocketServiceError_SystemError = 50 - RemoteSocketServiceError_SYS_EL2HLT RemoteSocketServiceError_SystemError = 51 - RemoteSocketServiceError_SYS_EBADE RemoteSocketServiceError_SystemError = 52 - RemoteSocketServiceError_SYS_EBADR RemoteSocketServiceError_SystemError = 53 - RemoteSocketServiceError_SYS_EXFULL RemoteSocketServiceError_SystemError = 54 - RemoteSocketServiceError_SYS_ENOANO RemoteSocketServiceError_SystemError = 55 - RemoteSocketServiceError_SYS_EBADRQC RemoteSocketServiceError_SystemError = 56 - RemoteSocketServiceError_SYS_EBADSLT RemoteSocketServiceError_SystemError = 57 - RemoteSocketServiceError_SYS_EBFONT RemoteSocketServiceError_SystemError = 59 - RemoteSocketServiceError_SYS_ENOSTR RemoteSocketServiceError_SystemError = 60 - RemoteSocketServiceError_SYS_ENODATA RemoteSocketServiceError_SystemError = 61 - RemoteSocketServiceError_SYS_ETIME RemoteSocketServiceError_SystemError = 62 - RemoteSocketServiceError_SYS_ENOSR RemoteSocketServiceError_SystemError = 63 - RemoteSocketServiceError_SYS_ENONET RemoteSocketServiceError_SystemError = 64 - RemoteSocketServiceError_SYS_ENOPKG RemoteSocketServiceError_SystemError = 65 - RemoteSocketServiceError_SYS_EREMOTE RemoteSocketServiceError_SystemError = 66 - RemoteSocketServiceError_SYS_ENOLINK RemoteSocketServiceError_SystemError = 67 - RemoteSocketServiceError_SYS_EADV RemoteSocketServiceError_SystemError = 68 - RemoteSocketServiceError_SYS_ESRMNT RemoteSocketServiceError_SystemError = 69 - RemoteSocketServiceError_SYS_ECOMM RemoteSocketServiceError_SystemError = 70 - RemoteSocketServiceError_SYS_EPROTO RemoteSocketServiceError_SystemError = 71 - RemoteSocketServiceError_SYS_EMULTIHOP RemoteSocketServiceError_SystemError = 72 - RemoteSocketServiceError_SYS_EDOTDOT RemoteSocketServiceError_SystemError = 73 - RemoteSocketServiceError_SYS_EBADMSG RemoteSocketServiceError_SystemError = 74 - RemoteSocketServiceError_SYS_EOVERFLOW RemoteSocketServiceError_SystemError = 75 - RemoteSocketServiceError_SYS_ENOTUNIQ RemoteSocketServiceError_SystemError = 76 - RemoteSocketServiceError_SYS_EBADFD RemoteSocketServiceError_SystemError = 77 - RemoteSocketServiceError_SYS_EREMCHG RemoteSocketServiceError_SystemError = 78 - RemoteSocketServiceError_SYS_ELIBACC RemoteSocketServiceError_SystemError = 79 - RemoteSocketServiceError_SYS_ELIBBAD RemoteSocketServiceError_SystemError = 80 - RemoteSocketServiceError_SYS_ELIBSCN RemoteSocketServiceError_SystemError = 81 - RemoteSocketServiceError_SYS_ELIBMAX RemoteSocketServiceError_SystemError = 82 - RemoteSocketServiceError_SYS_ELIBEXEC RemoteSocketServiceError_SystemError = 83 - RemoteSocketServiceError_SYS_EILSEQ RemoteSocketServiceError_SystemError = 84 - RemoteSocketServiceError_SYS_ERESTART RemoteSocketServiceError_SystemError = 85 - RemoteSocketServiceError_SYS_ESTRPIPE RemoteSocketServiceError_SystemError = 86 - RemoteSocketServiceError_SYS_EUSERS RemoteSocketServiceError_SystemError = 87 - RemoteSocketServiceError_SYS_ENOTSOCK RemoteSocketServiceError_SystemError = 88 - RemoteSocketServiceError_SYS_EDESTADDRREQ RemoteSocketServiceError_SystemError = 89 - RemoteSocketServiceError_SYS_EMSGSIZE RemoteSocketServiceError_SystemError = 90 - RemoteSocketServiceError_SYS_EPROTOTYPE RemoteSocketServiceError_SystemError = 91 - RemoteSocketServiceError_SYS_ENOPROTOOPT RemoteSocketServiceError_SystemError = 92 - RemoteSocketServiceError_SYS_EPROTONOSUPPORT RemoteSocketServiceError_SystemError = 93 - RemoteSocketServiceError_SYS_ESOCKTNOSUPPORT RemoteSocketServiceError_SystemError = 94 - RemoteSocketServiceError_SYS_EOPNOTSUPP RemoteSocketServiceError_SystemError = 95 - RemoteSocketServiceError_SYS_ENOTSUP RemoteSocketServiceError_SystemError = 95 - RemoteSocketServiceError_SYS_EPFNOSUPPORT RemoteSocketServiceError_SystemError = 96 - RemoteSocketServiceError_SYS_EAFNOSUPPORT RemoteSocketServiceError_SystemError = 97 - RemoteSocketServiceError_SYS_EADDRINUSE RemoteSocketServiceError_SystemError = 98 - RemoteSocketServiceError_SYS_EADDRNOTAVAIL RemoteSocketServiceError_SystemError = 99 - RemoteSocketServiceError_SYS_ENETDOWN RemoteSocketServiceError_SystemError = 100 - RemoteSocketServiceError_SYS_ENETUNREACH RemoteSocketServiceError_SystemError = 101 - RemoteSocketServiceError_SYS_ENETRESET RemoteSocketServiceError_SystemError = 102 - RemoteSocketServiceError_SYS_ECONNABORTED RemoteSocketServiceError_SystemError = 103 - RemoteSocketServiceError_SYS_ECONNRESET RemoteSocketServiceError_SystemError = 104 - RemoteSocketServiceError_SYS_ENOBUFS RemoteSocketServiceError_SystemError = 105 - RemoteSocketServiceError_SYS_EISCONN RemoteSocketServiceError_SystemError = 106 - RemoteSocketServiceError_SYS_ENOTCONN RemoteSocketServiceError_SystemError = 107 - RemoteSocketServiceError_SYS_ESHUTDOWN RemoteSocketServiceError_SystemError = 108 - RemoteSocketServiceError_SYS_ETOOMANYREFS RemoteSocketServiceError_SystemError = 109 - RemoteSocketServiceError_SYS_ETIMEDOUT RemoteSocketServiceError_SystemError = 110 - RemoteSocketServiceError_SYS_ECONNREFUSED RemoteSocketServiceError_SystemError = 111 - RemoteSocketServiceError_SYS_EHOSTDOWN RemoteSocketServiceError_SystemError = 112 - RemoteSocketServiceError_SYS_EHOSTUNREACH RemoteSocketServiceError_SystemError = 113 - RemoteSocketServiceError_SYS_EALREADY RemoteSocketServiceError_SystemError = 114 - RemoteSocketServiceError_SYS_EINPROGRESS RemoteSocketServiceError_SystemError = 115 - RemoteSocketServiceError_SYS_ESTALE RemoteSocketServiceError_SystemError = 116 - RemoteSocketServiceError_SYS_EUCLEAN RemoteSocketServiceError_SystemError = 117 - RemoteSocketServiceError_SYS_ENOTNAM RemoteSocketServiceError_SystemError = 118 - RemoteSocketServiceError_SYS_ENAVAIL RemoteSocketServiceError_SystemError = 119 - RemoteSocketServiceError_SYS_EISNAM RemoteSocketServiceError_SystemError = 120 - RemoteSocketServiceError_SYS_EREMOTEIO RemoteSocketServiceError_SystemError = 121 - RemoteSocketServiceError_SYS_EDQUOT RemoteSocketServiceError_SystemError = 122 - RemoteSocketServiceError_SYS_ENOMEDIUM RemoteSocketServiceError_SystemError = 123 - RemoteSocketServiceError_SYS_EMEDIUMTYPE RemoteSocketServiceError_SystemError = 124 - RemoteSocketServiceError_SYS_ECANCELED RemoteSocketServiceError_SystemError = 125 - RemoteSocketServiceError_SYS_ENOKEY RemoteSocketServiceError_SystemError = 126 - RemoteSocketServiceError_SYS_EKEYEXPIRED RemoteSocketServiceError_SystemError = 127 - RemoteSocketServiceError_SYS_EKEYREVOKED RemoteSocketServiceError_SystemError = 128 - RemoteSocketServiceError_SYS_EKEYREJECTED RemoteSocketServiceError_SystemError = 129 - RemoteSocketServiceError_SYS_EOWNERDEAD RemoteSocketServiceError_SystemError = 130 - RemoteSocketServiceError_SYS_ENOTRECOVERABLE RemoteSocketServiceError_SystemError = 131 - RemoteSocketServiceError_SYS_ERFKILL RemoteSocketServiceError_SystemError = 132 -) - -var RemoteSocketServiceError_SystemError_name = map[int32]string{ - 0: "SYS_SUCCESS", - 1: "SYS_EPERM", - 2: "SYS_ENOENT", - 3: "SYS_ESRCH", - 4: "SYS_EINTR", - 5: "SYS_EIO", - 6: "SYS_ENXIO", - 7: "SYS_E2BIG", - 8: "SYS_ENOEXEC", - 9: "SYS_EBADF", - 10: "SYS_ECHILD", - 11: "SYS_EAGAIN", - // Duplicate value: 11: "SYS_EWOULDBLOCK", - 12: "SYS_ENOMEM", - 13: "SYS_EACCES", - 14: "SYS_EFAULT", - 15: "SYS_ENOTBLK", - 16: "SYS_EBUSY", - 17: "SYS_EEXIST", - 18: "SYS_EXDEV", - 19: "SYS_ENODEV", - 20: "SYS_ENOTDIR", - 21: "SYS_EISDIR", - 22: "SYS_EINVAL", - 23: "SYS_ENFILE", - 24: "SYS_EMFILE", - 25: "SYS_ENOTTY", - 26: "SYS_ETXTBSY", - 27: "SYS_EFBIG", - 28: "SYS_ENOSPC", - 29: "SYS_ESPIPE", - 30: "SYS_EROFS", - 31: "SYS_EMLINK", - 32: "SYS_EPIPE", - 33: "SYS_EDOM", - 34: "SYS_ERANGE", - 35: "SYS_EDEADLK", - // Duplicate value: 35: "SYS_EDEADLOCK", - 36: "SYS_ENAMETOOLONG", - 37: "SYS_ENOLCK", - 38: "SYS_ENOSYS", - 39: "SYS_ENOTEMPTY", - 40: "SYS_ELOOP", - 42: "SYS_ENOMSG", - 43: "SYS_EIDRM", - 44: "SYS_ECHRNG", - 45: "SYS_EL2NSYNC", - 46: "SYS_EL3HLT", - 47: "SYS_EL3RST", - 48: "SYS_ELNRNG", - 49: "SYS_EUNATCH", - 50: "SYS_ENOCSI", - 51: "SYS_EL2HLT", - 52: "SYS_EBADE", - 53: "SYS_EBADR", - 54: "SYS_EXFULL", - 55: "SYS_ENOANO", - 56: "SYS_EBADRQC", - 57: "SYS_EBADSLT", - 59: "SYS_EBFONT", - 60: "SYS_ENOSTR", - 61: "SYS_ENODATA", - 62: "SYS_ETIME", - 63: "SYS_ENOSR", - 64: "SYS_ENONET", - 65: "SYS_ENOPKG", - 66: "SYS_EREMOTE", - 67: "SYS_ENOLINK", - 68: "SYS_EADV", - 69: "SYS_ESRMNT", - 70: "SYS_ECOMM", - 71: "SYS_EPROTO", - 72: "SYS_EMULTIHOP", - 73: "SYS_EDOTDOT", - 74: "SYS_EBADMSG", - 75: "SYS_EOVERFLOW", - 76: "SYS_ENOTUNIQ", - 77: "SYS_EBADFD", - 78: "SYS_EREMCHG", - 79: "SYS_ELIBACC", - 80: "SYS_ELIBBAD", - 81: "SYS_ELIBSCN", - 82: "SYS_ELIBMAX", - 83: "SYS_ELIBEXEC", - 84: "SYS_EILSEQ", - 85: "SYS_ERESTART", - 86: "SYS_ESTRPIPE", - 87: "SYS_EUSERS", - 88: "SYS_ENOTSOCK", - 89: "SYS_EDESTADDRREQ", - 90: "SYS_EMSGSIZE", - 91: "SYS_EPROTOTYPE", - 92: "SYS_ENOPROTOOPT", - 93: "SYS_EPROTONOSUPPORT", - 94: "SYS_ESOCKTNOSUPPORT", - 95: "SYS_EOPNOTSUPP", - // Duplicate value: 95: "SYS_ENOTSUP", - 96: "SYS_EPFNOSUPPORT", - 97: "SYS_EAFNOSUPPORT", - 98: "SYS_EADDRINUSE", - 99: "SYS_EADDRNOTAVAIL", - 100: "SYS_ENETDOWN", - 101: "SYS_ENETUNREACH", - 102: "SYS_ENETRESET", - 103: "SYS_ECONNABORTED", - 104: "SYS_ECONNRESET", - 105: "SYS_ENOBUFS", - 106: "SYS_EISCONN", - 107: "SYS_ENOTCONN", - 108: "SYS_ESHUTDOWN", - 109: "SYS_ETOOMANYREFS", - 110: "SYS_ETIMEDOUT", - 111: "SYS_ECONNREFUSED", - 112: "SYS_EHOSTDOWN", - 113: "SYS_EHOSTUNREACH", - 114: "SYS_EALREADY", - 115: "SYS_EINPROGRESS", - 116: "SYS_ESTALE", - 117: "SYS_EUCLEAN", - 118: "SYS_ENOTNAM", - 119: "SYS_ENAVAIL", - 120: "SYS_EISNAM", - 121: "SYS_EREMOTEIO", - 122: "SYS_EDQUOT", - 123: "SYS_ENOMEDIUM", - 124: "SYS_EMEDIUMTYPE", - 125: "SYS_ECANCELED", - 126: "SYS_ENOKEY", - 127: "SYS_EKEYEXPIRED", - 128: "SYS_EKEYREVOKED", - 129: "SYS_EKEYREJECTED", - 130: "SYS_EOWNERDEAD", - 131: "SYS_ENOTRECOVERABLE", - 132: "SYS_ERFKILL", -} -var RemoteSocketServiceError_SystemError_value = map[string]int32{ - "SYS_SUCCESS": 0, - "SYS_EPERM": 1, - "SYS_ENOENT": 2, - "SYS_ESRCH": 3, - "SYS_EINTR": 4, - "SYS_EIO": 5, - "SYS_ENXIO": 6, - "SYS_E2BIG": 7, - "SYS_ENOEXEC": 8, - "SYS_EBADF": 9, - "SYS_ECHILD": 10, - "SYS_EAGAIN": 11, - "SYS_EWOULDBLOCK": 11, - "SYS_ENOMEM": 12, - "SYS_EACCES": 13, - "SYS_EFAULT": 14, - "SYS_ENOTBLK": 15, - "SYS_EBUSY": 16, - "SYS_EEXIST": 17, - "SYS_EXDEV": 18, - "SYS_ENODEV": 19, - "SYS_ENOTDIR": 20, - "SYS_EISDIR": 21, - "SYS_EINVAL": 22, - "SYS_ENFILE": 23, - "SYS_EMFILE": 24, - "SYS_ENOTTY": 25, - "SYS_ETXTBSY": 26, - "SYS_EFBIG": 27, - "SYS_ENOSPC": 28, - "SYS_ESPIPE": 29, - "SYS_EROFS": 30, - "SYS_EMLINK": 31, - "SYS_EPIPE": 32, - "SYS_EDOM": 33, - "SYS_ERANGE": 34, - "SYS_EDEADLK": 35, - "SYS_EDEADLOCK": 35, - "SYS_ENAMETOOLONG": 36, - "SYS_ENOLCK": 37, - "SYS_ENOSYS": 38, - "SYS_ENOTEMPTY": 39, - "SYS_ELOOP": 40, - "SYS_ENOMSG": 42, - "SYS_EIDRM": 43, - "SYS_ECHRNG": 44, - "SYS_EL2NSYNC": 45, - "SYS_EL3HLT": 46, - "SYS_EL3RST": 47, - "SYS_ELNRNG": 48, - "SYS_EUNATCH": 49, - "SYS_ENOCSI": 50, - "SYS_EL2HLT": 51, - "SYS_EBADE": 52, - "SYS_EBADR": 53, - "SYS_EXFULL": 54, - "SYS_ENOANO": 55, - "SYS_EBADRQC": 56, - "SYS_EBADSLT": 57, - "SYS_EBFONT": 59, - "SYS_ENOSTR": 60, - "SYS_ENODATA": 61, - "SYS_ETIME": 62, - "SYS_ENOSR": 63, - "SYS_ENONET": 64, - "SYS_ENOPKG": 65, - "SYS_EREMOTE": 66, - "SYS_ENOLINK": 67, - "SYS_EADV": 68, - "SYS_ESRMNT": 69, - "SYS_ECOMM": 70, - "SYS_EPROTO": 71, - "SYS_EMULTIHOP": 72, - "SYS_EDOTDOT": 73, - "SYS_EBADMSG": 74, - "SYS_EOVERFLOW": 75, - "SYS_ENOTUNIQ": 76, - "SYS_EBADFD": 77, - "SYS_EREMCHG": 78, - "SYS_ELIBACC": 79, - "SYS_ELIBBAD": 80, - "SYS_ELIBSCN": 81, - "SYS_ELIBMAX": 82, - "SYS_ELIBEXEC": 83, - "SYS_EILSEQ": 84, - "SYS_ERESTART": 85, - "SYS_ESTRPIPE": 86, - "SYS_EUSERS": 87, - "SYS_ENOTSOCK": 88, - "SYS_EDESTADDRREQ": 89, - "SYS_EMSGSIZE": 90, - "SYS_EPROTOTYPE": 91, - "SYS_ENOPROTOOPT": 92, - "SYS_EPROTONOSUPPORT": 93, - "SYS_ESOCKTNOSUPPORT": 94, - "SYS_EOPNOTSUPP": 95, - "SYS_ENOTSUP": 95, - "SYS_EPFNOSUPPORT": 96, - "SYS_EAFNOSUPPORT": 97, - "SYS_EADDRINUSE": 98, - "SYS_EADDRNOTAVAIL": 99, - "SYS_ENETDOWN": 100, - "SYS_ENETUNREACH": 101, - "SYS_ENETRESET": 102, - "SYS_ECONNABORTED": 103, - "SYS_ECONNRESET": 104, - "SYS_ENOBUFS": 105, - "SYS_EISCONN": 106, - "SYS_ENOTCONN": 107, - "SYS_ESHUTDOWN": 108, - "SYS_ETOOMANYREFS": 109, - "SYS_ETIMEDOUT": 110, - "SYS_ECONNREFUSED": 111, - "SYS_EHOSTDOWN": 112, - "SYS_EHOSTUNREACH": 113, - "SYS_EALREADY": 114, - "SYS_EINPROGRESS": 115, - "SYS_ESTALE": 116, - "SYS_EUCLEAN": 117, - "SYS_ENOTNAM": 118, - "SYS_ENAVAIL": 119, - "SYS_EISNAM": 120, - "SYS_EREMOTEIO": 121, - "SYS_EDQUOT": 122, - "SYS_ENOMEDIUM": 123, - "SYS_EMEDIUMTYPE": 124, - "SYS_ECANCELED": 125, - "SYS_ENOKEY": 126, - "SYS_EKEYEXPIRED": 127, - "SYS_EKEYREVOKED": 128, - "SYS_EKEYREJECTED": 129, - "SYS_EOWNERDEAD": 130, - "SYS_ENOTRECOVERABLE": 131, - "SYS_ERFKILL": 132, -} - -func (x RemoteSocketServiceError_SystemError) Enum() *RemoteSocketServiceError_SystemError { - p := new(RemoteSocketServiceError_SystemError) - *p = x - return p -} -func (x RemoteSocketServiceError_SystemError) String() string { - return proto.EnumName(RemoteSocketServiceError_SystemError_name, int32(x)) -} -func (x *RemoteSocketServiceError_SystemError) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(RemoteSocketServiceError_SystemError_value, data, "RemoteSocketServiceError_SystemError") - if err != nil { - return err - } - *x = RemoteSocketServiceError_SystemError(value) - return nil -} -func (RemoteSocketServiceError_SystemError) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{0, 1} -} - -type CreateSocketRequest_SocketFamily int32 - -const ( - CreateSocketRequest_IPv4 CreateSocketRequest_SocketFamily = 1 - CreateSocketRequest_IPv6 CreateSocketRequest_SocketFamily = 2 -) - -var CreateSocketRequest_SocketFamily_name = map[int32]string{ - 1: "IPv4", - 2: "IPv6", -} -var CreateSocketRequest_SocketFamily_value = map[string]int32{ - "IPv4": 1, - "IPv6": 2, -} - -func (x CreateSocketRequest_SocketFamily) Enum() *CreateSocketRequest_SocketFamily { - p := new(CreateSocketRequest_SocketFamily) - *p = x - return p -} -func (x CreateSocketRequest_SocketFamily) String() string { - return proto.EnumName(CreateSocketRequest_SocketFamily_name, int32(x)) -} -func (x *CreateSocketRequest_SocketFamily) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(CreateSocketRequest_SocketFamily_value, data, "CreateSocketRequest_SocketFamily") - if err != nil { - return err - } - *x = CreateSocketRequest_SocketFamily(value) - return nil -} -func (CreateSocketRequest_SocketFamily) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{2, 0} -} - -type CreateSocketRequest_SocketProtocol int32 - -const ( - CreateSocketRequest_TCP CreateSocketRequest_SocketProtocol = 1 - CreateSocketRequest_UDP CreateSocketRequest_SocketProtocol = 2 -) - -var CreateSocketRequest_SocketProtocol_name = map[int32]string{ - 1: "TCP", - 2: "UDP", -} -var CreateSocketRequest_SocketProtocol_value = map[string]int32{ - "TCP": 1, - "UDP": 2, -} - -func (x CreateSocketRequest_SocketProtocol) Enum() *CreateSocketRequest_SocketProtocol { - p := new(CreateSocketRequest_SocketProtocol) - *p = x - return p -} -func (x CreateSocketRequest_SocketProtocol) String() string { - return proto.EnumName(CreateSocketRequest_SocketProtocol_name, int32(x)) -} -func (x *CreateSocketRequest_SocketProtocol) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(CreateSocketRequest_SocketProtocol_value, data, "CreateSocketRequest_SocketProtocol") - if err != nil { - return err - } - *x = CreateSocketRequest_SocketProtocol(value) - return nil -} -func (CreateSocketRequest_SocketProtocol) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{2, 1} -} - -type SocketOption_SocketOptionLevel int32 - -const ( - SocketOption_SOCKET_SOL_IP SocketOption_SocketOptionLevel = 0 - SocketOption_SOCKET_SOL_SOCKET SocketOption_SocketOptionLevel = 1 - SocketOption_SOCKET_SOL_TCP SocketOption_SocketOptionLevel = 6 - SocketOption_SOCKET_SOL_UDP SocketOption_SocketOptionLevel = 17 -) - -var SocketOption_SocketOptionLevel_name = map[int32]string{ - 0: "SOCKET_SOL_IP", - 1: "SOCKET_SOL_SOCKET", - 6: "SOCKET_SOL_TCP", - 17: "SOCKET_SOL_UDP", -} -var SocketOption_SocketOptionLevel_value = map[string]int32{ - "SOCKET_SOL_IP": 0, - "SOCKET_SOL_SOCKET": 1, - "SOCKET_SOL_TCP": 6, - "SOCKET_SOL_UDP": 17, -} - -func (x SocketOption_SocketOptionLevel) Enum() *SocketOption_SocketOptionLevel { - p := new(SocketOption_SocketOptionLevel) - *p = x - return p -} -func (x SocketOption_SocketOptionLevel) String() string { - return proto.EnumName(SocketOption_SocketOptionLevel_name, int32(x)) -} -func (x *SocketOption_SocketOptionLevel) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(SocketOption_SocketOptionLevel_value, data, "SocketOption_SocketOptionLevel") - if err != nil { - return err - } - *x = SocketOption_SocketOptionLevel(value) - return nil -} -func (SocketOption_SocketOptionLevel) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{10, 0} -} - -type SocketOption_SocketOptionName int32 - -const ( - SocketOption_SOCKET_SO_DEBUG SocketOption_SocketOptionName = 1 - SocketOption_SOCKET_SO_REUSEADDR SocketOption_SocketOptionName = 2 - SocketOption_SOCKET_SO_TYPE SocketOption_SocketOptionName = 3 - SocketOption_SOCKET_SO_ERROR SocketOption_SocketOptionName = 4 - SocketOption_SOCKET_SO_DONTROUTE SocketOption_SocketOptionName = 5 - SocketOption_SOCKET_SO_BROADCAST SocketOption_SocketOptionName = 6 - SocketOption_SOCKET_SO_SNDBUF SocketOption_SocketOptionName = 7 - SocketOption_SOCKET_SO_RCVBUF SocketOption_SocketOptionName = 8 - SocketOption_SOCKET_SO_KEEPALIVE SocketOption_SocketOptionName = 9 - SocketOption_SOCKET_SO_OOBINLINE SocketOption_SocketOptionName = 10 - SocketOption_SOCKET_SO_LINGER SocketOption_SocketOptionName = 13 - SocketOption_SOCKET_SO_RCVTIMEO SocketOption_SocketOptionName = 20 - SocketOption_SOCKET_SO_SNDTIMEO SocketOption_SocketOptionName = 21 - SocketOption_SOCKET_IP_TOS SocketOption_SocketOptionName = 1 - SocketOption_SOCKET_IP_TTL SocketOption_SocketOptionName = 2 - SocketOption_SOCKET_IP_HDRINCL SocketOption_SocketOptionName = 3 - SocketOption_SOCKET_IP_OPTIONS SocketOption_SocketOptionName = 4 - SocketOption_SOCKET_TCP_NODELAY SocketOption_SocketOptionName = 1 - SocketOption_SOCKET_TCP_MAXSEG SocketOption_SocketOptionName = 2 - SocketOption_SOCKET_TCP_CORK SocketOption_SocketOptionName = 3 - SocketOption_SOCKET_TCP_KEEPIDLE SocketOption_SocketOptionName = 4 - SocketOption_SOCKET_TCP_KEEPINTVL SocketOption_SocketOptionName = 5 - SocketOption_SOCKET_TCP_KEEPCNT SocketOption_SocketOptionName = 6 - SocketOption_SOCKET_TCP_SYNCNT SocketOption_SocketOptionName = 7 - SocketOption_SOCKET_TCP_LINGER2 SocketOption_SocketOptionName = 8 - SocketOption_SOCKET_TCP_DEFER_ACCEPT SocketOption_SocketOptionName = 9 - SocketOption_SOCKET_TCP_WINDOW_CLAMP SocketOption_SocketOptionName = 10 - SocketOption_SOCKET_TCP_INFO SocketOption_SocketOptionName = 11 - SocketOption_SOCKET_TCP_QUICKACK SocketOption_SocketOptionName = 12 -) - -var SocketOption_SocketOptionName_name = map[int32]string{ - 1: "SOCKET_SO_DEBUG", - 2: "SOCKET_SO_REUSEADDR", - 3: "SOCKET_SO_TYPE", - 4: "SOCKET_SO_ERROR", - 5: "SOCKET_SO_DONTROUTE", - 6: "SOCKET_SO_BROADCAST", - 7: "SOCKET_SO_SNDBUF", - 8: "SOCKET_SO_RCVBUF", - 9: "SOCKET_SO_KEEPALIVE", - 10: "SOCKET_SO_OOBINLINE", - 13: "SOCKET_SO_LINGER", - 20: "SOCKET_SO_RCVTIMEO", - 21: "SOCKET_SO_SNDTIMEO", - // Duplicate value: 1: "SOCKET_IP_TOS", - // Duplicate value: 2: "SOCKET_IP_TTL", - // Duplicate value: 3: "SOCKET_IP_HDRINCL", - // Duplicate value: 4: "SOCKET_IP_OPTIONS", - // Duplicate value: 1: "SOCKET_TCP_NODELAY", - // Duplicate value: 2: "SOCKET_TCP_MAXSEG", - // Duplicate value: 3: "SOCKET_TCP_CORK", - // Duplicate value: 4: "SOCKET_TCP_KEEPIDLE", - // Duplicate value: 5: "SOCKET_TCP_KEEPINTVL", - // Duplicate value: 6: "SOCKET_TCP_KEEPCNT", - // Duplicate value: 7: "SOCKET_TCP_SYNCNT", - // Duplicate value: 8: "SOCKET_TCP_LINGER2", - // Duplicate value: 9: "SOCKET_TCP_DEFER_ACCEPT", - // Duplicate value: 10: "SOCKET_TCP_WINDOW_CLAMP", - 11: "SOCKET_TCP_INFO", - 12: "SOCKET_TCP_QUICKACK", -} -var SocketOption_SocketOptionName_value = map[string]int32{ - "SOCKET_SO_DEBUG": 1, - "SOCKET_SO_REUSEADDR": 2, - "SOCKET_SO_TYPE": 3, - "SOCKET_SO_ERROR": 4, - "SOCKET_SO_DONTROUTE": 5, - "SOCKET_SO_BROADCAST": 6, - "SOCKET_SO_SNDBUF": 7, - "SOCKET_SO_RCVBUF": 8, - "SOCKET_SO_KEEPALIVE": 9, - "SOCKET_SO_OOBINLINE": 10, - "SOCKET_SO_LINGER": 13, - "SOCKET_SO_RCVTIMEO": 20, - "SOCKET_SO_SNDTIMEO": 21, - "SOCKET_IP_TOS": 1, - "SOCKET_IP_TTL": 2, - "SOCKET_IP_HDRINCL": 3, - "SOCKET_IP_OPTIONS": 4, - "SOCKET_TCP_NODELAY": 1, - "SOCKET_TCP_MAXSEG": 2, - "SOCKET_TCP_CORK": 3, - "SOCKET_TCP_KEEPIDLE": 4, - "SOCKET_TCP_KEEPINTVL": 5, - "SOCKET_TCP_KEEPCNT": 6, - "SOCKET_TCP_SYNCNT": 7, - "SOCKET_TCP_LINGER2": 8, - "SOCKET_TCP_DEFER_ACCEPT": 9, - "SOCKET_TCP_WINDOW_CLAMP": 10, - "SOCKET_TCP_INFO": 11, - "SOCKET_TCP_QUICKACK": 12, -} - -func (x SocketOption_SocketOptionName) Enum() *SocketOption_SocketOptionName { - p := new(SocketOption_SocketOptionName) - *p = x - return p -} -func (x SocketOption_SocketOptionName) String() string { - return proto.EnumName(SocketOption_SocketOptionName_name, int32(x)) -} -func (x *SocketOption_SocketOptionName) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(SocketOption_SocketOptionName_value, data, "SocketOption_SocketOptionName") - if err != nil { - return err - } - *x = SocketOption_SocketOptionName(value) - return nil -} -func (SocketOption_SocketOptionName) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{10, 1} -} - -type ShutDownRequest_How int32 - -const ( - ShutDownRequest_SOCKET_SHUT_RD ShutDownRequest_How = 1 - ShutDownRequest_SOCKET_SHUT_WR ShutDownRequest_How = 2 - ShutDownRequest_SOCKET_SHUT_RDWR ShutDownRequest_How = 3 -) - -var ShutDownRequest_How_name = map[int32]string{ - 1: "SOCKET_SHUT_RD", - 2: "SOCKET_SHUT_WR", - 3: "SOCKET_SHUT_RDWR", -} -var ShutDownRequest_How_value = map[string]int32{ - "SOCKET_SHUT_RD": 1, - "SOCKET_SHUT_WR": 2, - "SOCKET_SHUT_RDWR": 3, -} - -func (x ShutDownRequest_How) Enum() *ShutDownRequest_How { - p := new(ShutDownRequest_How) - *p = x - return p -} -func (x ShutDownRequest_How) String() string { - return proto.EnumName(ShutDownRequest_How_name, int32(x)) -} -func (x *ShutDownRequest_How) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(ShutDownRequest_How_value, data, "ShutDownRequest_How") - if err != nil { - return err - } - *x = ShutDownRequest_How(value) - return nil -} -func (ShutDownRequest_How) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{21, 0} -} - -type ReceiveRequest_Flags int32 - -const ( - ReceiveRequest_MSG_OOB ReceiveRequest_Flags = 1 - ReceiveRequest_MSG_PEEK ReceiveRequest_Flags = 2 -) - -var ReceiveRequest_Flags_name = map[int32]string{ - 1: "MSG_OOB", - 2: "MSG_PEEK", -} -var ReceiveRequest_Flags_value = map[string]int32{ - "MSG_OOB": 1, - "MSG_PEEK": 2, -} - -func (x ReceiveRequest_Flags) Enum() *ReceiveRequest_Flags { - p := new(ReceiveRequest_Flags) - *p = x - return p -} -func (x ReceiveRequest_Flags) String() string { - return proto.EnumName(ReceiveRequest_Flags_name, int32(x)) -} -func (x *ReceiveRequest_Flags) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(ReceiveRequest_Flags_value, data, "ReceiveRequest_Flags") - if err != nil { - return err - } - *x = ReceiveRequest_Flags(value) - return nil -} -func (ReceiveRequest_Flags) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{27, 0} -} - -type PollEvent_PollEventFlag int32 - -const ( - PollEvent_SOCKET_POLLNONE PollEvent_PollEventFlag = 0 - PollEvent_SOCKET_POLLIN PollEvent_PollEventFlag = 1 - PollEvent_SOCKET_POLLPRI PollEvent_PollEventFlag = 2 - PollEvent_SOCKET_POLLOUT PollEvent_PollEventFlag = 4 - PollEvent_SOCKET_POLLERR PollEvent_PollEventFlag = 8 - PollEvent_SOCKET_POLLHUP PollEvent_PollEventFlag = 16 - PollEvent_SOCKET_POLLNVAL PollEvent_PollEventFlag = 32 - PollEvent_SOCKET_POLLRDNORM PollEvent_PollEventFlag = 64 - PollEvent_SOCKET_POLLRDBAND PollEvent_PollEventFlag = 128 - PollEvent_SOCKET_POLLWRNORM PollEvent_PollEventFlag = 256 - PollEvent_SOCKET_POLLWRBAND PollEvent_PollEventFlag = 512 - PollEvent_SOCKET_POLLMSG PollEvent_PollEventFlag = 1024 - PollEvent_SOCKET_POLLREMOVE PollEvent_PollEventFlag = 4096 - PollEvent_SOCKET_POLLRDHUP PollEvent_PollEventFlag = 8192 -) - -var PollEvent_PollEventFlag_name = map[int32]string{ - 0: "SOCKET_POLLNONE", - 1: "SOCKET_POLLIN", - 2: "SOCKET_POLLPRI", - 4: "SOCKET_POLLOUT", - 8: "SOCKET_POLLERR", - 16: "SOCKET_POLLHUP", - 32: "SOCKET_POLLNVAL", - 64: "SOCKET_POLLRDNORM", - 128: "SOCKET_POLLRDBAND", - 256: "SOCKET_POLLWRNORM", - 512: "SOCKET_POLLWRBAND", - 1024: "SOCKET_POLLMSG", - 4096: "SOCKET_POLLREMOVE", - 8192: "SOCKET_POLLRDHUP", -} -var PollEvent_PollEventFlag_value = map[string]int32{ - "SOCKET_POLLNONE": 0, - "SOCKET_POLLIN": 1, - "SOCKET_POLLPRI": 2, - "SOCKET_POLLOUT": 4, - "SOCKET_POLLERR": 8, - "SOCKET_POLLHUP": 16, - "SOCKET_POLLNVAL": 32, - "SOCKET_POLLRDNORM": 64, - "SOCKET_POLLRDBAND": 128, - "SOCKET_POLLWRNORM": 256, - "SOCKET_POLLWRBAND": 512, - "SOCKET_POLLMSG": 1024, - "SOCKET_POLLREMOVE": 4096, - "SOCKET_POLLRDHUP": 8192, -} - -func (x PollEvent_PollEventFlag) Enum() *PollEvent_PollEventFlag { - p := new(PollEvent_PollEventFlag) - *p = x - return p -} -func (x PollEvent_PollEventFlag) String() string { - return proto.EnumName(PollEvent_PollEventFlag_name, int32(x)) -} -func (x *PollEvent_PollEventFlag) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(PollEvent_PollEventFlag_value, data, "PollEvent_PollEventFlag") - if err != nil { - return err - } - *x = PollEvent_PollEventFlag(value) - return nil -} -func (PollEvent_PollEventFlag) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{29, 0} -} - -type ResolveReply_ErrorCode int32 - -const ( - ResolveReply_SOCKET_EAI_ADDRFAMILY ResolveReply_ErrorCode = 1 - ResolveReply_SOCKET_EAI_AGAIN ResolveReply_ErrorCode = 2 - ResolveReply_SOCKET_EAI_BADFLAGS ResolveReply_ErrorCode = 3 - ResolveReply_SOCKET_EAI_FAIL ResolveReply_ErrorCode = 4 - ResolveReply_SOCKET_EAI_FAMILY ResolveReply_ErrorCode = 5 - ResolveReply_SOCKET_EAI_MEMORY ResolveReply_ErrorCode = 6 - ResolveReply_SOCKET_EAI_NODATA ResolveReply_ErrorCode = 7 - ResolveReply_SOCKET_EAI_NONAME ResolveReply_ErrorCode = 8 - ResolveReply_SOCKET_EAI_SERVICE ResolveReply_ErrorCode = 9 - ResolveReply_SOCKET_EAI_SOCKTYPE ResolveReply_ErrorCode = 10 - ResolveReply_SOCKET_EAI_SYSTEM ResolveReply_ErrorCode = 11 - ResolveReply_SOCKET_EAI_BADHINTS ResolveReply_ErrorCode = 12 - ResolveReply_SOCKET_EAI_PROTOCOL ResolveReply_ErrorCode = 13 - ResolveReply_SOCKET_EAI_OVERFLOW ResolveReply_ErrorCode = 14 - ResolveReply_SOCKET_EAI_MAX ResolveReply_ErrorCode = 15 -) - -var ResolveReply_ErrorCode_name = map[int32]string{ - 1: "SOCKET_EAI_ADDRFAMILY", - 2: "SOCKET_EAI_AGAIN", - 3: "SOCKET_EAI_BADFLAGS", - 4: "SOCKET_EAI_FAIL", - 5: "SOCKET_EAI_FAMILY", - 6: "SOCKET_EAI_MEMORY", - 7: "SOCKET_EAI_NODATA", - 8: "SOCKET_EAI_NONAME", - 9: "SOCKET_EAI_SERVICE", - 10: "SOCKET_EAI_SOCKTYPE", - 11: "SOCKET_EAI_SYSTEM", - 12: "SOCKET_EAI_BADHINTS", - 13: "SOCKET_EAI_PROTOCOL", - 14: "SOCKET_EAI_OVERFLOW", - 15: "SOCKET_EAI_MAX", -} -var ResolveReply_ErrorCode_value = map[string]int32{ - "SOCKET_EAI_ADDRFAMILY": 1, - "SOCKET_EAI_AGAIN": 2, - "SOCKET_EAI_BADFLAGS": 3, - "SOCKET_EAI_FAIL": 4, - "SOCKET_EAI_FAMILY": 5, - "SOCKET_EAI_MEMORY": 6, - "SOCKET_EAI_NODATA": 7, - "SOCKET_EAI_NONAME": 8, - "SOCKET_EAI_SERVICE": 9, - "SOCKET_EAI_SOCKTYPE": 10, - "SOCKET_EAI_SYSTEM": 11, - "SOCKET_EAI_BADHINTS": 12, - "SOCKET_EAI_PROTOCOL": 13, - "SOCKET_EAI_OVERFLOW": 14, - "SOCKET_EAI_MAX": 15, -} - -func (x ResolveReply_ErrorCode) Enum() *ResolveReply_ErrorCode { - p := new(ResolveReply_ErrorCode) - *p = x - return p -} -func (x ResolveReply_ErrorCode) String() string { - return proto.EnumName(ResolveReply_ErrorCode_name, int32(x)) -} -func (x *ResolveReply_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(ResolveReply_ErrorCode_value, data, "ResolveReply_ErrorCode") - if err != nil { - return err - } - *x = ResolveReply_ErrorCode(value) - return nil -} -func (ResolveReply_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{33, 0} -} - -type RemoteSocketServiceError struct { - SystemError *int32 `protobuf:"varint,1,opt,name=system_error,json=systemError,def=0" json:"system_error,omitempty"` - ErrorDetail *string `protobuf:"bytes,2,opt,name=error_detail,json=errorDetail" json:"error_detail,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RemoteSocketServiceError) Reset() { *m = RemoteSocketServiceError{} } -func (m *RemoteSocketServiceError) String() string { return proto.CompactTextString(m) } -func (*RemoteSocketServiceError) ProtoMessage() {} -func (*RemoteSocketServiceError) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{0} -} -func (m *RemoteSocketServiceError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RemoteSocketServiceError.Unmarshal(m, b) -} -func (m *RemoteSocketServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RemoteSocketServiceError.Marshal(b, m, deterministic) -} -func (dst *RemoteSocketServiceError) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoteSocketServiceError.Merge(dst, src) -} -func (m *RemoteSocketServiceError) XXX_Size() int { - return xxx_messageInfo_RemoteSocketServiceError.Size(m) -} -func (m *RemoteSocketServiceError) XXX_DiscardUnknown() { - xxx_messageInfo_RemoteSocketServiceError.DiscardUnknown(m) -} - -var xxx_messageInfo_RemoteSocketServiceError proto.InternalMessageInfo - -const Default_RemoteSocketServiceError_SystemError int32 = 0 - -func (m *RemoteSocketServiceError) GetSystemError() int32 { - if m != nil && m.SystemError != nil { - return *m.SystemError - } - return Default_RemoteSocketServiceError_SystemError -} - -func (m *RemoteSocketServiceError) GetErrorDetail() string { - if m != nil && m.ErrorDetail != nil { - return *m.ErrorDetail - } - return "" -} - -type AddressPort struct { - Port *int32 `protobuf:"varint,1,req,name=port" json:"port,omitempty"` - PackedAddress []byte `protobuf:"bytes,2,opt,name=packed_address,json=packedAddress" json:"packed_address,omitempty"` - HostnameHint *string `protobuf:"bytes,3,opt,name=hostname_hint,json=hostnameHint" json:"hostname_hint,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AddressPort) Reset() { *m = AddressPort{} } -func (m *AddressPort) String() string { return proto.CompactTextString(m) } -func (*AddressPort) ProtoMessage() {} -func (*AddressPort) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{1} -} -func (m *AddressPort) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AddressPort.Unmarshal(m, b) -} -func (m *AddressPort) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AddressPort.Marshal(b, m, deterministic) -} -func (dst *AddressPort) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddressPort.Merge(dst, src) -} -func (m *AddressPort) XXX_Size() int { - return xxx_messageInfo_AddressPort.Size(m) -} -func (m *AddressPort) XXX_DiscardUnknown() { - xxx_messageInfo_AddressPort.DiscardUnknown(m) -} - -var xxx_messageInfo_AddressPort proto.InternalMessageInfo - -func (m *AddressPort) GetPort() int32 { - if m != nil && m.Port != nil { - return *m.Port - } - return 0 -} - -func (m *AddressPort) GetPackedAddress() []byte { - if m != nil { - return m.PackedAddress - } - return nil -} - -func (m *AddressPort) GetHostnameHint() string { - if m != nil && m.HostnameHint != nil { - return *m.HostnameHint - } - return "" -} - -type CreateSocketRequest struct { - Family *CreateSocketRequest_SocketFamily `protobuf:"varint,1,req,name=family,enum=appengine.CreateSocketRequest_SocketFamily" json:"family,omitempty"` - Protocol *CreateSocketRequest_SocketProtocol `protobuf:"varint,2,req,name=protocol,enum=appengine.CreateSocketRequest_SocketProtocol" json:"protocol,omitempty"` - SocketOptions []*SocketOption `protobuf:"bytes,3,rep,name=socket_options,json=socketOptions" json:"socket_options,omitempty"` - ProxyExternalIp *AddressPort `protobuf:"bytes,4,opt,name=proxy_external_ip,json=proxyExternalIp" json:"proxy_external_ip,omitempty"` - ListenBacklog *int32 `protobuf:"varint,5,opt,name=listen_backlog,json=listenBacklog,def=0" json:"listen_backlog,omitempty"` - RemoteIp *AddressPort `protobuf:"bytes,6,opt,name=remote_ip,json=remoteIp" json:"remote_ip,omitempty"` - AppId *string `protobuf:"bytes,9,opt,name=app_id,json=appId" json:"app_id,omitempty"` - ProjectId *int64 `protobuf:"varint,10,opt,name=project_id,json=projectId" json:"project_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateSocketRequest) Reset() { *m = CreateSocketRequest{} } -func (m *CreateSocketRequest) String() string { return proto.CompactTextString(m) } -func (*CreateSocketRequest) ProtoMessage() {} -func (*CreateSocketRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{2} -} -func (m *CreateSocketRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateSocketRequest.Unmarshal(m, b) -} -func (m *CreateSocketRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateSocketRequest.Marshal(b, m, deterministic) -} -func (dst *CreateSocketRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateSocketRequest.Merge(dst, src) -} -func (m *CreateSocketRequest) XXX_Size() int { - return xxx_messageInfo_CreateSocketRequest.Size(m) -} -func (m *CreateSocketRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateSocketRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateSocketRequest proto.InternalMessageInfo - -const Default_CreateSocketRequest_ListenBacklog int32 = 0 - -func (m *CreateSocketRequest) GetFamily() CreateSocketRequest_SocketFamily { - if m != nil && m.Family != nil { - return *m.Family - } - return CreateSocketRequest_IPv4 -} - -func (m *CreateSocketRequest) GetProtocol() CreateSocketRequest_SocketProtocol { - if m != nil && m.Protocol != nil { - return *m.Protocol - } - return CreateSocketRequest_TCP -} - -func (m *CreateSocketRequest) GetSocketOptions() []*SocketOption { - if m != nil { - return m.SocketOptions - } - return nil -} - -func (m *CreateSocketRequest) GetProxyExternalIp() *AddressPort { - if m != nil { - return m.ProxyExternalIp - } - return nil -} - -func (m *CreateSocketRequest) GetListenBacklog() int32 { - if m != nil && m.ListenBacklog != nil { - return *m.ListenBacklog - } - return Default_CreateSocketRequest_ListenBacklog -} - -func (m *CreateSocketRequest) GetRemoteIp() *AddressPort { - if m != nil { - return m.RemoteIp - } - return nil -} - -func (m *CreateSocketRequest) GetAppId() string { - if m != nil && m.AppId != nil { - return *m.AppId - } - return "" -} - -func (m *CreateSocketRequest) GetProjectId() int64 { - if m != nil && m.ProjectId != nil { - return *m.ProjectId - } - return 0 -} - -type CreateSocketReply struct { - SocketDescriptor *string `protobuf:"bytes,1,opt,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - ServerAddress *AddressPort `protobuf:"bytes,3,opt,name=server_address,json=serverAddress" json:"server_address,omitempty"` - ProxyExternalIp *AddressPort `protobuf:"bytes,4,opt,name=proxy_external_ip,json=proxyExternalIp" json:"proxy_external_ip,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - proto.XXX_InternalExtensions `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateSocketReply) Reset() { *m = CreateSocketReply{} } -func (m *CreateSocketReply) String() string { return proto.CompactTextString(m) } -func (*CreateSocketReply) ProtoMessage() {} -func (*CreateSocketReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{3} -} - -var extRange_CreateSocketReply = []proto.ExtensionRange{ - {Start: 1000, End: 536870911}, -} - -func (*CreateSocketReply) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_CreateSocketReply -} -func (m *CreateSocketReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateSocketReply.Unmarshal(m, b) -} -func (m *CreateSocketReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateSocketReply.Marshal(b, m, deterministic) -} -func (dst *CreateSocketReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateSocketReply.Merge(dst, src) -} -func (m *CreateSocketReply) XXX_Size() int { - return xxx_messageInfo_CreateSocketReply.Size(m) -} -func (m *CreateSocketReply) XXX_DiscardUnknown() { - xxx_messageInfo_CreateSocketReply.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateSocketReply proto.InternalMessageInfo - -func (m *CreateSocketReply) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *CreateSocketReply) GetServerAddress() *AddressPort { - if m != nil { - return m.ServerAddress - } - return nil -} - -func (m *CreateSocketReply) GetProxyExternalIp() *AddressPort { - if m != nil { - return m.ProxyExternalIp - } - return nil -} - -type BindRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - ProxyExternalIp *AddressPort `protobuf:"bytes,2,req,name=proxy_external_ip,json=proxyExternalIp" json:"proxy_external_ip,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BindRequest) Reset() { *m = BindRequest{} } -func (m *BindRequest) String() string { return proto.CompactTextString(m) } -func (*BindRequest) ProtoMessage() {} -func (*BindRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{4} -} -func (m *BindRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BindRequest.Unmarshal(m, b) -} -func (m *BindRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BindRequest.Marshal(b, m, deterministic) -} -func (dst *BindRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_BindRequest.Merge(dst, src) -} -func (m *BindRequest) XXX_Size() int { - return xxx_messageInfo_BindRequest.Size(m) -} -func (m *BindRequest) XXX_DiscardUnknown() { - xxx_messageInfo_BindRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_BindRequest proto.InternalMessageInfo - -func (m *BindRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *BindRequest) GetProxyExternalIp() *AddressPort { - if m != nil { - return m.ProxyExternalIp - } - return nil -} - -type BindReply struct { - ProxyExternalIp *AddressPort `protobuf:"bytes,1,opt,name=proxy_external_ip,json=proxyExternalIp" json:"proxy_external_ip,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BindReply) Reset() { *m = BindReply{} } -func (m *BindReply) String() string { return proto.CompactTextString(m) } -func (*BindReply) ProtoMessage() {} -func (*BindReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{5} -} -func (m *BindReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BindReply.Unmarshal(m, b) -} -func (m *BindReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BindReply.Marshal(b, m, deterministic) -} -func (dst *BindReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_BindReply.Merge(dst, src) -} -func (m *BindReply) XXX_Size() int { - return xxx_messageInfo_BindReply.Size(m) -} -func (m *BindReply) XXX_DiscardUnknown() { - xxx_messageInfo_BindReply.DiscardUnknown(m) -} - -var xxx_messageInfo_BindReply proto.InternalMessageInfo - -func (m *BindReply) GetProxyExternalIp() *AddressPort { - if m != nil { - return m.ProxyExternalIp - } - return nil -} - -type GetSocketNameRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetSocketNameRequest) Reset() { *m = GetSocketNameRequest{} } -func (m *GetSocketNameRequest) String() string { return proto.CompactTextString(m) } -func (*GetSocketNameRequest) ProtoMessage() {} -func (*GetSocketNameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{6} -} -func (m *GetSocketNameRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetSocketNameRequest.Unmarshal(m, b) -} -func (m *GetSocketNameRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetSocketNameRequest.Marshal(b, m, deterministic) -} -func (dst *GetSocketNameRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetSocketNameRequest.Merge(dst, src) -} -func (m *GetSocketNameRequest) XXX_Size() int { - return xxx_messageInfo_GetSocketNameRequest.Size(m) -} -func (m *GetSocketNameRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetSocketNameRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetSocketNameRequest proto.InternalMessageInfo - -func (m *GetSocketNameRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -type GetSocketNameReply struct { - ProxyExternalIp *AddressPort `protobuf:"bytes,2,opt,name=proxy_external_ip,json=proxyExternalIp" json:"proxy_external_ip,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetSocketNameReply) Reset() { *m = GetSocketNameReply{} } -func (m *GetSocketNameReply) String() string { return proto.CompactTextString(m) } -func (*GetSocketNameReply) ProtoMessage() {} -func (*GetSocketNameReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{7} -} -func (m *GetSocketNameReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetSocketNameReply.Unmarshal(m, b) -} -func (m *GetSocketNameReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetSocketNameReply.Marshal(b, m, deterministic) -} -func (dst *GetSocketNameReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetSocketNameReply.Merge(dst, src) -} -func (m *GetSocketNameReply) XXX_Size() int { - return xxx_messageInfo_GetSocketNameReply.Size(m) -} -func (m *GetSocketNameReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetSocketNameReply.DiscardUnknown(m) -} - -var xxx_messageInfo_GetSocketNameReply proto.InternalMessageInfo - -func (m *GetSocketNameReply) GetProxyExternalIp() *AddressPort { - if m != nil { - return m.ProxyExternalIp - } - return nil -} - -type GetPeerNameRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetPeerNameRequest) Reset() { *m = GetPeerNameRequest{} } -func (m *GetPeerNameRequest) String() string { return proto.CompactTextString(m) } -func (*GetPeerNameRequest) ProtoMessage() {} -func (*GetPeerNameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{8} -} -func (m *GetPeerNameRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetPeerNameRequest.Unmarshal(m, b) -} -func (m *GetPeerNameRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetPeerNameRequest.Marshal(b, m, deterministic) -} -func (dst *GetPeerNameRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetPeerNameRequest.Merge(dst, src) -} -func (m *GetPeerNameRequest) XXX_Size() int { - return xxx_messageInfo_GetPeerNameRequest.Size(m) -} -func (m *GetPeerNameRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetPeerNameRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetPeerNameRequest proto.InternalMessageInfo - -func (m *GetPeerNameRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -type GetPeerNameReply struct { - PeerIp *AddressPort `protobuf:"bytes,2,opt,name=peer_ip,json=peerIp" json:"peer_ip,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetPeerNameReply) Reset() { *m = GetPeerNameReply{} } -func (m *GetPeerNameReply) String() string { return proto.CompactTextString(m) } -func (*GetPeerNameReply) ProtoMessage() {} -func (*GetPeerNameReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{9} -} -func (m *GetPeerNameReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetPeerNameReply.Unmarshal(m, b) -} -func (m *GetPeerNameReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetPeerNameReply.Marshal(b, m, deterministic) -} -func (dst *GetPeerNameReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetPeerNameReply.Merge(dst, src) -} -func (m *GetPeerNameReply) XXX_Size() int { - return xxx_messageInfo_GetPeerNameReply.Size(m) -} -func (m *GetPeerNameReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetPeerNameReply.DiscardUnknown(m) -} - -var xxx_messageInfo_GetPeerNameReply proto.InternalMessageInfo - -func (m *GetPeerNameReply) GetPeerIp() *AddressPort { - if m != nil { - return m.PeerIp - } - return nil -} - -type SocketOption struct { - Level *SocketOption_SocketOptionLevel `protobuf:"varint,1,req,name=level,enum=appengine.SocketOption_SocketOptionLevel" json:"level,omitempty"` - Option *SocketOption_SocketOptionName `protobuf:"varint,2,req,name=option,enum=appengine.SocketOption_SocketOptionName" json:"option,omitempty"` - Value []byte `protobuf:"bytes,3,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SocketOption) Reset() { *m = SocketOption{} } -func (m *SocketOption) String() string { return proto.CompactTextString(m) } -func (*SocketOption) ProtoMessage() {} -func (*SocketOption) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{10} -} -func (m *SocketOption) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SocketOption.Unmarshal(m, b) -} -func (m *SocketOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SocketOption.Marshal(b, m, deterministic) -} -func (dst *SocketOption) XXX_Merge(src proto.Message) { - xxx_messageInfo_SocketOption.Merge(dst, src) -} -func (m *SocketOption) XXX_Size() int { - return xxx_messageInfo_SocketOption.Size(m) -} -func (m *SocketOption) XXX_DiscardUnknown() { - xxx_messageInfo_SocketOption.DiscardUnknown(m) -} - -var xxx_messageInfo_SocketOption proto.InternalMessageInfo - -func (m *SocketOption) GetLevel() SocketOption_SocketOptionLevel { - if m != nil && m.Level != nil { - return *m.Level - } - return SocketOption_SOCKET_SOL_IP -} - -func (m *SocketOption) GetOption() SocketOption_SocketOptionName { - if m != nil && m.Option != nil { - return *m.Option - } - return SocketOption_SOCKET_SO_DEBUG -} - -func (m *SocketOption) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -type SetSocketOptionsRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - Options []*SocketOption `protobuf:"bytes,2,rep,name=options" json:"options,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetSocketOptionsRequest) Reset() { *m = SetSocketOptionsRequest{} } -func (m *SetSocketOptionsRequest) String() string { return proto.CompactTextString(m) } -func (*SetSocketOptionsRequest) ProtoMessage() {} -func (*SetSocketOptionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{11} -} -func (m *SetSocketOptionsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetSocketOptionsRequest.Unmarshal(m, b) -} -func (m *SetSocketOptionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetSocketOptionsRequest.Marshal(b, m, deterministic) -} -func (dst *SetSocketOptionsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetSocketOptionsRequest.Merge(dst, src) -} -func (m *SetSocketOptionsRequest) XXX_Size() int { - return xxx_messageInfo_SetSocketOptionsRequest.Size(m) -} -func (m *SetSocketOptionsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetSocketOptionsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetSocketOptionsRequest proto.InternalMessageInfo - -func (m *SetSocketOptionsRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *SetSocketOptionsRequest) GetOptions() []*SocketOption { - if m != nil { - return m.Options - } - return nil -} - -type SetSocketOptionsReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetSocketOptionsReply) Reset() { *m = SetSocketOptionsReply{} } -func (m *SetSocketOptionsReply) String() string { return proto.CompactTextString(m) } -func (*SetSocketOptionsReply) ProtoMessage() {} -func (*SetSocketOptionsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{12} -} -func (m *SetSocketOptionsReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetSocketOptionsReply.Unmarshal(m, b) -} -func (m *SetSocketOptionsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetSocketOptionsReply.Marshal(b, m, deterministic) -} -func (dst *SetSocketOptionsReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetSocketOptionsReply.Merge(dst, src) -} -func (m *SetSocketOptionsReply) XXX_Size() int { - return xxx_messageInfo_SetSocketOptionsReply.Size(m) -} -func (m *SetSocketOptionsReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetSocketOptionsReply.DiscardUnknown(m) -} - -var xxx_messageInfo_SetSocketOptionsReply proto.InternalMessageInfo - -type GetSocketOptionsRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - Options []*SocketOption `protobuf:"bytes,2,rep,name=options" json:"options,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetSocketOptionsRequest) Reset() { *m = GetSocketOptionsRequest{} } -func (m *GetSocketOptionsRequest) String() string { return proto.CompactTextString(m) } -func (*GetSocketOptionsRequest) ProtoMessage() {} -func (*GetSocketOptionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{13} -} -func (m *GetSocketOptionsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetSocketOptionsRequest.Unmarshal(m, b) -} -func (m *GetSocketOptionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetSocketOptionsRequest.Marshal(b, m, deterministic) -} -func (dst *GetSocketOptionsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetSocketOptionsRequest.Merge(dst, src) -} -func (m *GetSocketOptionsRequest) XXX_Size() int { - return xxx_messageInfo_GetSocketOptionsRequest.Size(m) -} -func (m *GetSocketOptionsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetSocketOptionsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetSocketOptionsRequest proto.InternalMessageInfo - -func (m *GetSocketOptionsRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *GetSocketOptionsRequest) GetOptions() []*SocketOption { - if m != nil { - return m.Options - } - return nil -} - -type GetSocketOptionsReply struct { - Options []*SocketOption `protobuf:"bytes,2,rep,name=options" json:"options,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetSocketOptionsReply) Reset() { *m = GetSocketOptionsReply{} } -func (m *GetSocketOptionsReply) String() string { return proto.CompactTextString(m) } -func (*GetSocketOptionsReply) ProtoMessage() {} -func (*GetSocketOptionsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{14} -} -func (m *GetSocketOptionsReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetSocketOptionsReply.Unmarshal(m, b) -} -func (m *GetSocketOptionsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetSocketOptionsReply.Marshal(b, m, deterministic) -} -func (dst *GetSocketOptionsReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetSocketOptionsReply.Merge(dst, src) -} -func (m *GetSocketOptionsReply) XXX_Size() int { - return xxx_messageInfo_GetSocketOptionsReply.Size(m) -} -func (m *GetSocketOptionsReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetSocketOptionsReply.DiscardUnknown(m) -} - -var xxx_messageInfo_GetSocketOptionsReply proto.InternalMessageInfo - -func (m *GetSocketOptionsReply) GetOptions() []*SocketOption { - if m != nil { - return m.Options - } - return nil -} - -type ConnectRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - RemoteIp *AddressPort `protobuf:"bytes,2,req,name=remote_ip,json=remoteIp" json:"remote_ip,omitempty"` - TimeoutSeconds *float64 `protobuf:"fixed64,3,opt,name=timeout_seconds,json=timeoutSeconds,def=-1" json:"timeout_seconds,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ConnectRequest) Reset() { *m = ConnectRequest{} } -func (m *ConnectRequest) String() string { return proto.CompactTextString(m) } -func (*ConnectRequest) ProtoMessage() {} -func (*ConnectRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{15} -} -func (m *ConnectRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ConnectRequest.Unmarshal(m, b) -} -func (m *ConnectRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ConnectRequest.Marshal(b, m, deterministic) -} -func (dst *ConnectRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConnectRequest.Merge(dst, src) -} -func (m *ConnectRequest) XXX_Size() int { - return xxx_messageInfo_ConnectRequest.Size(m) -} -func (m *ConnectRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ConnectRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ConnectRequest proto.InternalMessageInfo - -const Default_ConnectRequest_TimeoutSeconds float64 = -1 - -func (m *ConnectRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *ConnectRequest) GetRemoteIp() *AddressPort { - if m != nil { - return m.RemoteIp - } - return nil -} - -func (m *ConnectRequest) GetTimeoutSeconds() float64 { - if m != nil && m.TimeoutSeconds != nil { - return *m.TimeoutSeconds - } - return Default_ConnectRequest_TimeoutSeconds -} - -type ConnectReply struct { - ProxyExternalIp *AddressPort `protobuf:"bytes,1,opt,name=proxy_external_ip,json=proxyExternalIp" json:"proxy_external_ip,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - proto.XXX_InternalExtensions `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ConnectReply) Reset() { *m = ConnectReply{} } -func (m *ConnectReply) String() string { return proto.CompactTextString(m) } -func (*ConnectReply) ProtoMessage() {} -func (*ConnectReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{16} -} - -var extRange_ConnectReply = []proto.ExtensionRange{ - {Start: 1000, End: 536870911}, -} - -func (*ConnectReply) ExtensionRangeArray() []proto.ExtensionRange { - return extRange_ConnectReply -} -func (m *ConnectReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ConnectReply.Unmarshal(m, b) -} -func (m *ConnectReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ConnectReply.Marshal(b, m, deterministic) -} -func (dst *ConnectReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConnectReply.Merge(dst, src) -} -func (m *ConnectReply) XXX_Size() int { - return xxx_messageInfo_ConnectReply.Size(m) -} -func (m *ConnectReply) XXX_DiscardUnknown() { - xxx_messageInfo_ConnectReply.DiscardUnknown(m) -} - -var xxx_messageInfo_ConnectReply proto.InternalMessageInfo - -func (m *ConnectReply) GetProxyExternalIp() *AddressPort { - if m != nil { - return m.ProxyExternalIp - } - return nil -} - -type ListenRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - Backlog *int32 `protobuf:"varint,2,req,name=backlog" json:"backlog,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListenRequest) Reset() { *m = ListenRequest{} } -func (m *ListenRequest) String() string { return proto.CompactTextString(m) } -func (*ListenRequest) ProtoMessage() {} -func (*ListenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{17} -} -func (m *ListenRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListenRequest.Unmarshal(m, b) -} -func (m *ListenRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListenRequest.Marshal(b, m, deterministic) -} -func (dst *ListenRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListenRequest.Merge(dst, src) -} -func (m *ListenRequest) XXX_Size() int { - return xxx_messageInfo_ListenRequest.Size(m) -} -func (m *ListenRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListenRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListenRequest proto.InternalMessageInfo - -func (m *ListenRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *ListenRequest) GetBacklog() int32 { - if m != nil && m.Backlog != nil { - return *m.Backlog - } - return 0 -} - -type ListenReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListenReply) Reset() { *m = ListenReply{} } -func (m *ListenReply) String() string { return proto.CompactTextString(m) } -func (*ListenReply) ProtoMessage() {} -func (*ListenReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{18} -} -func (m *ListenReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListenReply.Unmarshal(m, b) -} -func (m *ListenReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListenReply.Marshal(b, m, deterministic) -} -func (dst *ListenReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListenReply.Merge(dst, src) -} -func (m *ListenReply) XXX_Size() int { - return xxx_messageInfo_ListenReply.Size(m) -} -func (m *ListenReply) XXX_DiscardUnknown() { - xxx_messageInfo_ListenReply.DiscardUnknown(m) -} - -var xxx_messageInfo_ListenReply proto.InternalMessageInfo - -type AcceptRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - TimeoutSeconds *float64 `protobuf:"fixed64,2,opt,name=timeout_seconds,json=timeoutSeconds,def=-1" json:"timeout_seconds,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AcceptRequest) Reset() { *m = AcceptRequest{} } -func (m *AcceptRequest) String() string { return proto.CompactTextString(m) } -func (*AcceptRequest) ProtoMessage() {} -func (*AcceptRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{19} -} -func (m *AcceptRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AcceptRequest.Unmarshal(m, b) -} -func (m *AcceptRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AcceptRequest.Marshal(b, m, deterministic) -} -func (dst *AcceptRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AcceptRequest.Merge(dst, src) -} -func (m *AcceptRequest) XXX_Size() int { - return xxx_messageInfo_AcceptRequest.Size(m) -} -func (m *AcceptRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AcceptRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_AcceptRequest proto.InternalMessageInfo - -const Default_AcceptRequest_TimeoutSeconds float64 = -1 - -func (m *AcceptRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *AcceptRequest) GetTimeoutSeconds() float64 { - if m != nil && m.TimeoutSeconds != nil { - return *m.TimeoutSeconds - } - return Default_AcceptRequest_TimeoutSeconds -} - -type AcceptReply struct { - NewSocketDescriptor []byte `protobuf:"bytes,2,opt,name=new_socket_descriptor,json=newSocketDescriptor" json:"new_socket_descriptor,omitempty"` - RemoteAddress *AddressPort `protobuf:"bytes,3,opt,name=remote_address,json=remoteAddress" json:"remote_address,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AcceptReply) Reset() { *m = AcceptReply{} } -func (m *AcceptReply) String() string { return proto.CompactTextString(m) } -func (*AcceptReply) ProtoMessage() {} -func (*AcceptReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{20} -} -func (m *AcceptReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AcceptReply.Unmarshal(m, b) -} -func (m *AcceptReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AcceptReply.Marshal(b, m, deterministic) -} -func (dst *AcceptReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_AcceptReply.Merge(dst, src) -} -func (m *AcceptReply) XXX_Size() int { - return xxx_messageInfo_AcceptReply.Size(m) -} -func (m *AcceptReply) XXX_DiscardUnknown() { - xxx_messageInfo_AcceptReply.DiscardUnknown(m) -} - -var xxx_messageInfo_AcceptReply proto.InternalMessageInfo - -func (m *AcceptReply) GetNewSocketDescriptor() []byte { - if m != nil { - return m.NewSocketDescriptor - } - return nil -} - -func (m *AcceptReply) GetRemoteAddress() *AddressPort { - if m != nil { - return m.RemoteAddress - } - return nil -} - -type ShutDownRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - How *ShutDownRequest_How `protobuf:"varint,2,req,name=how,enum=appengine.ShutDownRequest_How" json:"how,omitempty"` - SendOffset *int64 `protobuf:"varint,3,req,name=send_offset,json=sendOffset" json:"send_offset,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ShutDownRequest) Reset() { *m = ShutDownRequest{} } -func (m *ShutDownRequest) String() string { return proto.CompactTextString(m) } -func (*ShutDownRequest) ProtoMessage() {} -func (*ShutDownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{21} -} -func (m *ShutDownRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ShutDownRequest.Unmarshal(m, b) -} -func (m *ShutDownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ShutDownRequest.Marshal(b, m, deterministic) -} -func (dst *ShutDownRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShutDownRequest.Merge(dst, src) -} -func (m *ShutDownRequest) XXX_Size() int { - return xxx_messageInfo_ShutDownRequest.Size(m) -} -func (m *ShutDownRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ShutDownRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ShutDownRequest proto.InternalMessageInfo - -func (m *ShutDownRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *ShutDownRequest) GetHow() ShutDownRequest_How { - if m != nil && m.How != nil { - return *m.How - } - return ShutDownRequest_SOCKET_SHUT_RD -} - -func (m *ShutDownRequest) GetSendOffset() int64 { - if m != nil && m.SendOffset != nil { - return *m.SendOffset - } - return 0 -} - -type ShutDownReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ShutDownReply) Reset() { *m = ShutDownReply{} } -func (m *ShutDownReply) String() string { return proto.CompactTextString(m) } -func (*ShutDownReply) ProtoMessage() {} -func (*ShutDownReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{22} -} -func (m *ShutDownReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ShutDownReply.Unmarshal(m, b) -} -func (m *ShutDownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ShutDownReply.Marshal(b, m, deterministic) -} -func (dst *ShutDownReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShutDownReply.Merge(dst, src) -} -func (m *ShutDownReply) XXX_Size() int { - return xxx_messageInfo_ShutDownReply.Size(m) -} -func (m *ShutDownReply) XXX_DiscardUnknown() { - xxx_messageInfo_ShutDownReply.DiscardUnknown(m) -} - -var xxx_messageInfo_ShutDownReply proto.InternalMessageInfo - -type CloseRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - SendOffset *int64 `protobuf:"varint,2,opt,name=send_offset,json=sendOffset,def=-1" json:"send_offset,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CloseRequest) Reset() { *m = CloseRequest{} } -func (m *CloseRequest) String() string { return proto.CompactTextString(m) } -func (*CloseRequest) ProtoMessage() {} -func (*CloseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{23} -} -func (m *CloseRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CloseRequest.Unmarshal(m, b) -} -func (m *CloseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CloseRequest.Marshal(b, m, deterministic) -} -func (dst *CloseRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CloseRequest.Merge(dst, src) -} -func (m *CloseRequest) XXX_Size() int { - return xxx_messageInfo_CloseRequest.Size(m) -} -func (m *CloseRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CloseRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CloseRequest proto.InternalMessageInfo - -const Default_CloseRequest_SendOffset int64 = -1 - -func (m *CloseRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *CloseRequest) GetSendOffset() int64 { - if m != nil && m.SendOffset != nil { - return *m.SendOffset - } - return Default_CloseRequest_SendOffset -} - -type CloseReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CloseReply) Reset() { *m = CloseReply{} } -func (m *CloseReply) String() string { return proto.CompactTextString(m) } -func (*CloseReply) ProtoMessage() {} -func (*CloseReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{24} -} -func (m *CloseReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CloseReply.Unmarshal(m, b) -} -func (m *CloseReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CloseReply.Marshal(b, m, deterministic) -} -func (dst *CloseReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_CloseReply.Merge(dst, src) -} -func (m *CloseReply) XXX_Size() int { - return xxx_messageInfo_CloseReply.Size(m) -} -func (m *CloseReply) XXX_DiscardUnknown() { - xxx_messageInfo_CloseReply.DiscardUnknown(m) -} - -var xxx_messageInfo_CloseReply proto.InternalMessageInfo - -type SendRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - Data []byte `protobuf:"bytes,2,req,name=data" json:"data,omitempty"` - StreamOffset *int64 `protobuf:"varint,3,req,name=stream_offset,json=streamOffset" json:"stream_offset,omitempty"` - Flags *int32 `protobuf:"varint,4,opt,name=flags,def=0" json:"flags,omitempty"` - SendTo *AddressPort `protobuf:"bytes,5,opt,name=send_to,json=sendTo" json:"send_to,omitempty"` - TimeoutSeconds *float64 `protobuf:"fixed64,6,opt,name=timeout_seconds,json=timeoutSeconds,def=-1" json:"timeout_seconds,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SendRequest) Reset() { *m = SendRequest{} } -func (m *SendRequest) String() string { return proto.CompactTextString(m) } -func (*SendRequest) ProtoMessage() {} -func (*SendRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{25} -} -func (m *SendRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SendRequest.Unmarshal(m, b) -} -func (m *SendRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SendRequest.Marshal(b, m, deterministic) -} -func (dst *SendRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SendRequest.Merge(dst, src) -} -func (m *SendRequest) XXX_Size() int { - return xxx_messageInfo_SendRequest.Size(m) -} -func (m *SendRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SendRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SendRequest proto.InternalMessageInfo - -const Default_SendRequest_Flags int32 = 0 -const Default_SendRequest_TimeoutSeconds float64 = -1 - -func (m *SendRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *SendRequest) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -func (m *SendRequest) GetStreamOffset() int64 { - if m != nil && m.StreamOffset != nil { - return *m.StreamOffset - } - return 0 -} - -func (m *SendRequest) GetFlags() int32 { - if m != nil && m.Flags != nil { - return *m.Flags - } - return Default_SendRequest_Flags -} - -func (m *SendRequest) GetSendTo() *AddressPort { - if m != nil { - return m.SendTo - } - return nil -} - -func (m *SendRequest) GetTimeoutSeconds() float64 { - if m != nil && m.TimeoutSeconds != nil { - return *m.TimeoutSeconds - } - return Default_SendRequest_TimeoutSeconds -} - -type SendReply struct { - DataSent *int32 `protobuf:"varint,1,opt,name=data_sent,json=dataSent" json:"data_sent,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SendReply) Reset() { *m = SendReply{} } -func (m *SendReply) String() string { return proto.CompactTextString(m) } -func (*SendReply) ProtoMessage() {} -func (*SendReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{26} -} -func (m *SendReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SendReply.Unmarshal(m, b) -} -func (m *SendReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SendReply.Marshal(b, m, deterministic) -} -func (dst *SendReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SendReply.Merge(dst, src) -} -func (m *SendReply) XXX_Size() int { - return xxx_messageInfo_SendReply.Size(m) -} -func (m *SendReply) XXX_DiscardUnknown() { - xxx_messageInfo_SendReply.DiscardUnknown(m) -} - -var xxx_messageInfo_SendReply proto.InternalMessageInfo - -func (m *SendReply) GetDataSent() int32 { - if m != nil && m.DataSent != nil { - return *m.DataSent - } - return 0 -} - -type ReceiveRequest struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - DataSize *int32 `protobuf:"varint,2,req,name=data_size,json=dataSize" json:"data_size,omitempty"` - Flags *int32 `protobuf:"varint,3,opt,name=flags,def=0" json:"flags,omitempty"` - TimeoutSeconds *float64 `protobuf:"fixed64,5,opt,name=timeout_seconds,json=timeoutSeconds,def=-1" json:"timeout_seconds,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ReceiveRequest) Reset() { *m = ReceiveRequest{} } -func (m *ReceiveRequest) String() string { return proto.CompactTextString(m) } -func (*ReceiveRequest) ProtoMessage() {} -func (*ReceiveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{27} -} -func (m *ReceiveRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ReceiveRequest.Unmarshal(m, b) -} -func (m *ReceiveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ReceiveRequest.Marshal(b, m, deterministic) -} -func (dst *ReceiveRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ReceiveRequest.Merge(dst, src) -} -func (m *ReceiveRequest) XXX_Size() int { - return xxx_messageInfo_ReceiveRequest.Size(m) -} -func (m *ReceiveRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ReceiveRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ReceiveRequest proto.InternalMessageInfo - -const Default_ReceiveRequest_Flags int32 = 0 -const Default_ReceiveRequest_TimeoutSeconds float64 = -1 - -func (m *ReceiveRequest) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *ReceiveRequest) GetDataSize() int32 { - if m != nil && m.DataSize != nil { - return *m.DataSize - } - return 0 -} - -func (m *ReceiveRequest) GetFlags() int32 { - if m != nil && m.Flags != nil { - return *m.Flags - } - return Default_ReceiveRequest_Flags -} - -func (m *ReceiveRequest) GetTimeoutSeconds() float64 { - if m != nil && m.TimeoutSeconds != nil { - return *m.TimeoutSeconds - } - return Default_ReceiveRequest_TimeoutSeconds -} - -type ReceiveReply struct { - StreamOffset *int64 `protobuf:"varint,2,opt,name=stream_offset,json=streamOffset" json:"stream_offset,omitempty"` - Data []byte `protobuf:"bytes,3,opt,name=data" json:"data,omitempty"` - ReceivedFrom *AddressPort `protobuf:"bytes,4,opt,name=received_from,json=receivedFrom" json:"received_from,omitempty"` - BufferSize *int32 `protobuf:"varint,5,opt,name=buffer_size,json=bufferSize" json:"buffer_size,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ReceiveReply) Reset() { *m = ReceiveReply{} } -func (m *ReceiveReply) String() string { return proto.CompactTextString(m) } -func (*ReceiveReply) ProtoMessage() {} -func (*ReceiveReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{28} -} -func (m *ReceiveReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ReceiveReply.Unmarshal(m, b) -} -func (m *ReceiveReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ReceiveReply.Marshal(b, m, deterministic) -} -func (dst *ReceiveReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ReceiveReply.Merge(dst, src) -} -func (m *ReceiveReply) XXX_Size() int { - return xxx_messageInfo_ReceiveReply.Size(m) -} -func (m *ReceiveReply) XXX_DiscardUnknown() { - xxx_messageInfo_ReceiveReply.DiscardUnknown(m) -} - -var xxx_messageInfo_ReceiveReply proto.InternalMessageInfo - -func (m *ReceiveReply) GetStreamOffset() int64 { - if m != nil && m.StreamOffset != nil { - return *m.StreamOffset - } - return 0 -} - -func (m *ReceiveReply) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -func (m *ReceiveReply) GetReceivedFrom() *AddressPort { - if m != nil { - return m.ReceivedFrom - } - return nil -} - -func (m *ReceiveReply) GetBufferSize() int32 { - if m != nil && m.BufferSize != nil { - return *m.BufferSize - } - return 0 -} - -type PollEvent struct { - SocketDescriptor *string `protobuf:"bytes,1,req,name=socket_descriptor,json=socketDescriptor" json:"socket_descriptor,omitempty"` - RequestedEvents *int32 `protobuf:"varint,2,req,name=requested_events,json=requestedEvents" json:"requested_events,omitempty"` - ObservedEvents *int32 `protobuf:"varint,3,req,name=observed_events,json=observedEvents" json:"observed_events,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PollEvent) Reset() { *m = PollEvent{} } -func (m *PollEvent) String() string { return proto.CompactTextString(m) } -func (*PollEvent) ProtoMessage() {} -func (*PollEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{29} -} -func (m *PollEvent) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PollEvent.Unmarshal(m, b) -} -func (m *PollEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PollEvent.Marshal(b, m, deterministic) -} -func (dst *PollEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_PollEvent.Merge(dst, src) -} -func (m *PollEvent) XXX_Size() int { - return xxx_messageInfo_PollEvent.Size(m) -} -func (m *PollEvent) XXX_DiscardUnknown() { - xxx_messageInfo_PollEvent.DiscardUnknown(m) -} - -var xxx_messageInfo_PollEvent proto.InternalMessageInfo - -func (m *PollEvent) GetSocketDescriptor() string { - if m != nil && m.SocketDescriptor != nil { - return *m.SocketDescriptor - } - return "" -} - -func (m *PollEvent) GetRequestedEvents() int32 { - if m != nil && m.RequestedEvents != nil { - return *m.RequestedEvents - } - return 0 -} - -func (m *PollEvent) GetObservedEvents() int32 { - if m != nil && m.ObservedEvents != nil { - return *m.ObservedEvents - } - return 0 -} - -type PollRequest struct { - Events []*PollEvent `protobuf:"bytes,1,rep,name=events" json:"events,omitempty"` - TimeoutSeconds *float64 `protobuf:"fixed64,2,opt,name=timeout_seconds,json=timeoutSeconds,def=-1" json:"timeout_seconds,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PollRequest) Reset() { *m = PollRequest{} } -func (m *PollRequest) String() string { return proto.CompactTextString(m) } -func (*PollRequest) ProtoMessage() {} -func (*PollRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{30} -} -func (m *PollRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PollRequest.Unmarshal(m, b) -} -func (m *PollRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PollRequest.Marshal(b, m, deterministic) -} -func (dst *PollRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_PollRequest.Merge(dst, src) -} -func (m *PollRequest) XXX_Size() int { - return xxx_messageInfo_PollRequest.Size(m) -} -func (m *PollRequest) XXX_DiscardUnknown() { - xxx_messageInfo_PollRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_PollRequest proto.InternalMessageInfo - -const Default_PollRequest_TimeoutSeconds float64 = -1 - -func (m *PollRequest) GetEvents() []*PollEvent { - if m != nil { - return m.Events - } - return nil -} - -func (m *PollRequest) GetTimeoutSeconds() float64 { - if m != nil && m.TimeoutSeconds != nil { - return *m.TimeoutSeconds - } - return Default_PollRequest_TimeoutSeconds -} - -type PollReply struct { - Events []*PollEvent `protobuf:"bytes,2,rep,name=events" json:"events,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PollReply) Reset() { *m = PollReply{} } -func (m *PollReply) String() string { return proto.CompactTextString(m) } -func (*PollReply) ProtoMessage() {} -func (*PollReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{31} -} -func (m *PollReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PollReply.Unmarshal(m, b) -} -func (m *PollReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PollReply.Marshal(b, m, deterministic) -} -func (dst *PollReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_PollReply.Merge(dst, src) -} -func (m *PollReply) XXX_Size() int { - return xxx_messageInfo_PollReply.Size(m) -} -func (m *PollReply) XXX_DiscardUnknown() { - xxx_messageInfo_PollReply.DiscardUnknown(m) -} - -var xxx_messageInfo_PollReply proto.InternalMessageInfo - -func (m *PollReply) GetEvents() []*PollEvent { - if m != nil { - return m.Events - } - return nil -} - -type ResolveRequest struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - AddressFamilies []CreateSocketRequest_SocketFamily `protobuf:"varint,2,rep,name=address_families,json=addressFamilies,enum=appengine.CreateSocketRequest_SocketFamily" json:"address_families,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ResolveRequest) Reset() { *m = ResolveRequest{} } -func (m *ResolveRequest) String() string { return proto.CompactTextString(m) } -func (*ResolveRequest) ProtoMessage() {} -func (*ResolveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{32} -} -func (m *ResolveRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ResolveRequest.Unmarshal(m, b) -} -func (m *ResolveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ResolveRequest.Marshal(b, m, deterministic) -} -func (dst *ResolveRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResolveRequest.Merge(dst, src) -} -func (m *ResolveRequest) XXX_Size() int { - return xxx_messageInfo_ResolveRequest.Size(m) -} -func (m *ResolveRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ResolveRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ResolveRequest proto.InternalMessageInfo - -func (m *ResolveRequest) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *ResolveRequest) GetAddressFamilies() []CreateSocketRequest_SocketFamily { - if m != nil { - return m.AddressFamilies - } - return nil -} - -type ResolveReply struct { - PackedAddress [][]byte `protobuf:"bytes,2,rep,name=packed_address,json=packedAddress" json:"packed_address,omitempty"` - CanonicalName *string `protobuf:"bytes,3,opt,name=canonical_name,json=canonicalName" json:"canonical_name,omitempty"` - Aliases []string `protobuf:"bytes,4,rep,name=aliases" json:"aliases,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ResolveReply) Reset() { *m = ResolveReply{} } -func (m *ResolveReply) String() string { return proto.CompactTextString(m) } -func (*ResolveReply) ProtoMessage() {} -func (*ResolveReply) Descriptor() ([]byte, []int) { - return fileDescriptor_socket_service_b5f8f233dc327808, []int{33} -} -func (m *ResolveReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ResolveReply.Unmarshal(m, b) -} -func (m *ResolveReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ResolveReply.Marshal(b, m, deterministic) -} -func (dst *ResolveReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResolveReply.Merge(dst, src) -} -func (m *ResolveReply) XXX_Size() int { - return xxx_messageInfo_ResolveReply.Size(m) -} -func (m *ResolveReply) XXX_DiscardUnknown() { - xxx_messageInfo_ResolveReply.DiscardUnknown(m) -} - -var xxx_messageInfo_ResolveReply proto.InternalMessageInfo - -func (m *ResolveReply) GetPackedAddress() [][]byte { - if m != nil { - return m.PackedAddress - } - return nil -} - -func (m *ResolveReply) GetCanonicalName() string { - if m != nil && m.CanonicalName != nil { - return *m.CanonicalName - } - return "" -} - -func (m *ResolveReply) GetAliases() []string { - if m != nil { - return m.Aliases - } - return nil -} - -func init() { - proto.RegisterType((*RemoteSocketServiceError)(nil), "appengine.RemoteSocketServiceError") - proto.RegisterType((*AddressPort)(nil), "appengine.AddressPort") - proto.RegisterType((*CreateSocketRequest)(nil), "appengine.CreateSocketRequest") - proto.RegisterType((*CreateSocketReply)(nil), "appengine.CreateSocketReply") - proto.RegisterType((*BindRequest)(nil), "appengine.BindRequest") - proto.RegisterType((*BindReply)(nil), "appengine.BindReply") - proto.RegisterType((*GetSocketNameRequest)(nil), "appengine.GetSocketNameRequest") - proto.RegisterType((*GetSocketNameReply)(nil), "appengine.GetSocketNameReply") - proto.RegisterType((*GetPeerNameRequest)(nil), "appengine.GetPeerNameRequest") - proto.RegisterType((*GetPeerNameReply)(nil), "appengine.GetPeerNameReply") - proto.RegisterType((*SocketOption)(nil), "appengine.SocketOption") - proto.RegisterType((*SetSocketOptionsRequest)(nil), "appengine.SetSocketOptionsRequest") - proto.RegisterType((*SetSocketOptionsReply)(nil), "appengine.SetSocketOptionsReply") - proto.RegisterType((*GetSocketOptionsRequest)(nil), "appengine.GetSocketOptionsRequest") - proto.RegisterType((*GetSocketOptionsReply)(nil), "appengine.GetSocketOptionsReply") - proto.RegisterType((*ConnectRequest)(nil), "appengine.ConnectRequest") - proto.RegisterType((*ConnectReply)(nil), "appengine.ConnectReply") - proto.RegisterType((*ListenRequest)(nil), "appengine.ListenRequest") - proto.RegisterType((*ListenReply)(nil), "appengine.ListenReply") - proto.RegisterType((*AcceptRequest)(nil), "appengine.AcceptRequest") - proto.RegisterType((*AcceptReply)(nil), "appengine.AcceptReply") - proto.RegisterType((*ShutDownRequest)(nil), "appengine.ShutDownRequest") - proto.RegisterType((*ShutDownReply)(nil), "appengine.ShutDownReply") - proto.RegisterType((*CloseRequest)(nil), "appengine.CloseRequest") - proto.RegisterType((*CloseReply)(nil), "appengine.CloseReply") - proto.RegisterType((*SendRequest)(nil), "appengine.SendRequest") - proto.RegisterType((*SendReply)(nil), "appengine.SendReply") - proto.RegisterType((*ReceiveRequest)(nil), "appengine.ReceiveRequest") - proto.RegisterType((*ReceiveReply)(nil), "appengine.ReceiveReply") - proto.RegisterType((*PollEvent)(nil), "appengine.PollEvent") - proto.RegisterType((*PollRequest)(nil), "appengine.PollRequest") - proto.RegisterType((*PollReply)(nil), "appengine.PollReply") - proto.RegisterType((*ResolveRequest)(nil), "appengine.ResolveRequest") - proto.RegisterType((*ResolveReply)(nil), "appengine.ResolveReply") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/socket/socket_service.proto", fileDescriptor_socket_service_b5f8f233dc327808) -} - -var fileDescriptor_socket_service_b5f8f233dc327808 = []byte{ - // 3088 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0x5f, 0x77, 0xe3, 0xc6, - 0x75, 0x37, 0x48, 0xfd, 0xe3, 0x90, 0x94, 0xee, 0x62, 0xa5, 0x5d, 0x25, 0x6e, 0x12, 0x05, 0x8e, - 0x1b, 0x25, 0x8e, 0x77, 0x6d, 0x39, 0x4d, 0x9b, 0xa4, 0x49, 0x16, 0x04, 0x86, 0x24, 0x4c, 0x00, - 0x03, 0xcd, 0x0c, 0x25, 0xd1, 0x6d, 0x8a, 0xd0, 0x22, 0xa4, 0x65, 0x4c, 0x11, 0x0c, 0xc9, 0xdd, - 0xf5, 0xba, 0x69, 0xaa, 0xfe, 0x39, 0xfd, 0x12, 0x7d, 0xe8, 0x73, 0x3f, 0x43, 0x4f, 0x4f, 0x5f, - 0xfa, 0xec, 0xc7, 0x7e, 0x84, 0x9e, 0xbe, 0xb4, 0x9f, 0xa1, 0x67, 0x06, 0xe0, 0x60, 0xc8, 0xd5, - 0xae, 0x77, 0x75, 0x72, 0x4e, 0x9e, 0xa4, 0xfb, 0xbb, 0x77, 0xee, 0xff, 0x99, 0xb9, 0x03, 0xa2, - 0x47, 0x97, 0x69, 0x7a, 0x39, 0x4a, 0x1e, 0x5c, 0xa6, 0xa3, 0xfe, 0xf8, 0xf2, 0x41, 0x3a, 0xbd, - 0x7c, 0xd8, 0x9f, 0x4c, 0x92, 0xf1, 0xe5, 0x70, 0x9c, 0x3c, 0x1c, 0x8e, 0xe7, 0xc9, 0x74, 0xdc, - 0x1f, 0x3d, 0x9c, 0xa5, 0xe7, 0x9f, 0x25, 0xf3, 0xfc, 0x4f, 0x3c, 0x4b, 0xa6, 0x4f, 0x87, 0xe7, - 0xc9, 0x83, 0xc9, 0x34, 0x9d, 0xa7, 0x66, 0x45, 0xc9, 0x5b, 0xff, 0xbc, 0x8b, 0xf6, 0x69, 0x72, - 0x95, 0xce, 0x13, 0x26, 0x25, 0x59, 0x26, 0x88, 0xa7, 0xd3, 0x74, 0x6a, 0x7e, 0x07, 0xd5, 0x66, - 0xcf, 0x67, 0xf3, 0xe4, 0x2a, 0x4e, 0x04, 0xbd, 0x6f, 0x1c, 0x18, 0x87, 0xeb, 0x3f, 0x31, 0x3e, - 0xa0, 0xd5, 0x0c, 0xce, 0xa4, 0xbe, 0x8d, 0x6a, 0x92, 0x1d, 0x0f, 0x92, 0x79, 0x7f, 0x38, 0xda, - 0x2f, 0x1d, 0x18, 0x87, 0x15, 0x5a, 0x95, 0x98, 0x2b, 0x21, 0xeb, 0x73, 0x54, 0x91, 0xb2, 0x4e, - 0x3a, 0x48, 0x4c, 0x40, 0x35, 0xd6, 0x63, 0x1c, 0x07, 0x31, 0xa6, 0x94, 0x50, 0x30, 0xcc, 0x3a, - 0xaa, 0xb4, 0x6c, 0x2f, 0x27, 0x4b, 0x66, 0x15, 0x6d, 0x36, 0x6d, 0xcf, 0xef, 0x52, 0x0c, 0x6b, - 0xe6, 0x1e, 0xba, 0x13, 0x61, 0x1a, 0x78, 0x8c, 0x79, 0x24, 0x8c, 0x5d, 0x1c, 0x7a, 0xd8, 0x85, - 0x75, 0xf3, 0x2e, 0xda, 0xf1, 0xc2, 0x13, 0xdb, 0xf7, 0xdc, 0x98, 0xe2, 0xe3, 0x2e, 0x66, 0x1c, - 0x36, 0xcc, 0x3b, 0xa8, 0xce, 0x88, 0xd3, 0xc1, 0x3c, 0x76, 0x7c, 0xc2, 0xb0, 0x0b, 0x9b, 0xd6, - 0xbf, 0x99, 0xa8, 0xca, 0x34, 0x67, 0x77, 0x50, 0x95, 0xf5, 0x58, 0xcc, 0xba, 0x8e, 0x83, 0x19, - 0x83, 0xb7, 0x84, 0x6d, 0x01, 0x60, 0x61, 0x04, 0x0c, 0x73, 0x1b, 0x21, 0x49, 0x86, 0x04, 0x87, - 0x1c, 0x4a, 0x8a, 0xcd, 0xa8, 0xd3, 0x86, 0xb2, 0x22, 0xbd, 0x90, 0x53, 0x58, 0x13, 0x9e, 0x66, - 0x24, 0x81, 0x75, 0xc5, 0x0b, 0xcf, 0x3c, 0x02, 0x1b, 0x8a, 0x3c, 0x6a, 0x78, 0x2d, 0xd8, 0x5c, - 0x18, 0x16, 0x8a, 0xcf, 0xb0, 0x03, 0x5b, 0x8a, 0xdf, 0xb0, 0xdd, 0x26, 0x54, 0x94, 0x61, 0xa7, - 0xed, 0xf9, 0x2e, 0x20, 0x45, 0xdb, 0x2d, 0xdb, 0x0b, 0xa1, 0x2a, 0x02, 0x96, 0xf4, 0x29, 0xe9, - 0xfa, 0x6e, 0xc3, 0x27, 0x4e, 0x07, 0xaa, 0x9a, 0xb7, 0x01, 0x0e, 0xa0, 0x56, 0x2c, 0x12, 0xd1, - 0x41, 0x5d, 0xd1, 0x4d, 0xbb, 0xeb, 0x73, 0xd8, 0xd6, 0x9c, 0xe0, 0x0d, 0xbf, 0x03, 0x3b, 0x85, - 0x13, 0x5d, 0xd6, 0x03, 0x50, 0xf2, 0xf8, 0xcc, 0x63, 0x1c, 0xee, 0x28, 0xf6, 0x99, 0x8b, 0x4f, - 0xc0, 0xd4, 0xcc, 0x09, 0xfa, 0xae, 0xae, 0xce, 0xf5, 0x28, 0xec, 0x2a, 0x01, 0x8f, 0x09, 0x7a, - 0xaf, 0xa0, 0x45, 0xa9, 0xe0, 0x5e, 0xa1, 0xa0, 0xe9, 0xf9, 0x18, 0xee, 0x2b, 0x3a, 0x90, 0xf4, - 0xbe, 0x66, 0x80, 0xf3, 0x1e, 0x7c, 0x4d, 0x19, 0xe0, 0x67, 0xbc, 0xc1, 0x7a, 0xf0, 0x75, 0xe5, - 0x50, 0x53, 0x24, 0xf5, 0x6d, 0x4d, 0x9e, 0x45, 0x0e, 0xfc, 0x91, 0xa2, 0x59, 0xe4, 0x45, 0x18, - 0xbe, 0xa1, 0xc4, 0x29, 0x69, 0x32, 0xf8, 0x66, 0x61, 0xce, 0xf7, 0xc2, 0x0e, 0x7c, 0xab, 0xa8, - 0xbd, 0x90, 0x3e, 0x30, 0x6b, 0x68, 0x4b, 0x92, 0x2e, 0x09, 0xe0, 0xdb, 0x4a, 0x98, 0xda, 0x61, - 0x0b, 0x83, 0xa5, 0x7c, 0x71, 0xb1, 0xed, 0xfa, 0x1d, 0x78, 0x47, 0x76, 0x9b, 0x02, 0x44, 0x3d, - 0xde, 0x31, 0x77, 0x11, 0x64, 0xfe, 0xd8, 0x01, 0xe6, 0x84, 0xf8, 0x24, 0x6c, 0xc1, 0x77, 0x34, - 0x2f, 0x7d, 0xa7, 0x03, 0xef, 0xea, 0x5e, 0xf7, 0x18, 0xfc, 0xb1, 0x52, 0x14, 0x12, 0x8e, 0x83, - 0x88, 0xf7, 0xe0, 0xbb, 0xca, 0x33, 0x9f, 0x90, 0x08, 0x0e, 0xf5, 0x3a, 0xb3, 0x16, 0x7c, 0xbf, - 0x68, 0x43, 0x97, 0x06, 0xf0, 0x9e, 0xd6, 0x3b, 0x34, 0x6c, 0xc1, 0x0f, 0xf2, 0x1d, 0x16, 0x63, - 0xff, 0x28, 0x64, 0xbd, 0xd0, 0x81, 0xf7, 0x95, 0x84, 0xff, 0x51, 0xdb, 0xe7, 0xf0, 0x40, 0xa3, - 0x29, 0xe3, 0xf0, 0xb0, 0xa0, 0x43, 0xa1, 0xe1, 0x03, 0x15, 0x6c, 0x37, 0xb4, 0xb9, 0xd3, 0x86, - 0x0f, 0x35, 0x0f, 0x1c, 0xe6, 0xc1, 0x51, 0xb1, 0xe0, 0x48, 0x28, 0xfc, 0x48, 0xef, 0x66, 0x0c, - 0x3f, 0xd4, 0x49, 0x0a, 0x7f, 0xa2, 0xa4, 0xcf, 0x9a, 0x5d, 0xdf, 0x87, 0x1f, 0x69, 0xda, 0xec, - 0x90, 0xc0, 0x9f, 0x2a, 0x73, 0x42, 0xfc, 0xd8, 0x81, 0x3f, 0xd3, 0x01, 0xe6, 0x73, 0xf8, 0xb1, - 0x5a, 0xd1, 0x68, 0x92, 0x90, 0xc3, 0x4f, 0xf5, 0x1c, 0x72, 0x0a, 0x7f, 0xae, 0xb5, 0xa2, 0x6b, - 0x73, 0x1b, 0x7e, 0xa6, 0x3c, 0xe0, 0x5e, 0x80, 0xe1, 0xe7, 0xc5, 0xe6, 0x24, 0x8c, 0xc2, 0x2f, - 0xb4, 0xe5, 0x21, 0xe6, 0xf0, 0x48, 0xa3, 0xa3, 0x4e, 0x0b, 0x6c, 0xa5, 0x8e, 0xe2, 0x80, 0x70, - 0x0c, 0x0d, 0x4d, 0xbf, 0xec, 0x1d, 0x47, 0x35, 0x8b, 0xed, 0x9e, 0x80, 0x5b, 0x34, 0x1e, 0x0d, - 0x42, 0x0e, 0x58, 0x99, 0x73, 0x48, 0x10, 0x40, 0x53, 0xb1, 0x23, 0x4a, 0x38, 0x81, 0x96, 0xaa, - 0x78, 0xd0, 0xf5, 0xb9, 0xd7, 0x26, 0x11, 0xb4, 0x8b, 0xf6, 0x22, 0xdc, 0x25, 0x1c, 0x3c, 0x3d, - 0x05, 0xa2, 0xe8, 0x1f, 0xab, 0x45, 0xe4, 0x04, 0xd3, 0xa6, 0x4f, 0x4e, 0xa1, 0xa3, 0x0a, 0x1d, - 0x12, 0xde, 0x0d, 0xbd, 0x63, 0xf0, 0x8b, 0x3c, 0xd9, 0x6e, 0xd3, 0x85, 0x40, 0x0f, 0xc4, 0x69, - 0xb7, 0x20, 0x54, 0x80, 0xef, 0x35, 0x6c, 0xc7, 0x01, 0xa2, 0x03, 0x0d, 0xdb, 0x85, 0x48, 0x07, - 0x98, 0x13, 0xc2, 0xb1, 0x0e, 0x04, 0xf6, 0x19, 0xd0, 0xa2, 0xbf, 0xbc, 0x86, 0x3c, 0xcc, 0x58, - 0xb1, 0xd1, 0x7d, 0x86, 0x8f, 0x81, 0x2b, 0x09, 0x8a, 0x19, 0xb7, 0x29, 0x87, 0xae, 0x42, 0x18, - 0xa7, 0x72, 0xbb, 0x9d, 0xa8, 0x35, 0x5d, 0x86, 0x29, 0x83, 0x53, 0x3d, 0x18, 0x71, 0x8a, 0xc3, - 0x99, 0xda, 0x4e, 0xae, 0xd0, 0xe2, 0xba, 0x94, 0xe2, 0x63, 0xe8, 0x29, 0xb9, 0x80, 0xb5, 0x98, - 0xf7, 0x09, 0x86, 0x4f, 0x4c, 0x13, 0x6d, 0x17, 0xe9, 0xe5, 0xbd, 0x08, 0xc3, 0x5f, 0xa8, 0xf3, - 0x32, 0x24, 0x12, 0x25, 0x11, 0x87, 0xbf, 0x34, 0xef, 0xa3, 0xbb, 0x85, 0x60, 0x48, 0x58, 0x37, - 0x8a, 0x08, 0xe5, 0xf0, 0x4b, 0xc5, 0x10, 0x86, 0x79, 0xc1, 0xf8, 0x2b, 0xa5, 0x9a, 0x44, 0xc2, - 0xad, 0x6e, 0x14, 0x41, 0xac, 0x1f, 0x7b, 0xac, 0x2b, 0x80, 0x85, 0x9f, 0x51, 0xb3, 0x58, 0xfa, - 0x2b, 0x85, 0xda, 0x1a, 0xda, 0x57, 0x0a, 0x45, 0x3c, 0x5e, 0xd8, 0x65, 0x18, 0x3e, 0x15, 0x77, - 0x9c, 0xc2, 0x42, 0xc2, 0xed, 0x13, 0xdb, 0xf3, 0xe1, 0xbc, 0x48, 0x08, 0xe6, 0x2e, 0x39, 0x0d, - 0x61, 0x50, 0x04, 0x85, 0x79, 0x37, 0xa4, 0xd8, 0x76, 0xda, 0x90, 0x14, 0xc7, 0x07, 0xe6, 0x14, - 0x33, 0xcc, 0xe1, 0x42, 0x99, 0x76, 0x48, 0x18, 0xda, 0x0d, 0x42, 0x39, 0x76, 0xe1, 0x52, 0x99, - 0x16, 0x68, 0x26, 0xf9, 0x58, 0x8b, 0xa5, 0xd1, 0x6d, 0x32, 0x18, 0x2a, 0xc0, 0x63, 0x42, 0x0c, - 0x7e, 0xad, 0x97, 0x45, 0x22, 0x9f, 0x29, 0x83, 0xac, 0xdd, 0xcd, 0x1c, 0x1b, 0x29, 0x83, 0x9c, - 0x90, 0xc0, 0x0e, 0x7b, 0x14, 0x37, 0x19, 0x5c, 0x29, 0x41, 0xb1, 0x07, 0x5d, 0xd2, 0xe5, 0x30, - 0x5e, 0xf2, 0x8c, 0xe2, 0x66, 0x57, 0xdc, 0xd2, 0xa9, 0x12, 0x6c, 0x13, 0x96, 0x69, 0x9c, 0x28, - 0x41, 0x01, 0x2d, 0x62, 0xfd, 0x8d, 0x72, 0xc6, 0xf6, 0x29, 0xb6, 0xdd, 0x1e, 0x4c, 0x55, 0x4a, - 0xbc, 0x30, 0xa2, 0xa4, 0x45, 0xc5, 0xa5, 0x3e, 0x2b, 0xb6, 0x23, 0xb7, 0x7d, 0x0c, 0xf3, 0xe2, - 0x38, 0x73, 0x7c, 0x6c, 0x87, 0xf0, 0x44, 0x2f, 0x61, 0x68, 0x07, 0xf0, 0xb4, 0x00, 0xb2, 0xe4, - 0x3f, 0xd3, 0xae, 0x32, 0x21, 0xf0, 0xb9, 0x72, 0x31, 0x3b, 0x11, 0x3c, 0x02, 0xcf, 0x95, 0x88, - 0x7b, 0xdc, 0x25, 0x1c, 0xbe, 0xd0, 0xce, 0xf1, 0x00, 0xbb, 0x5e, 0x37, 0x80, 0xbf, 0x56, 0xde, - 0x65, 0x80, 0x6c, 0xcd, 0xdf, 0x2a, 0x39, 0xc7, 0x0e, 0x1d, 0xec, 0x63, 0x17, 0xfe, 0x46, 0x3b, - 0x7f, 0x3a, 0xb8, 0x07, 0xbf, 0x53, 0xeb, 0x3a, 0xb8, 0x87, 0xcf, 0x22, 0x8f, 0x62, 0x17, 0xfe, - 0xd6, 0xdc, 0x2d, 0x40, 0x8a, 0x4f, 0x48, 0x07, 0xbb, 0x70, 0x6d, 0x98, 0x7b, 0x79, 0xa2, 0x24, - 0xfa, 0x31, 0x76, 0x44, 0xad, 0xff, 0xce, 0x30, 0xef, 0x2e, 0x1a, 0xf7, 0x34, 0xc4, 0x54, 0x5c, - 0x51, 0xf0, 0xf7, 0x86, 0xb9, 0x9f, 0xb7, 0x79, 0x48, 0x38, 0xc5, 0x8e, 0x38, 0x48, 0xec, 0x86, - 0x8f, 0xe1, 0x1f, 0x0c, 0x13, 0x16, 0xe7, 0x44, 0xb3, 0xe3, 0xf9, 0x3e, 0xfc, 0xa3, 0xf1, 0xf5, - 0x12, 0x18, 0xd6, 0x15, 0xaa, 0xda, 0x83, 0xc1, 0x34, 0x99, 0xcd, 0xa2, 0x74, 0x3a, 0x37, 0x4d, - 0xb4, 0x36, 0x49, 0xa7, 0xf3, 0x7d, 0xe3, 0xa0, 0x74, 0xb8, 0x4e, 0xe5, 0xff, 0xe6, 0xbb, 0x68, - 0x7b, 0xd2, 0x3f, 0xff, 0x2c, 0x19, 0xc4, 0xfd, 0x4c, 0x52, 0xce, 0x7f, 0x35, 0x5a, 0xcf, 0xd0, - 0x7c, 0xb9, 0xf9, 0x0e, 0xaa, 0x3f, 0x4e, 0x67, 0xf3, 0x71, 0xff, 0x2a, 0x89, 0x1f, 0x0f, 0xc7, - 0xf3, 0xfd, 0xb2, 0x9c, 0x12, 0x6b, 0x0b, 0xb0, 0x3d, 0x1c, 0xcf, 0xad, 0x7f, 0x5a, 0x43, 0x77, - 0x9d, 0x69, 0xd2, 0x5f, 0x0c, 0xa3, 0x34, 0xf9, 0xcd, 0x93, 0x64, 0x36, 0x37, 0x1d, 0xb4, 0x71, - 0xd1, 0xbf, 0x1a, 0x8e, 0x9e, 0x4b, 0xcb, 0xdb, 0x47, 0xef, 0x3d, 0x50, 0x03, 0xec, 0x83, 0x1b, - 0xe4, 0x1f, 0x64, 0x54, 0x53, 0x2e, 0xa1, 0xf9, 0x52, 0xd3, 0x43, 0x5b, 0x72, 0xfa, 0x3d, 0x4f, - 0xc5, 0x88, 0x2a, 0xd4, 0xbc, 0xff, 0x5a, 0x6a, 0xa2, 0x7c, 0x11, 0x55, 0xcb, 0xcd, 0x9f, 0xa3, - 0xed, 0x7c, 0xae, 0x4e, 0x27, 0xf3, 0x61, 0x3a, 0x9e, 0xed, 0x97, 0x0f, 0xca, 0x87, 0xd5, 0xa3, - 0xfb, 0x9a, 0xc2, 0x6c, 0x31, 0x91, 0x7c, 0x5a, 0x9f, 0x69, 0xd4, 0xcc, 0x6c, 0xa0, 0x3b, 0x93, - 0x69, 0xfa, 0xf9, 0xf3, 0x38, 0xf9, 0x3c, 0x9b, 0xd6, 0xe3, 0xe1, 0x64, 0x7f, 0xed, 0xc0, 0x38, - 0xac, 0x1e, 0xdd, 0xd3, 0x54, 0x68, 0xa9, 0xa7, 0x3b, 0x72, 0x01, 0xce, 0xe5, 0xbd, 0x89, 0x79, - 0x88, 0xb6, 0x47, 0xc3, 0xd9, 0x3c, 0x19, 0xc7, 0x9f, 0xf6, 0xcf, 0x3f, 0x1b, 0xa5, 0x97, 0xfb, - 0xeb, 0x8b, 0xe9, 0xbc, 0x9e, 0x31, 0x1a, 0x19, 0x6e, 0x7e, 0x84, 0x2a, 0x53, 0x39, 0xe1, 0x0b, - 0x2b, 0x1b, 0xaf, 0xb4, 0xb2, 0x95, 0x09, 0x7a, 0x13, 0x73, 0x0f, 0x6d, 0xf4, 0x27, 0x93, 0x78, - 0x38, 0xd8, 0xaf, 0xc8, 0x42, 0xad, 0xf7, 0x27, 0x13, 0x6f, 0x60, 0x7e, 0x03, 0xa1, 0xc9, 0x34, - 0xfd, 0x75, 0x72, 0x3e, 0x17, 0x2c, 0x74, 0x60, 0x1c, 0x96, 0x69, 0x25, 0x47, 0xbc, 0x81, 0x65, - 0xa1, 0x9a, 0x9e, 0x7b, 0x73, 0x0b, 0xad, 0x79, 0xd1, 0xd3, 0x1f, 0x82, 0x91, 0xff, 0xf7, 0x23, - 0x28, 0x59, 0x16, 0xda, 0x5e, 0x4e, 0xac, 0xb9, 0x89, 0xca, 0xdc, 0x89, 0xc0, 0x10, 0xff, 0x74, - 0xdd, 0x08, 0x4a, 0xd6, 0x97, 0x06, 0xba, 0xb3, 0x5c, 0x91, 0xc9, 0xe8, 0xb9, 0xf9, 0x1e, 0xba, - 0x93, 0xa7, 0x7d, 0x90, 0xcc, 0xce, 0xa7, 0xc3, 0xc9, 0x3c, 0x7f, 0x93, 0x54, 0x28, 0x64, 0x0c, - 0x57, 0xe1, 0xe6, 0xcf, 0xd0, 0xb6, 0x78, 0xf4, 0x24, 0x53, 0xd5, 0x97, 0xe5, 0x57, 0x86, 0x5e, - 0xcf, 0xa4, 0x17, 0xfd, 0xfa, 0x7b, 0x28, 0xd1, 0xf7, 0x2b, 0x5b, 0xff, 0xb3, 0x09, 0xd7, 0xd7, - 0xd7, 0xd7, 0x25, 0xeb, 0x77, 0xa8, 0xda, 0x18, 0x8e, 0x07, 0x8b, 0x86, 0x7e, 0x49, 0x24, 0xa5, - 0x1b, 0x23, 0xb9, 0xd1, 0x15, 0xd1, 0xc1, 0xaf, 0xef, 0x8a, 0x45, 0x50, 0x25, 0xb3, 0x2f, 0xf2, - 0x78, 0xa3, 0x42, 0xe3, 0x8d, 0x62, 0xb3, 0x1c, 0xb4, 0xdb, 0x4a, 0xe6, 0x59, 0x75, 0xc2, 0xfe, - 0x55, 0x72, 0x9b, 0xc8, 0xac, 0x33, 0x64, 0xae, 0x28, 0x79, 0xa9, 0x7b, 0xa5, 0x37, 0x73, 0xcf, - 0x96, 0x9a, 0xa3, 0x24, 0x99, 0xde, 0xda, 0x39, 0x07, 0xc1, 0x92, 0x0a, 0xe1, 0xda, 0x43, 0xb4, - 0x39, 0x49, 0x92, 0xe9, 0x57, 0x3b, 0xb4, 0x21, 0xc4, 0xbc, 0x89, 0xf5, 0xe5, 0xe6, 0x62, 0x47, - 0x64, 0x7b, 0xdf, 0xfc, 0x05, 0x5a, 0x1f, 0x25, 0x4f, 0x93, 0x51, 0x7e, 0x92, 0x7d, 0xef, 0x25, - 0x27, 0xc6, 0x12, 0xe1, 0x8b, 0x05, 0x34, 0x5b, 0x67, 0x3e, 0x42, 0x1b, 0xd9, 0xa1, 0x93, 0x1f, - 0x62, 0x87, 0xaf, 0xa3, 0x41, 0x46, 0x90, 0xaf, 0x33, 0x77, 0xd1, 0xfa, 0xd3, 0xfe, 0xe8, 0x49, - 0xb2, 0x5f, 0x3e, 0x28, 0x1d, 0xd6, 0x68, 0x46, 0x58, 0x09, 0xba, 0xf3, 0x82, 0x4d, 0xed, 0x41, - 0xcd, 0x88, 0x1f, 0x7b, 0x11, 0xbc, 0x25, 0x67, 0x95, 0x02, 0xca, 0xfe, 0x05, 0x43, 0xce, 0x16, - 0x05, 0x2c, 0xb6, 0xf3, 0xc6, 0x0a, 0x26, 0x76, 0xf6, 0x1d, 0xeb, 0xdf, 0xd7, 0x11, 0xac, 0x7a, - 0x26, 0x6f, 0xbb, 0x85, 0x60, 0xec, 0xe2, 0x46, 0xb7, 0x05, 0x86, 0x1c, 0xc9, 0x14, 0x48, 0xc5, - 0x94, 0x28, 0xc6, 0x23, 0x28, 0x2d, 0xa9, 0x8d, 0xe5, 0x95, 0x5a, 0x5e, 0xd6, 0x90, 0x7d, 0x47, - 0x58, 0x5b, 0xd6, 0xe0, 0x92, 0x90, 0x53, 0xd2, 0xe5, 0x18, 0xd6, 0x97, 0x19, 0x0d, 0x4a, 0x6c, - 0xd7, 0xb1, 0xe5, 0x07, 0x04, 0x31, 0x74, 0x28, 0x06, 0x0b, 0xdd, 0x46, 0xb7, 0x09, 0x9b, 0xcb, - 0x28, 0x75, 0x4e, 0x04, 0xba, 0xb5, 0xac, 0xa4, 0x83, 0x71, 0x64, 0xfb, 0xde, 0x09, 0x86, 0xca, - 0x32, 0x83, 0x90, 0x86, 0x17, 0xfa, 0x5e, 0x88, 0x01, 0x2d, 0xeb, 0xf1, 0xbd, 0xb0, 0x85, 0x29, - 0xd4, 0xcd, 0x7b, 0xc8, 0x5c, 0xd2, 0x2e, 0x86, 0x25, 0x02, 0xbb, 0xcb, 0x38, 0x0b, 0xdd, 0x0c, - 0xdf, 0xd3, 0x6a, 0xe2, 0x45, 0x31, 0x27, 0x0c, 0x8c, 0x15, 0x88, 0xfb, 0x50, 0xd2, 0xca, 0xe4, - 0x45, 0x71, 0x5b, 0x8c, 0x9a, 0x8e, 0x0f, 0xe5, 0x65, 0x98, 0x44, 0xdc, 0x23, 0x21, 0x83, 0x35, - 0xcd, 0x16, 0x77, 0xa2, 0x58, 0x3c, 0xef, 0x7d, 0xbb, 0x07, 0x86, 0x26, 0x2e, 0xf0, 0xc0, 0x3e, - 0x63, 0xb8, 0x05, 0x25, 0x2d, 0xdb, 0x02, 0x76, 0x08, 0xed, 0x40, 0x59, 0x0b, 0x5b, 0x80, 0x22, - 0x21, 0x9e, 0xeb, 0x63, 0x58, 0x33, 0xf7, 0xd1, 0xee, 0x2a, 0x23, 0xe4, 0x27, 0x3e, 0xac, 0xaf, - 0x98, 0x15, 0x1c, 0x27, 0x14, 0x65, 0x58, 0x36, 0x2b, 0x9e, 0xb0, 0x21, 0x87, 0xcd, 0x15, 0xf1, - 0x2c, 0x81, 0x47, 0xb0, 0x65, 0xbe, 0x8d, 0xee, 0x6b, 0xb8, 0x8b, 0x9b, 0x98, 0xc6, 0xb6, 0xe3, - 0xe0, 0x88, 0x43, 0x65, 0x85, 0x79, 0xea, 0x85, 0x2e, 0x39, 0x8d, 0x1d, 0xdf, 0x0e, 0x22, 0x40, - 0x2b, 0x81, 0x78, 0x61, 0x93, 0x40, 0x75, 0x25, 0x90, 0xe3, 0xae, 0xe7, 0x74, 0x6c, 0xa7, 0x03, - 0x35, 0x39, 0x11, 0x3d, 0x47, 0xf7, 0xd9, 0xe2, 0xc8, 0xca, 0xaf, 0xf3, 0x5b, 0x1d, 0xea, 0x1f, - 0xa2, 0xcd, 0xc5, 0xec, 0x50, 0x7a, 0xf5, 0xec, 0xb0, 0x90, 0xb3, 0xee, 0xa3, 0xbd, 0x17, 0x4d, - 0x4f, 0x46, 0xcf, 0x85, 0x4f, 0xad, 0x3f, 0x90, 0x4f, 0x1f, 0xa3, 0xbd, 0xd6, 0x4d, 0x3e, 0xdd, - 0x46, 0xd7, 0xbf, 0x18, 0x68, 0xdb, 0x49, 0xc7, 0xe3, 0xe4, 0x7c, 0x7e, 0x2b, 0xf7, 0x97, 0xe6, - 0x9c, 0x57, 0xdf, 0x8f, 0xc5, 0x9c, 0xf3, 0x1e, 0xda, 0x99, 0x0f, 0xaf, 0x92, 0xf4, 0xc9, 0x3c, - 0x9e, 0x25, 0xe7, 0xe9, 0x78, 0x90, 0xcd, 0x09, 0xc6, 0x4f, 0x4a, 0xef, 0x7f, 0x48, 0xb7, 0x73, - 0x16, 0xcb, 0x38, 0xd6, 0x2f, 0x51, 0x4d, 0x39, 0xf8, 0x7b, 0xba, 0x48, 0xf5, 0x21, 0xe1, 0x04, - 0xd5, 0x7d, 0x39, 0xb9, 0xdd, 0x2a, 0xfc, 0x7d, 0xb4, 0xb9, 0x98, 0x04, 0x4b, 0x72, 0x3e, 0x5f, - 0x90, 0x56, 0x1d, 0x55, 0x17, 0x7a, 0x45, 0xbb, 0x0c, 0x51, 0xdd, 0x3e, 0x3f, 0x4f, 0x26, 0xb7, - 0xcb, 0xf2, 0x0d, 0x09, 0x2b, 0xbd, 0x34, 0x61, 0xd7, 0x06, 0xaa, 0x2e, 0x6c, 0x89, 0x84, 0x1d, - 0xa1, 0xbd, 0x71, 0xf2, 0x2c, 0x7e, 0xd1, 0x5a, 0xf6, 0x66, 0xb8, 0x3b, 0x4e, 0x9e, 0xb1, 0x1b, - 0x06, 0xb9, 0xbc, 0xac, 0xaf, 0x39, 0xc8, 0x65, 0xd2, 0x39, 0x64, 0xfd, 0x97, 0x81, 0x76, 0xd8, - 0xe3, 0x27, 0x73, 0x37, 0x7d, 0x76, 0xbb, 0xbc, 0x7e, 0x80, 0xca, 0x8f, 0xd3, 0x67, 0xf9, 0x6d, - 0xfb, 0x4d, 0xbd, 0x8b, 0x97, 0xb5, 0x3e, 0x68, 0xa7, 0xcf, 0xa8, 0x10, 0x35, 0xbf, 0x85, 0xaa, - 0xb3, 0x64, 0x3c, 0x88, 0xd3, 0x8b, 0x8b, 0x59, 0x32, 0x97, 0xd7, 0x6c, 0x99, 0x22, 0x01, 0x11, - 0x89, 0x58, 0x0e, 0x2a, 0xb7, 0xd3, 0x67, 0xfa, 0x45, 0xd6, 0xee, 0xf2, 0x98, 0xba, 0xcb, 0xf7, - 0xa8, 0xc0, 0x4e, 0xc5, 0x85, 0xa7, 0xdd, 0x1b, 0x99, 0xdc, 0x29, 0x85, 0xb2, 0xb5, 0x83, 0xea, - 0x85, 0x07, 0xa2, 0xae, 0xbf, 0x42, 0x35, 0x67, 0x94, 0xce, 0x6e, 0x35, 0xed, 0x98, 0xef, 0x2c, - 0xfb, 0x2c, 0xea, 0x51, 0x96, 0x25, 0xd5, 0xfd, 0xae, 0x21, 0x94, 0x5b, 0x10, 0xf6, 0xfe, 0xcf, - 0x40, 0x55, 0x96, 0xdc, 0x72, 0xa8, 0xbd, 0x87, 0xd6, 0x06, 0xfd, 0x79, 0x5f, 0xa6, 0xb5, 0xd6, - 0x28, 0x6d, 0x19, 0x54, 0xd2, 0xe2, 0x9d, 0x38, 0x9b, 0x4f, 0x93, 0xfe, 0xd5, 0x72, 0xf6, 0x6a, - 0x19, 0x98, 0xf9, 0x61, 0xde, 0x47, 0xeb, 0x17, 0xa3, 0xfe, 0xe5, 0x4c, 0x0e, 0xe4, 0xf2, 0xc9, - 0x93, 0xd1, 0x62, 0x3e, 0x93, 0x51, 0xcc, 0x53, 0xf9, 0x1a, 0x7a, 0xc5, 0x7c, 0x26, 0xc4, 0x78, - 0x7a, 0x53, 0x37, 0x6f, 0xbc, 0xb4, 0x9b, 0x0f, 0x51, 0x25, 0x8b, 0x57, 0xb4, 0xf2, 0xdb, 0xa8, - 0x22, 0x1c, 0x8e, 0x67, 0xc9, 0x78, 0x9e, 0xfd, 0x30, 0x42, 0xb7, 0x04, 0xc0, 0x92, 0xf1, 0xdc, - 0xfa, 0x4f, 0x03, 0x6d, 0xd3, 0xe4, 0x3c, 0x19, 0x3e, 0xbd, 0x5d, 0x35, 0x94, 0xf2, 0xe1, 0x17, - 0x49, 0xbe, 0x9b, 0x33, 0xe5, 0xc3, 0x2f, 0x92, 0x22, 0xfa, 0xf2, 0x4a, 0xf4, 0x37, 0x04, 0xb3, - 0xfe, 0xd2, 0x60, 0x2c, 0xb4, 0xde, 0x94, 0xab, 0xaa, 0x68, 0x33, 0x60, 0x2d, 0x31, 0xa8, 0x80, - 0x61, 0xd6, 0xd0, 0x96, 0x20, 0x22, 0x8c, 0x3b, 0x50, 0xb2, 0xfe, 0xd5, 0x40, 0x35, 0x15, 0x86, - 0x08, 0xfa, 0x85, 0xea, 0xc8, 0x3e, 0x59, 0xa9, 0xce, 0xa2, 0xb4, 0xc2, 0x3d, 0xbd, 0xb4, 0x3f, - 0x45, 0xf5, 0x69, 0xa6, 0x6c, 0x10, 0x5f, 0x4c, 0xd3, 0xab, 0xaf, 0x78, 0x4e, 0xd5, 0x16, 0xc2, - 0xcd, 0x69, 0x7a, 0x25, 0xf6, 0xd4, 0xa7, 0x4f, 0x2e, 0x2e, 0x92, 0x69, 0x96, 0x13, 0xf9, 0xd6, - 0xa5, 0x28, 0x83, 0x44, 0x56, 0xac, 0x2f, 0xcb, 0xa8, 0x12, 0xa5, 0xa3, 0x11, 0x7e, 0x9a, 0x8c, - 0xdf, 0x30, 0xdb, 0xdf, 0x43, 0x30, 0xcd, 0xaa, 0x94, 0x0c, 0xe2, 0x44, 0xac, 0x9f, 0xe5, 0x49, - 0xdf, 0x51, 0xb8, 0x54, 0x3b, 0x33, 0xbf, 0x8b, 0x76, 0xd2, 0x4f, 0xe5, 0x4b, 0x51, 0x49, 0x96, - 0xa5, 0xe4, 0xf6, 0x02, 0xce, 0x04, 0xad, 0xff, 0x28, 0xa1, 0xba, 0x72, 0x47, 0x24, 0x5a, 0x9b, - 0x35, 0x22, 0xe2, 0xfb, 0x21, 0x09, 0x31, 0xbc, 0xa5, 0x4d, 0x6e, 0x02, 0xf4, 0xc2, 0xa5, 0x13, - 0x40, 0x40, 0x11, 0xf5, 0x96, 0x46, 0x5e, 0x81, 0x91, 0x2e, 0x87, 0xb5, 0x15, 0x0c, 0x53, 0x0a, - 0x5b, 0x2b, 0x58, 0xbb, 0x1b, 0x01, 0xac, 0xda, 0x3d, 0xb1, 0x7d, 0x38, 0xd0, 0x26, 0x2c, 0x01, - 0x52, 0x37, 0x24, 0x34, 0x80, 0x47, 0xe6, 0xbd, 0x15, 0xb8, 0x61, 0x87, 0xf2, 0x1b, 0xd3, 0x32, - 0x7e, 0x4a, 0xa5, 0xf8, 0x75, 0xe9, 0x05, 0x3c, 0x93, 0x5f, 0x93, 0x1f, 0x9f, 0x0a, 0x3c, 0x60, - 0x2d, 0xb8, 0xde, 0x5a, 0x55, 0x8e, 0x03, 0x72, 0x82, 0xe1, 0xfa, 0x40, 0x7e, 0xc0, 0xd2, 0x8d, - 0x0a, 0xb7, 0xaf, 0x1f, 0x59, 0x8f, 0x51, 0x55, 0x24, 0x70, 0xb1, 0x7f, 0x7e, 0x80, 0x36, 0xf2, - 0x84, 0x1b, 0x72, 0x9e, 0xd8, 0xd5, 0xda, 0x46, 0x25, 0x9a, 0xe6, 0x32, 0x6f, 0x76, 0x4b, 0xfd, - 0x38, 0xeb, 0x9c, 0xac, 0xc5, 0x0b, 0x3b, 0xa5, 0xaf, 0xb6, 0x63, 0xfd, 0x56, 0xec, 0xf3, 0x59, - 0x3a, 0x2a, 0xf6, 0xb9, 0x89, 0xd6, 0xc6, 0xfd, 0xab, 0x24, 0x6f, 0x36, 0xf9, 0xbf, 0x79, 0x82, - 0x20, 0xbf, 0xbb, 0x62, 0xf9, 0x31, 0x6a, 0x98, 0x64, 0xda, 0xdf, 0xf0, 0x4b, 0xd6, 0x4e, 0xae, - 0xa4, 0x99, 0xeb, 0xb0, 0xfe, 0xbb, 0x2c, 0xf6, 0x67, 0x6e, 0x5e, 0x38, 0x7f, 0xd3, 0xc7, 0xb8, - 0xf2, 0x8b, 0x1f, 0xe3, 0xde, 0x45, 0xdb, 0xe7, 0xfd, 0x71, 0x3a, 0x1e, 0x9e, 0xf7, 0x47, 0xb1, - 0xf4, 0x36, 0xfb, 0x1a, 0x57, 0x57, 0xa8, 0x7c, 0x96, 0xed, 0xa3, 0xcd, 0xfe, 0x68, 0xd8, 0x9f, - 0x25, 0xe2, 0xa0, 0x2d, 0x1f, 0x56, 0xe8, 0x82, 0xb4, 0xfe, 0xb7, 0xa4, 0xff, 0xa0, 0xfb, 0x35, - 0xb4, 0x97, 0x17, 0x10, 0xdb, 0x5e, 0x2c, 0x5e, 0x69, 0x4d, 0x3b, 0xf0, 0x7c, 0xf1, 0x80, 0x28, - 0xae, 0x2e, 0xc9, 0x92, 0xbf, 0x65, 0x96, 0xb4, 0x09, 0x5b, 0xa0, 0x0d, 0xdb, 0x6d, 0xfa, 0x76, - 0x8b, 0x2d, 0x3d, 0xe3, 0x04, 0xa3, 0x69, 0x7b, 0x7e, 0xf6, 0x0b, 0xf0, 0x12, 0x28, 0x55, 0xaf, - 0xaf, 0xc0, 0x01, 0x0e, 0x08, 0xed, 0x2d, 0xbd, 0x1d, 0x04, 0x9c, 0xff, 0x1c, 0xb4, 0xf9, 0x02, - 0x1c, 0xda, 0x01, 0x86, 0x2d, 0xed, 0x49, 0x21, 0x60, 0x86, 0xe9, 0x89, 0xe7, 0x2c, 0xbf, 0xe1, - 0x24, 0x4e, 0x9c, 0x8e, 0x7c, 0x68, 0xa2, 0x15, 0x3d, 0xd9, 0xef, 0xd8, 0x4b, 0x6f, 0x86, 0x3c, - 0xa2, 0xb6, 0x17, 0x72, 0x06, 0xb5, 0x15, 0x86, 0xfc, 0xdd, 0xc1, 0x21, 0x3e, 0xd4, 0x57, 0x18, - 0xea, 0x37, 0x9d, 0x6d, 0x6d, 0x0f, 0xcb, 0xb8, 0xec, 0x33, 0xd8, 0x69, 0x6c, 0x7d, 0xb2, 0x91, - 0x9d, 0x5a, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x31, 0x03, 0x4e, 0xbd, 0xfd, 0x1f, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/socket/socket_service.proto b/vendor/google.golang.org/appengine/internal/socket/socket_service.proto deleted file mode 100644 index 2fcc7953d..000000000 --- a/vendor/google.golang.org/appengine/internal/socket/socket_service.proto +++ /dev/null @@ -1,460 +0,0 @@ -syntax = "proto2"; -option go_package = "socket"; - -package appengine; - -message RemoteSocketServiceError { - enum ErrorCode { - SYSTEM_ERROR = 1; - GAI_ERROR = 2; - FAILURE = 4; - PERMISSION_DENIED = 5; - INVALID_REQUEST = 6; - SOCKET_CLOSED = 7; - } - - enum SystemError { - option allow_alias = true; - - SYS_SUCCESS = 0; - SYS_EPERM = 1; - SYS_ENOENT = 2; - SYS_ESRCH = 3; - SYS_EINTR = 4; - SYS_EIO = 5; - SYS_ENXIO = 6; - SYS_E2BIG = 7; - SYS_ENOEXEC = 8; - SYS_EBADF = 9; - SYS_ECHILD = 10; - SYS_EAGAIN = 11; - SYS_EWOULDBLOCK = 11; - SYS_ENOMEM = 12; - SYS_EACCES = 13; - SYS_EFAULT = 14; - SYS_ENOTBLK = 15; - SYS_EBUSY = 16; - SYS_EEXIST = 17; - SYS_EXDEV = 18; - SYS_ENODEV = 19; - SYS_ENOTDIR = 20; - SYS_EISDIR = 21; - SYS_EINVAL = 22; - SYS_ENFILE = 23; - SYS_EMFILE = 24; - SYS_ENOTTY = 25; - SYS_ETXTBSY = 26; - SYS_EFBIG = 27; - SYS_ENOSPC = 28; - SYS_ESPIPE = 29; - SYS_EROFS = 30; - SYS_EMLINK = 31; - SYS_EPIPE = 32; - SYS_EDOM = 33; - SYS_ERANGE = 34; - SYS_EDEADLK = 35; - SYS_EDEADLOCK = 35; - SYS_ENAMETOOLONG = 36; - SYS_ENOLCK = 37; - SYS_ENOSYS = 38; - SYS_ENOTEMPTY = 39; - SYS_ELOOP = 40; - SYS_ENOMSG = 42; - SYS_EIDRM = 43; - SYS_ECHRNG = 44; - SYS_EL2NSYNC = 45; - SYS_EL3HLT = 46; - SYS_EL3RST = 47; - SYS_ELNRNG = 48; - SYS_EUNATCH = 49; - SYS_ENOCSI = 50; - SYS_EL2HLT = 51; - SYS_EBADE = 52; - SYS_EBADR = 53; - SYS_EXFULL = 54; - SYS_ENOANO = 55; - SYS_EBADRQC = 56; - SYS_EBADSLT = 57; - SYS_EBFONT = 59; - SYS_ENOSTR = 60; - SYS_ENODATA = 61; - SYS_ETIME = 62; - SYS_ENOSR = 63; - SYS_ENONET = 64; - SYS_ENOPKG = 65; - SYS_EREMOTE = 66; - SYS_ENOLINK = 67; - SYS_EADV = 68; - SYS_ESRMNT = 69; - SYS_ECOMM = 70; - SYS_EPROTO = 71; - SYS_EMULTIHOP = 72; - SYS_EDOTDOT = 73; - SYS_EBADMSG = 74; - SYS_EOVERFLOW = 75; - SYS_ENOTUNIQ = 76; - SYS_EBADFD = 77; - SYS_EREMCHG = 78; - SYS_ELIBACC = 79; - SYS_ELIBBAD = 80; - SYS_ELIBSCN = 81; - SYS_ELIBMAX = 82; - SYS_ELIBEXEC = 83; - SYS_EILSEQ = 84; - SYS_ERESTART = 85; - SYS_ESTRPIPE = 86; - SYS_EUSERS = 87; - SYS_ENOTSOCK = 88; - SYS_EDESTADDRREQ = 89; - SYS_EMSGSIZE = 90; - SYS_EPROTOTYPE = 91; - SYS_ENOPROTOOPT = 92; - SYS_EPROTONOSUPPORT = 93; - SYS_ESOCKTNOSUPPORT = 94; - SYS_EOPNOTSUPP = 95; - SYS_ENOTSUP = 95; - SYS_EPFNOSUPPORT = 96; - SYS_EAFNOSUPPORT = 97; - SYS_EADDRINUSE = 98; - SYS_EADDRNOTAVAIL = 99; - SYS_ENETDOWN = 100; - SYS_ENETUNREACH = 101; - SYS_ENETRESET = 102; - SYS_ECONNABORTED = 103; - SYS_ECONNRESET = 104; - SYS_ENOBUFS = 105; - SYS_EISCONN = 106; - SYS_ENOTCONN = 107; - SYS_ESHUTDOWN = 108; - SYS_ETOOMANYREFS = 109; - SYS_ETIMEDOUT = 110; - SYS_ECONNREFUSED = 111; - SYS_EHOSTDOWN = 112; - SYS_EHOSTUNREACH = 113; - SYS_EALREADY = 114; - SYS_EINPROGRESS = 115; - SYS_ESTALE = 116; - SYS_EUCLEAN = 117; - SYS_ENOTNAM = 118; - SYS_ENAVAIL = 119; - SYS_EISNAM = 120; - SYS_EREMOTEIO = 121; - SYS_EDQUOT = 122; - SYS_ENOMEDIUM = 123; - SYS_EMEDIUMTYPE = 124; - SYS_ECANCELED = 125; - SYS_ENOKEY = 126; - SYS_EKEYEXPIRED = 127; - SYS_EKEYREVOKED = 128; - SYS_EKEYREJECTED = 129; - SYS_EOWNERDEAD = 130; - SYS_ENOTRECOVERABLE = 131; - SYS_ERFKILL = 132; - } - - optional int32 system_error = 1 [default=0]; - optional string error_detail = 2; -} - -message AddressPort { - required int32 port = 1; - optional bytes packed_address = 2; - - optional string hostname_hint = 3; -} - - - -message CreateSocketRequest { - enum SocketFamily { - IPv4 = 1; - IPv6 = 2; - } - - enum SocketProtocol { - TCP = 1; - UDP = 2; - } - - required SocketFamily family = 1; - required SocketProtocol protocol = 2; - - repeated SocketOption socket_options = 3; - - optional AddressPort proxy_external_ip = 4; - - optional int32 listen_backlog = 5 [default=0]; - - optional AddressPort remote_ip = 6; - - optional string app_id = 9; - - optional int64 project_id = 10; -} - -message CreateSocketReply { - optional string socket_descriptor = 1; - - optional AddressPort server_address = 3; - - optional AddressPort proxy_external_ip = 4; - - extensions 1000 to max; -} - - - -message BindRequest { - required string socket_descriptor = 1; - required AddressPort proxy_external_ip = 2; -} - -message BindReply { - optional AddressPort proxy_external_ip = 1; -} - - - -message GetSocketNameRequest { - required string socket_descriptor = 1; -} - -message GetSocketNameReply { - optional AddressPort proxy_external_ip = 2; -} - - - -message GetPeerNameRequest { - required string socket_descriptor = 1; -} - -message GetPeerNameReply { - optional AddressPort peer_ip = 2; -} - - -message SocketOption { - - enum SocketOptionLevel { - SOCKET_SOL_IP = 0; - SOCKET_SOL_SOCKET = 1; - SOCKET_SOL_TCP = 6; - SOCKET_SOL_UDP = 17; - } - - enum SocketOptionName { - option allow_alias = true; - - SOCKET_SO_DEBUG = 1; - SOCKET_SO_REUSEADDR = 2; - SOCKET_SO_TYPE = 3; - SOCKET_SO_ERROR = 4; - SOCKET_SO_DONTROUTE = 5; - SOCKET_SO_BROADCAST = 6; - SOCKET_SO_SNDBUF = 7; - SOCKET_SO_RCVBUF = 8; - SOCKET_SO_KEEPALIVE = 9; - SOCKET_SO_OOBINLINE = 10; - SOCKET_SO_LINGER = 13; - SOCKET_SO_RCVTIMEO = 20; - SOCKET_SO_SNDTIMEO = 21; - - SOCKET_IP_TOS = 1; - SOCKET_IP_TTL = 2; - SOCKET_IP_HDRINCL = 3; - SOCKET_IP_OPTIONS = 4; - - SOCKET_TCP_NODELAY = 1; - SOCKET_TCP_MAXSEG = 2; - SOCKET_TCP_CORK = 3; - SOCKET_TCP_KEEPIDLE = 4; - SOCKET_TCP_KEEPINTVL = 5; - SOCKET_TCP_KEEPCNT = 6; - SOCKET_TCP_SYNCNT = 7; - SOCKET_TCP_LINGER2 = 8; - SOCKET_TCP_DEFER_ACCEPT = 9; - SOCKET_TCP_WINDOW_CLAMP = 10; - SOCKET_TCP_INFO = 11; - SOCKET_TCP_QUICKACK = 12; - } - - required SocketOptionLevel level = 1; - required SocketOptionName option = 2; - required bytes value = 3; -} - - -message SetSocketOptionsRequest { - required string socket_descriptor = 1; - repeated SocketOption options = 2; -} - -message SetSocketOptionsReply { -} - -message GetSocketOptionsRequest { - required string socket_descriptor = 1; - repeated SocketOption options = 2; -} - -message GetSocketOptionsReply { - repeated SocketOption options = 2; -} - - -message ConnectRequest { - required string socket_descriptor = 1; - required AddressPort remote_ip = 2; - optional double timeout_seconds = 3 [default=-1]; -} - -message ConnectReply { - optional AddressPort proxy_external_ip = 1; - - extensions 1000 to max; -} - - -message ListenRequest { - required string socket_descriptor = 1; - required int32 backlog = 2; -} - -message ListenReply { -} - - -message AcceptRequest { - required string socket_descriptor = 1; - optional double timeout_seconds = 2 [default=-1]; -} - -message AcceptReply { - optional bytes new_socket_descriptor = 2; - optional AddressPort remote_address = 3; -} - - - -message ShutDownRequest { - enum How { - SOCKET_SHUT_RD = 1; - SOCKET_SHUT_WR = 2; - SOCKET_SHUT_RDWR = 3; - } - required string socket_descriptor = 1; - required How how = 2; - required int64 send_offset = 3; -} - -message ShutDownReply { -} - - - -message CloseRequest { - required string socket_descriptor = 1; - optional int64 send_offset = 2 [default=-1]; -} - -message CloseReply { -} - - - -message SendRequest { - required string socket_descriptor = 1; - required bytes data = 2 [ctype=CORD]; - required int64 stream_offset = 3; - optional int32 flags = 4 [default=0]; - optional AddressPort send_to = 5; - optional double timeout_seconds = 6 [default=-1]; -} - -message SendReply { - optional int32 data_sent = 1; -} - - -message ReceiveRequest { - enum Flags { - MSG_OOB = 1; - MSG_PEEK = 2; - } - required string socket_descriptor = 1; - required int32 data_size = 2; - optional int32 flags = 3 [default=0]; - optional double timeout_seconds = 5 [default=-1]; -} - -message ReceiveReply { - optional int64 stream_offset = 2; - optional bytes data = 3 [ctype=CORD]; - optional AddressPort received_from = 4; - optional int32 buffer_size = 5; -} - - - -message PollEvent { - - enum PollEventFlag { - SOCKET_POLLNONE = 0; - SOCKET_POLLIN = 1; - SOCKET_POLLPRI = 2; - SOCKET_POLLOUT = 4; - SOCKET_POLLERR = 8; - SOCKET_POLLHUP = 16; - SOCKET_POLLNVAL = 32; - SOCKET_POLLRDNORM = 64; - SOCKET_POLLRDBAND = 128; - SOCKET_POLLWRNORM = 256; - SOCKET_POLLWRBAND = 512; - SOCKET_POLLMSG = 1024; - SOCKET_POLLREMOVE = 4096; - SOCKET_POLLRDHUP = 8192; - }; - - required string socket_descriptor = 1; - required int32 requested_events = 2; - required int32 observed_events = 3; -} - -message PollRequest { - repeated PollEvent events = 1; - optional double timeout_seconds = 2 [default=-1]; -} - -message PollReply { - repeated PollEvent events = 2; -} - -message ResolveRequest { - required string name = 1; - repeated CreateSocketRequest.SocketFamily address_families = 2; -} - -message ResolveReply { - enum ErrorCode { - SOCKET_EAI_ADDRFAMILY = 1; - SOCKET_EAI_AGAIN = 2; - SOCKET_EAI_BADFLAGS = 3; - SOCKET_EAI_FAIL = 4; - SOCKET_EAI_FAMILY = 5; - SOCKET_EAI_MEMORY = 6; - SOCKET_EAI_NODATA = 7; - SOCKET_EAI_NONAME = 8; - SOCKET_EAI_SERVICE = 9; - SOCKET_EAI_SOCKTYPE = 10; - SOCKET_EAI_SYSTEM = 11; - SOCKET_EAI_BADHINTS = 12; - SOCKET_EAI_PROTOCOL = 13; - SOCKET_EAI_OVERFLOW = 14; - SOCKET_EAI_MAX = 15; - }; - - repeated bytes packed_address = 2; - optional string canonical_name = 3; - repeated string aliases = 4; -} diff --git a/vendor/google.golang.org/appengine/internal/transaction.go b/vendor/google.golang.org/appengine/internal/transaction.go deleted file mode 100644 index 9006ae653..000000000 --- a/vendor/google.golang.org/appengine/internal/transaction.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2014 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package internal - -// This file implements hooks for applying datastore transactions. - -import ( - "errors" - "reflect" - - "github.com/golang/protobuf/proto" - netcontext "golang.org/x/net/context" - - basepb "google.golang.org/appengine/internal/base" - pb "google.golang.org/appengine/internal/datastore" -) - -var transactionSetters = make(map[reflect.Type]reflect.Value) - -// RegisterTransactionSetter registers a function that sets transaction information -// in a protocol buffer message. f should be a function with two arguments, -// the first being a protocol buffer type, and the second being *datastore.Transaction. -func RegisterTransactionSetter(f interface{}) { - v := reflect.ValueOf(f) - transactionSetters[v.Type().In(0)] = v -} - -// applyTransaction applies the transaction t to message pb -// by using the relevant setter passed to RegisterTransactionSetter. -func applyTransaction(pb proto.Message, t *pb.Transaction) { - v := reflect.ValueOf(pb) - if f, ok := transactionSetters[v.Type()]; ok { - f.Call([]reflect.Value{v, reflect.ValueOf(t)}) - } -} - -var transactionKey = "used for *Transaction" - -func transactionFromContext(ctx netcontext.Context) *transaction { - t, _ := ctx.Value(&transactionKey).(*transaction) - return t -} - -func withTransaction(ctx netcontext.Context, t *transaction) netcontext.Context { - return netcontext.WithValue(ctx, &transactionKey, t) -} - -type transaction struct { - transaction pb.Transaction - finished bool -} - -var ErrConcurrentTransaction = errors.New("internal: concurrent transaction") - -func RunTransactionOnce(c netcontext.Context, f func(netcontext.Context) error, xg bool, readOnly bool, previousTransaction *pb.Transaction) (*pb.Transaction, error) { - if transactionFromContext(c) != nil { - return nil, errors.New("nested transactions are not supported") - } - - // Begin the transaction. - t := &transaction{} - req := &pb.BeginTransactionRequest{ - App: proto.String(FullyQualifiedAppID(c)), - } - if xg { - req.AllowMultipleEg = proto.Bool(true) - } - if previousTransaction != nil { - req.PreviousTransaction = previousTransaction - } - if readOnly { - req.Mode = pb.BeginTransactionRequest_READ_ONLY.Enum() - } else { - req.Mode = pb.BeginTransactionRequest_READ_WRITE.Enum() - } - if err := Call(c, "datastore_v3", "BeginTransaction", req, &t.transaction); err != nil { - return nil, err - } - - // Call f, rolling back the transaction if f returns a non-nil error, or panics. - // The panic is not recovered. - defer func() { - if t.finished { - return - } - t.finished = true - // Ignore the error return value, since we are already returning a non-nil - // error (or we're panicking). - Call(c, "datastore_v3", "Rollback", &t.transaction, &basepb.VoidProto{}) - }() - if err := f(withTransaction(c, t)); err != nil { - return &t.transaction, err - } - t.finished = true - - // Commit the transaction. - res := &pb.CommitResponse{} - err := Call(c, "datastore_v3", "Commit", &t.transaction, res) - if ae, ok := err.(*APIError); ok { - /* TODO: restore this conditional - if appengine.IsDevAppServer() { - */ - // The Python Dev AppServer raises an ApplicationError with error code 2 (which is - // Error.CONCURRENT_TRANSACTION) and message "Concurrency exception.". - if ae.Code == int32(pb.Error_BAD_REQUEST) && ae.Detail == "ApplicationError: 2 Concurrency exception." { - return &t.transaction, ErrConcurrentTransaction - } - if ae.Code == int32(pb.Error_CONCURRENT_TRANSACTION) { - return &t.transaction, ErrConcurrentTransaction - } - } - return &t.transaction, err -} diff --git a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go deleted file mode 100644 index 5f727750a..000000000 --- a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go +++ /dev/null @@ -1,527 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto - -package urlfetch - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type URLFetchServiceError_ErrorCode int32 - -const ( - URLFetchServiceError_OK URLFetchServiceError_ErrorCode = 0 - URLFetchServiceError_INVALID_URL URLFetchServiceError_ErrorCode = 1 - URLFetchServiceError_FETCH_ERROR URLFetchServiceError_ErrorCode = 2 - URLFetchServiceError_UNSPECIFIED_ERROR URLFetchServiceError_ErrorCode = 3 - URLFetchServiceError_RESPONSE_TOO_LARGE URLFetchServiceError_ErrorCode = 4 - URLFetchServiceError_DEADLINE_EXCEEDED URLFetchServiceError_ErrorCode = 5 - URLFetchServiceError_SSL_CERTIFICATE_ERROR URLFetchServiceError_ErrorCode = 6 - URLFetchServiceError_DNS_ERROR URLFetchServiceError_ErrorCode = 7 - URLFetchServiceError_CLOSED URLFetchServiceError_ErrorCode = 8 - URLFetchServiceError_INTERNAL_TRANSIENT_ERROR URLFetchServiceError_ErrorCode = 9 - URLFetchServiceError_TOO_MANY_REDIRECTS URLFetchServiceError_ErrorCode = 10 - URLFetchServiceError_MALFORMED_REPLY URLFetchServiceError_ErrorCode = 11 - URLFetchServiceError_CONNECTION_ERROR URLFetchServiceError_ErrorCode = 12 -) - -var URLFetchServiceError_ErrorCode_name = map[int32]string{ - 0: "OK", - 1: "INVALID_URL", - 2: "FETCH_ERROR", - 3: "UNSPECIFIED_ERROR", - 4: "RESPONSE_TOO_LARGE", - 5: "DEADLINE_EXCEEDED", - 6: "SSL_CERTIFICATE_ERROR", - 7: "DNS_ERROR", - 8: "CLOSED", - 9: "INTERNAL_TRANSIENT_ERROR", - 10: "TOO_MANY_REDIRECTS", - 11: "MALFORMED_REPLY", - 12: "CONNECTION_ERROR", -} -var URLFetchServiceError_ErrorCode_value = map[string]int32{ - "OK": 0, - "INVALID_URL": 1, - "FETCH_ERROR": 2, - "UNSPECIFIED_ERROR": 3, - "RESPONSE_TOO_LARGE": 4, - "DEADLINE_EXCEEDED": 5, - "SSL_CERTIFICATE_ERROR": 6, - "DNS_ERROR": 7, - "CLOSED": 8, - "INTERNAL_TRANSIENT_ERROR": 9, - "TOO_MANY_REDIRECTS": 10, - "MALFORMED_REPLY": 11, - "CONNECTION_ERROR": 12, -} - -func (x URLFetchServiceError_ErrorCode) Enum() *URLFetchServiceError_ErrorCode { - p := new(URLFetchServiceError_ErrorCode) - *p = x - return p -} -func (x URLFetchServiceError_ErrorCode) String() string { - return proto.EnumName(URLFetchServiceError_ErrorCode_name, int32(x)) -} -func (x *URLFetchServiceError_ErrorCode) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(URLFetchServiceError_ErrorCode_value, data, "URLFetchServiceError_ErrorCode") - if err != nil { - return err - } - *x = URLFetchServiceError_ErrorCode(value) - return nil -} -func (URLFetchServiceError_ErrorCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{0, 0} -} - -type URLFetchRequest_RequestMethod int32 - -const ( - URLFetchRequest_GET URLFetchRequest_RequestMethod = 1 - URLFetchRequest_POST URLFetchRequest_RequestMethod = 2 - URLFetchRequest_HEAD URLFetchRequest_RequestMethod = 3 - URLFetchRequest_PUT URLFetchRequest_RequestMethod = 4 - URLFetchRequest_DELETE URLFetchRequest_RequestMethod = 5 - URLFetchRequest_PATCH URLFetchRequest_RequestMethod = 6 -) - -var URLFetchRequest_RequestMethod_name = map[int32]string{ - 1: "GET", - 2: "POST", - 3: "HEAD", - 4: "PUT", - 5: "DELETE", - 6: "PATCH", -} -var URLFetchRequest_RequestMethod_value = map[string]int32{ - "GET": 1, - "POST": 2, - "HEAD": 3, - "PUT": 4, - "DELETE": 5, - "PATCH": 6, -} - -func (x URLFetchRequest_RequestMethod) Enum() *URLFetchRequest_RequestMethod { - p := new(URLFetchRequest_RequestMethod) - *p = x - return p -} -func (x URLFetchRequest_RequestMethod) String() string { - return proto.EnumName(URLFetchRequest_RequestMethod_name, int32(x)) -} -func (x *URLFetchRequest_RequestMethod) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(URLFetchRequest_RequestMethod_value, data, "URLFetchRequest_RequestMethod") - if err != nil { - return err - } - *x = URLFetchRequest_RequestMethod(value) - return nil -} -func (URLFetchRequest_RequestMethod) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{1, 0} -} - -type URLFetchServiceError struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *URLFetchServiceError) Reset() { *m = URLFetchServiceError{} } -func (m *URLFetchServiceError) String() string { return proto.CompactTextString(m) } -func (*URLFetchServiceError) ProtoMessage() {} -func (*URLFetchServiceError) Descriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{0} -} -func (m *URLFetchServiceError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_URLFetchServiceError.Unmarshal(m, b) -} -func (m *URLFetchServiceError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_URLFetchServiceError.Marshal(b, m, deterministic) -} -func (dst *URLFetchServiceError) XXX_Merge(src proto.Message) { - xxx_messageInfo_URLFetchServiceError.Merge(dst, src) -} -func (m *URLFetchServiceError) XXX_Size() int { - return xxx_messageInfo_URLFetchServiceError.Size(m) -} -func (m *URLFetchServiceError) XXX_DiscardUnknown() { - xxx_messageInfo_URLFetchServiceError.DiscardUnknown(m) -} - -var xxx_messageInfo_URLFetchServiceError proto.InternalMessageInfo - -type URLFetchRequest struct { - Method *URLFetchRequest_RequestMethod `protobuf:"varint,1,req,name=Method,enum=appengine.URLFetchRequest_RequestMethod" json:"Method,omitempty"` - Url *string `protobuf:"bytes,2,req,name=Url" json:"Url,omitempty"` - Header []*URLFetchRequest_Header `protobuf:"group,3,rep,name=Header,json=header" json:"header,omitempty"` - Payload []byte `protobuf:"bytes,6,opt,name=Payload" json:"Payload,omitempty"` - FollowRedirects *bool `protobuf:"varint,7,opt,name=FollowRedirects,def=1" json:"FollowRedirects,omitempty"` - Deadline *float64 `protobuf:"fixed64,8,opt,name=Deadline" json:"Deadline,omitempty"` - MustValidateServerCertificate *bool `protobuf:"varint,9,opt,name=MustValidateServerCertificate,def=1" json:"MustValidateServerCertificate,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *URLFetchRequest) Reset() { *m = URLFetchRequest{} } -func (m *URLFetchRequest) String() string { return proto.CompactTextString(m) } -func (*URLFetchRequest) ProtoMessage() {} -func (*URLFetchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{1} -} -func (m *URLFetchRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_URLFetchRequest.Unmarshal(m, b) -} -func (m *URLFetchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_URLFetchRequest.Marshal(b, m, deterministic) -} -func (dst *URLFetchRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_URLFetchRequest.Merge(dst, src) -} -func (m *URLFetchRequest) XXX_Size() int { - return xxx_messageInfo_URLFetchRequest.Size(m) -} -func (m *URLFetchRequest) XXX_DiscardUnknown() { - xxx_messageInfo_URLFetchRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_URLFetchRequest proto.InternalMessageInfo - -const Default_URLFetchRequest_FollowRedirects bool = true -const Default_URLFetchRequest_MustValidateServerCertificate bool = true - -func (m *URLFetchRequest) GetMethod() URLFetchRequest_RequestMethod { - if m != nil && m.Method != nil { - return *m.Method - } - return URLFetchRequest_GET -} - -func (m *URLFetchRequest) GetUrl() string { - if m != nil && m.Url != nil { - return *m.Url - } - return "" -} - -func (m *URLFetchRequest) GetHeader() []*URLFetchRequest_Header { - if m != nil { - return m.Header - } - return nil -} - -func (m *URLFetchRequest) GetPayload() []byte { - if m != nil { - return m.Payload - } - return nil -} - -func (m *URLFetchRequest) GetFollowRedirects() bool { - if m != nil && m.FollowRedirects != nil { - return *m.FollowRedirects - } - return Default_URLFetchRequest_FollowRedirects -} - -func (m *URLFetchRequest) GetDeadline() float64 { - if m != nil && m.Deadline != nil { - return *m.Deadline - } - return 0 -} - -func (m *URLFetchRequest) GetMustValidateServerCertificate() bool { - if m != nil && m.MustValidateServerCertificate != nil { - return *m.MustValidateServerCertificate - } - return Default_URLFetchRequest_MustValidateServerCertificate -} - -type URLFetchRequest_Header struct { - Key *string `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"` - Value *string `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *URLFetchRequest_Header) Reset() { *m = URLFetchRequest_Header{} } -func (m *URLFetchRequest_Header) String() string { return proto.CompactTextString(m) } -func (*URLFetchRequest_Header) ProtoMessage() {} -func (*URLFetchRequest_Header) Descriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{1, 0} -} -func (m *URLFetchRequest_Header) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_URLFetchRequest_Header.Unmarshal(m, b) -} -func (m *URLFetchRequest_Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_URLFetchRequest_Header.Marshal(b, m, deterministic) -} -func (dst *URLFetchRequest_Header) XXX_Merge(src proto.Message) { - xxx_messageInfo_URLFetchRequest_Header.Merge(dst, src) -} -func (m *URLFetchRequest_Header) XXX_Size() int { - return xxx_messageInfo_URLFetchRequest_Header.Size(m) -} -func (m *URLFetchRequest_Header) XXX_DiscardUnknown() { - xxx_messageInfo_URLFetchRequest_Header.DiscardUnknown(m) -} - -var xxx_messageInfo_URLFetchRequest_Header proto.InternalMessageInfo - -func (m *URLFetchRequest_Header) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *URLFetchRequest_Header) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value - } - return "" -} - -type URLFetchResponse struct { - Content []byte `protobuf:"bytes,1,opt,name=Content" json:"Content,omitempty"` - StatusCode *int32 `protobuf:"varint,2,req,name=StatusCode" json:"StatusCode,omitempty"` - Header []*URLFetchResponse_Header `protobuf:"group,3,rep,name=Header,json=header" json:"header,omitempty"` - ContentWasTruncated *bool `protobuf:"varint,6,opt,name=ContentWasTruncated,def=0" json:"ContentWasTruncated,omitempty"` - ExternalBytesSent *int64 `protobuf:"varint,7,opt,name=ExternalBytesSent" json:"ExternalBytesSent,omitempty"` - ExternalBytesReceived *int64 `protobuf:"varint,8,opt,name=ExternalBytesReceived" json:"ExternalBytesReceived,omitempty"` - FinalUrl *string `protobuf:"bytes,9,opt,name=FinalUrl" json:"FinalUrl,omitempty"` - ApiCpuMilliseconds *int64 `protobuf:"varint,10,opt,name=ApiCpuMilliseconds,def=0" json:"ApiCpuMilliseconds,omitempty"` - ApiBytesSent *int64 `protobuf:"varint,11,opt,name=ApiBytesSent,def=0" json:"ApiBytesSent,omitempty"` - ApiBytesReceived *int64 `protobuf:"varint,12,opt,name=ApiBytesReceived,def=0" json:"ApiBytesReceived,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *URLFetchResponse) Reset() { *m = URLFetchResponse{} } -func (m *URLFetchResponse) String() string { return proto.CompactTextString(m) } -func (*URLFetchResponse) ProtoMessage() {} -func (*URLFetchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{2} -} -func (m *URLFetchResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_URLFetchResponse.Unmarshal(m, b) -} -func (m *URLFetchResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_URLFetchResponse.Marshal(b, m, deterministic) -} -func (dst *URLFetchResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_URLFetchResponse.Merge(dst, src) -} -func (m *URLFetchResponse) XXX_Size() int { - return xxx_messageInfo_URLFetchResponse.Size(m) -} -func (m *URLFetchResponse) XXX_DiscardUnknown() { - xxx_messageInfo_URLFetchResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_URLFetchResponse proto.InternalMessageInfo - -const Default_URLFetchResponse_ContentWasTruncated bool = false -const Default_URLFetchResponse_ApiCpuMilliseconds int64 = 0 -const Default_URLFetchResponse_ApiBytesSent int64 = 0 -const Default_URLFetchResponse_ApiBytesReceived int64 = 0 - -func (m *URLFetchResponse) GetContent() []byte { - if m != nil { - return m.Content - } - return nil -} - -func (m *URLFetchResponse) GetStatusCode() int32 { - if m != nil && m.StatusCode != nil { - return *m.StatusCode - } - return 0 -} - -func (m *URLFetchResponse) GetHeader() []*URLFetchResponse_Header { - if m != nil { - return m.Header - } - return nil -} - -func (m *URLFetchResponse) GetContentWasTruncated() bool { - if m != nil && m.ContentWasTruncated != nil { - return *m.ContentWasTruncated - } - return Default_URLFetchResponse_ContentWasTruncated -} - -func (m *URLFetchResponse) GetExternalBytesSent() int64 { - if m != nil && m.ExternalBytesSent != nil { - return *m.ExternalBytesSent - } - return 0 -} - -func (m *URLFetchResponse) GetExternalBytesReceived() int64 { - if m != nil && m.ExternalBytesReceived != nil { - return *m.ExternalBytesReceived - } - return 0 -} - -func (m *URLFetchResponse) GetFinalUrl() string { - if m != nil && m.FinalUrl != nil { - return *m.FinalUrl - } - return "" -} - -func (m *URLFetchResponse) GetApiCpuMilliseconds() int64 { - if m != nil && m.ApiCpuMilliseconds != nil { - return *m.ApiCpuMilliseconds - } - return Default_URLFetchResponse_ApiCpuMilliseconds -} - -func (m *URLFetchResponse) GetApiBytesSent() int64 { - if m != nil && m.ApiBytesSent != nil { - return *m.ApiBytesSent - } - return Default_URLFetchResponse_ApiBytesSent -} - -func (m *URLFetchResponse) GetApiBytesReceived() int64 { - if m != nil && m.ApiBytesReceived != nil { - return *m.ApiBytesReceived - } - return Default_URLFetchResponse_ApiBytesReceived -} - -type URLFetchResponse_Header struct { - Key *string `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"` - Value *string `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *URLFetchResponse_Header) Reset() { *m = URLFetchResponse_Header{} } -func (m *URLFetchResponse_Header) String() string { return proto.CompactTextString(m) } -func (*URLFetchResponse_Header) ProtoMessage() {} -func (*URLFetchResponse_Header) Descriptor() ([]byte, []int) { - return fileDescriptor_urlfetch_service_b245a7065f33bced, []int{2, 0} -} -func (m *URLFetchResponse_Header) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_URLFetchResponse_Header.Unmarshal(m, b) -} -func (m *URLFetchResponse_Header) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_URLFetchResponse_Header.Marshal(b, m, deterministic) -} -func (dst *URLFetchResponse_Header) XXX_Merge(src proto.Message) { - xxx_messageInfo_URLFetchResponse_Header.Merge(dst, src) -} -func (m *URLFetchResponse_Header) XXX_Size() int { - return xxx_messageInfo_URLFetchResponse_Header.Size(m) -} -func (m *URLFetchResponse_Header) XXX_DiscardUnknown() { - xxx_messageInfo_URLFetchResponse_Header.DiscardUnknown(m) -} - -var xxx_messageInfo_URLFetchResponse_Header proto.InternalMessageInfo - -func (m *URLFetchResponse_Header) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *URLFetchResponse_Header) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value - } - return "" -} - -func init() { - proto.RegisterType((*URLFetchServiceError)(nil), "appengine.URLFetchServiceError") - proto.RegisterType((*URLFetchRequest)(nil), "appengine.URLFetchRequest") - proto.RegisterType((*URLFetchRequest_Header)(nil), "appengine.URLFetchRequest.Header") - proto.RegisterType((*URLFetchResponse)(nil), "appengine.URLFetchResponse") - proto.RegisterType((*URLFetchResponse_Header)(nil), "appengine.URLFetchResponse.Header") -} - -func init() { - proto.RegisterFile("google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto", fileDescriptor_urlfetch_service_b245a7065f33bced) -} - -var fileDescriptor_urlfetch_service_b245a7065f33bced = []byte{ - // 770 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xdd, 0x6e, 0xe3, 0x54, - 0x10, 0xc6, 0x76, 0x7e, 0xa7, 0x5d, 0x7a, 0x76, 0xb6, 0x45, 0x66, 0xb5, 0xa0, 0x10, 0x09, 0x29, - 0x17, 0x90, 0x2e, 0x2b, 0x24, 0x44, 0xaf, 0x70, 0xed, 0x93, 0xad, 0xa9, 0x63, 0x47, 0xc7, 0x4e, - 0x61, 0xb9, 0xb1, 0xac, 0x78, 0x9a, 0x5a, 0xb2, 0xec, 0x60, 0x9f, 0x2c, 0xf4, 0x35, 0x78, 0x0d, - 0xde, 0x87, 0xa7, 0xe1, 0x02, 0x9d, 0xc4, 0xc9, 0x6e, 0xbb, 0xd1, 0x4a, 0x5c, 0x65, 0xe6, 0x9b, - 0xef, 0xcc, 0x99, 0x7c, 0xdf, 0xf8, 0x80, 0xb3, 0x2c, 0xcb, 0x65, 0x4e, 0xe3, 0x65, 0x99, 0x27, - 0xc5, 0x72, 0x5c, 0x56, 0xcb, 0xf3, 0x64, 0xb5, 0xa2, 0x62, 0x99, 0x15, 0x74, 0x9e, 0x15, 0x92, - 0xaa, 0x22, 0xc9, 0xcf, 0xd7, 0x55, 0x7e, 0x4b, 0x72, 0x71, 0xb7, 0x0f, 0xe2, 0x9a, 0xaa, 0xb7, - 0xd9, 0x82, 0xc6, 0xab, 0xaa, 0x94, 0x25, 0xf6, 0xf7, 0x67, 0x86, 0x7f, 0xeb, 0x70, 0x3a, 0x17, - 0xde, 0x44, 0xb1, 0xc2, 0x2d, 0x89, 0x57, 0x55, 0x59, 0x0d, 0xff, 0xd2, 0xa1, 0xbf, 0x89, 0xec, - 0x32, 0x25, 0xec, 0x80, 0x1e, 0x5c, 0xb3, 0x4f, 0xf0, 0x04, 0x8e, 0x5c, 0xff, 0xc6, 0xf2, 0x5c, - 0x27, 0x9e, 0x0b, 0x8f, 0x69, 0x0a, 0x98, 0xf0, 0xc8, 0xbe, 0x8a, 0xb9, 0x10, 0x81, 0x60, 0x3a, - 0x9e, 0xc1, 0xd3, 0xb9, 0x1f, 0xce, 0xb8, 0xed, 0x4e, 0x5c, 0xee, 0x34, 0xb0, 0x81, 0x9f, 0x01, - 0x0a, 0x1e, 0xce, 0x02, 0x3f, 0xe4, 0x71, 0x14, 0x04, 0xb1, 0x67, 0x89, 0xd7, 0x9c, 0xb5, 0x14, - 0xdd, 0xe1, 0x96, 0xe3, 0xb9, 0x3e, 0x8f, 0xf9, 0xaf, 0x36, 0xe7, 0x0e, 0x77, 0x58, 0x1b, 0x3f, - 0x87, 0xb3, 0x30, 0xf4, 0x62, 0x9b, 0x8b, 0xc8, 0x9d, 0xb8, 0xb6, 0x15, 0xf1, 0xa6, 0x53, 0x07, - 0x9f, 0x40, 0xdf, 0xf1, 0xc3, 0x26, 0xed, 0x22, 0x40, 0xc7, 0xf6, 0x82, 0x90, 0x3b, 0xac, 0x87, - 0x2f, 0xc0, 0x74, 0xfd, 0x88, 0x0b, 0xdf, 0xf2, 0xe2, 0x48, 0x58, 0x7e, 0xe8, 0x72, 0x3f, 0x6a, - 0x98, 0x7d, 0x35, 0x82, 0xba, 0x79, 0x6a, 0xf9, 0x6f, 0x62, 0xc1, 0x1d, 0x57, 0x70, 0x3b, 0x0a, - 0x19, 0xe0, 0x33, 0x38, 0x99, 0x5a, 0xde, 0x24, 0x10, 0x53, 0xee, 0xc4, 0x82, 0xcf, 0xbc, 0x37, - 0xec, 0x08, 0x4f, 0x81, 0xd9, 0x81, 0xef, 0x73, 0x3b, 0x72, 0x03, 0xbf, 0x69, 0x71, 0x3c, 0xfc, - 0xc7, 0x80, 0x93, 0x9d, 0x5a, 0x82, 0x7e, 0x5f, 0x53, 0x2d, 0xf1, 0x27, 0xe8, 0x4c, 0x49, 0xde, - 0x95, 0xa9, 0xa9, 0x0d, 0xf4, 0xd1, 0xa7, 0xaf, 0x46, 0xe3, 0xbd, 0xba, 0xe3, 0x47, 0xdc, 0x71, - 0xf3, 0xbb, 0xe5, 0x8b, 0xe6, 0x1c, 0x32, 0x30, 0xe6, 0x55, 0x6e, 0xea, 0x03, 0x7d, 0xd4, 0x17, - 0x2a, 0xc4, 0x1f, 0xa1, 0x73, 0x47, 0x49, 0x4a, 0x95, 0x69, 0x0c, 0x8c, 0x11, 0xbc, 0xfa, 0xea, - 0x23, 0x3d, 0xaf, 0x36, 0x44, 0xd1, 0x1c, 0xc0, 0x17, 0xd0, 0x9d, 0x25, 0xf7, 0x79, 0x99, 0xa4, - 0x66, 0x67, 0xa0, 0x8d, 0x8e, 0x2f, 0xf5, 0x9e, 0x26, 0x76, 0x10, 0x8e, 0xe1, 0x64, 0x52, 0xe6, - 0x79, 0xf9, 0x87, 0xa0, 0x34, 0xab, 0x68, 0x21, 0x6b, 0xb3, 0x3b, 0xd0, 0x46, 0xbd, 0x8b, 0x96, - 0xac, 0xd6, 0x24, 0x1e, 0x17, 0xf1, 0x39, 0xf4, 0x1c, 0x4a, 0xd2, 0x3c, 0x2b, 0xc8, 0xec, 0x0d, - 0xb4, 0x91, 0x26, 0xf6, 0x39, 0xfe, 0x0c, 0x5f, 0x4c, 0xd7, 0xb5, 0xbc, 0x49, 0xf2, 0x2c, 0x4d, - 0x24, 0xa9, 0xed, 0xa1, 0xca, 0xa6, 0x4a, 0x66, 0xb7, 0xd9, 0x22, 0x91, 0x64, 0xf6, 0xdf, 0xeb, - 0xfc, 0x71, 0xea, 0xf3, 0x97, 0xd0, 0xd9, 0xfe, 0x0f, 0x25, 0xc6, 0x35, 0xdd, 0x9b, 0xad, 0xad, - 0x18, 0xd7, 0x74, 0x8f, 0xa7, 0xd0, 0xbe, 0x49, 0xf2, 0x35, 0x99, 0xed, 0x0d, 0xb6, 0x4d, 0x86, - 0x1e, 0x3c, 0x79, 0xa0, 0x26, 0x76, 0xc1, 0x78, 0xcd, 0x23, 0xa6, 0x61, 0x0f, 0x5a, 0xb3, 0x20, - 0x8c, 0x98, 0xae, 0xa2, 0x2b, 0x6e, 0x39, 0xcc, 0x50, 0xc5, 0xd9, 0x3c, 0x62, 0x2d, 0xb5, 0x2e, - 0x0e, 0xf7, 0x78, 0xc4, 0x59, 0x1b, 0xfb, 0xd0, 0x9e, 0x59, 0x91, 0x7d, 0xc5, 0x3a, 0xc3, 0x7f, - 0x0d, 0x60, 0xef, 0x84, 0xad, 0x57, 0x65, 0x51, 0x13, 0x9a, 0xd0, 0xb5, 0xcb, 0x42, 0x52, 0x21, - 0x4d, 0x4d, 0x49, 0x29, 0x76, 0x29, 0x7e, 0x09, 0x10, 0xca, 0x44, 0xae, 0x6b, 0xf5, 0x71, 0x6c, - 0x8c, 0x6b, 0x8b, 0xf7, 0x10, 0xbc, 0x78, 0xe4, 0xdf, 0xf0, 0xa0, 0x7f, 0xdb, 0x6b, 0x1e, 0x1b, - 0xf8, 0x03, 0x3c, 0x6b, 0xae, 0xf9, 0x25, 0xa9, 0xa3, 0x6a, 0x5d, 0x28, 0x81, 0xb6, 0x66, 0xf6, - 0x2e, 0xda, 0xb7, 0x49, 0x5e, 0x93, 0x38, 0xc4, 0xc0, 0x6f, 0xe0, 0x29, 0xff, 0x73, 0xfb, 0x02, - 0x5c, 0xde, 0x4b, 0xaa, 0x43, 0x35, 0xb8, 0x72, 0xd7, 0x10, 0x1f, 0x16, 0xf0, 0x7b, 0x38, 0x7b, - 0x00, 0x0a, 0x5a, 0x50, 0xf6, 0x96, 0xd2, 0x8d, 0xcd, 0x86, 0x38, 0x5c, 0x54, 0xfb, 0x30, 0xc9, - 0x8a, 0x24, 0x57, 0xfb, 0xaa, 0xec, 0xed, 0x8b, 0x7d, 0x8e, 0xdf, 0x01, 0x5a, 0xab, 0xcc, 0x5e, - 0xad, 0xa7, 0x59, 0x9e, 0x67, 0x35, 0x2d, 0xca, 0x22, 0xad, 0x4d, 0x50, 0xed, 0x2e, 0xb4, 0x97, - 0xe2, 0x40, 0x11, 0xbf, 0x86, 0x63, 0x6b, 0x95, 0xbd, 0x9b, 0xf6, 0x68, 0x47, 0x7e, 0x00, 0xe3, - 0xb7, 0xc0, 0x76, 0xf9, 0x7e, 0xcc, 0xe3, 0x1d, 0xf5, 0x83, 0xd2, 0xff, 0x5f, 0xa6, 0x4b, 0xf8, - 0xad, 0xb7, 0x7b, 0x2a, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x9f, 0x6d, 0x24, 0x63, 0x05, - 0x00, 0x00, -} diff --git a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto deleted file mode 100644 index f695edf6a..000000000 --- a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +++ /dev/null @@ -1,64 +0,0 @@ -syntax = "proto2"; -option go_package = "urlfetch"; - -package appengine; - -message URLFetchServiceError { - enum ErrorCode { - OK = 0; - INVALID_URL = 1; - FETCH_ERROR = 2; - UNSPECIFIED_ERROR = 3; - RESPONSE_TOO_LARGE = 4; - DEADLINE_EXCEEDED = 5; - SSL_CERTIFICATE_ERROR = 6; - DNS_ERROR = 7; - CLOSED = 8; - INTERNAL_TRANSIENT_ERROR = 9; - TOO_MANY_REDIRECTS = 10; - MALFORMED_REPLY = 11; - CONNECTION_ERROR = 12; - } -} - -message URLFetchRequest { - enum RequestMethod { - GET = 1; - POST = 2; - HEAD = 3; - PUT = 4; - DELETE = 5; - PATCH = 6; - } - required RequestMethod Method = 1; - required string Url = 2; - repeated group Header = 3 { - required string Key = 4; - required string Value = 5; - } - optional bytes Payload = 6 [ctype=CORD]; - - optional bool FollowRedirects = 7 [default=true]; - - optional double Deadline = 8; - - optional bool MustValidateServerCertificate = 9 [default=true]; -} - -message URLFetchResponse { - optional bytes Content = 1; - required int32 StatusCode = 2; - repeated group Header = 3 { - required string Key = 4; - required string Value = 5; - } - optional bool ContentWasTruncated = 6 [default=false]; - optional int64 ExternalBytesSent = 7; - optional int64 ExternalBytesReceived = 8; - - optional string FinalUrl = 9; - - optional int64 ApiCpuMilliseconds = 10 [default=0]; - optional int64 ApiBytesSent = 11 [default=0]; - optional int64 ApiBytesReceived = 12 [default=0]; -} diff --git a/vendor/google.golang.org/appengine/namespace.go b/vendor/google.golang.org/appengine/namespace.go deleted file mode 100644 index 21860ca08..000000000 --- a/vendor/google.golang.org/appengine/namespace.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2012 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package appengine - -import ( - "fmt" - "regexp" - - "golang.org/x/net/context" - - "google.golang.org/appengine/internal" -) - -// Namespace returns a replacement context that operates within the given namespace. -func Namespace(c context.Context, namespace string) (context.Context, error) { - if !validNamespace.MatchString(namespace) { - return nil, fmt.Errorf("appengine: namespace %q does not match /%s/", namespace, validNamespace) - } - return internal.NamespacedContext(c, namespace), nil -} - -// validNamespace matches valid namespace names. -var validNamespace = regexp.MustCompile(`^[0-9A-Za-z._-]{0,100}$`) diff --git a/vendor/google.golang.org/appengine/socket/doc.go b/vendor/google.golang.org/appengine/socket/doc.go deleted file mode 100644 index 3de46df82..000000000 --- a/vendor/google.golang.org/appengine/socket/doc.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2012 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// Package socket provides outbound network sockets. -// -// This package is only required in the classic App Engine environment. -// Applications running only in App Engine "flexible environment" should -// use the standard library's net package. -package socket diff --git a/vendor/google.golang.org/appengine/socket/socket_classic.go b/vendor/google.golang.org/appengine/socket/socket_classic.go deleted file mode 100644 index 0ad50e2d3..000000000 --- a/vendor/google.golang.org/appengine/socket/socket_classic.go +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright 2012 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// +build appengine - -package socket - -import ( - "fmt" - "io" - "net" - "strconv" - "time" - - "github.com/golang/protobuf/proto" - "golang.org/x/net/context" - "google.golang.org/appengine/internal" - - pb "google.golang.org/appengine/internal/socket" -) - -// Dial connects to the address addr on the network protocol. -// The address format is host:port, where host may be a hostname or an IP address. -// Known protocols are "tcp" and "udp". -// The returned connection satisfies net.Conn, and is valid while ctx is valid; -// if the connection is to be used after ctx becomes invalid, invoke SetContext -// with the new context. -func Dial(ctx context.Context, protocol, addr string) (*Conn, error) { - return DialTimeout(ctx, protocol, addr, 0) -} - -var ipFamilies = []pb.CreateSocketRequest_SocketFamily{ - pb.CreateSocketRequest_IPv4, - pb.CreateSocketRequest_IPv6, -} - -// DialTimeout is like Dial but takes a timeout. -// The timeout includes name resolution, if required. -func DialTimeout(ctx context.Context, protocol, addr string, timeout time.Duration) (*Conn, error) { - dialCtx := ctx // Used for dialing and name resolution, but not stored in the *Conn. - if timeout > 0 { - var cancel context.CancelFunc - dialCtx, cancel = context.WithTimeout(ctx, timeout) - defer cancel() - } - - host, portStr, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - port, err := strconv.Atoi(portStr) - if err != nil { - return nil, fmt.Errorf("socket: bad port %q: %v", portStr, err) - } - - var prot pb.CreateSocketRequest_SocketProtocol - switch protocol { - case "tcp": - prot = pb.CreateSocketRequest_TCP - case "udp": - prot = pb.CreateSocketRequest_UDP - default: - return nil, fmt.Errorf("socket: unknown protocol %q", protocol) - } - - packedAddrs, resolved, err := resolve(dialCtx, ipFamilies, host) - if err != nil { - return nil, fmt.Errorf("socket: failed resolving %q: %v", host, err) - } - if len(packedAddrs) == 0 { - return nil, fmt.Errorf("no addresses for %q", host) - } - - packedAddr := packedAddrs[0] // use first address - fam := pb.CreateSocketRequest_IPv4 - if len(packedAddr) == net.IPv6len { - fam = pb.CreateSocketRequest_IPv6 - } - - req := &pb.CreateSocketRequest{ - Family: fam.Enum(), - Protocol: prot.Enum(), - RemoteIp: &pb.AddressPort{ - Port: proto.Int32(int32(port)), - PackedAddress: packedAddr, - }, - } - if resolved { - req.RemoteIp.HostnameHint = &host - } - res := &pb.CreateSocketReply{} - if err := internal.Call(dialCtx, "remote_socket", "CreateSocket", req, res); err != nil { - return nil, err - } - - return &Conn{ - ctx: ctx, - desc: res.GetSocketDescriptor(), - prot: prot, - local: res.ProxyExternalIp, - remote: req.RemoteIp, - }, nil -} - -// LookupIP returns the given host's IP addresses. -func LookupIP(ctx context.Context, host string) (addrs []net.IP, err error) { - packedAddrs, _, err := resolve(ctx, ipFamilies, host) - if err != nil { - return nil, fmt.Errorf("socket: failed resolving %q: %v", host, err) - } - addrs = make([]net.IP, len(packedAddrs)) - for i, pa := range packedAddrs { - addrs[i] = net.IP(pa) - } - return addrs, nil -} - -func resolve(ctx context.Context, fams []pb.CreateSocketRequest_SocketFamily, host string) ([][]byte, bool, error) { - // Check if it's an IP address. - if ip := net.ParseIP(host); ip != nil { - if ip := ip.To4(); ip != nil { - return [][]byte{ip}, false, nil - } - return [][]byte{ip}, false, nil - } - - req := &pb.ResolveRequest{ - Name: &host, - AddressFamilies: fams, - } - res := &pb.ResolveReply{} - if err := internal.Call(ctx, "remote_socket", "Resolve", req, res); err != nil { - // XXX: need to map to pb.ResolveReply_ErrorCode? - return nil, false, err - } - return res.PackedAddress, true, nil -} - -// withDeadline is like context.WithDeadline, except it ignores the zero deadline. -func withDeadline(parent context.Context, deadline time.Time) (context.Context, context.CancelFunc) { - if deadline.IsZero() { - return parent, func() {} - } - return context.WithDeadline(parent, deadline) -} - -// Conn represents a socket connection. -// It implements net.Conn. -type Conn struct { - ctx context.Context - desc string - offset int64 - - prot pb.CreateSocketRequest_SocketProtocol - local, remote *pb.AddressPort - - readDeadline, writeDeadline time.Time // optional -} - -// SetContext sets the context that is used by this Conn. -// It is usually used only when using a Conn that was created in a different context, -// such as when a connection is created during a warmup request but used while -// servicing a user request. -func (cn *Conn) SetContext(ctx context.Context) { - cn.ctx = ctx -} - -func (cn *Conn) Read(b []byte) (n int, err error) { - const maxRead = 1 << 20 - if len(b) > maxRead { - b = b[:maxRead] - } - - req := &pb.ReceiveRequest{ - SocketDescriptor: &cn.desc, - DataSize: proto.Int32(int32(len(b))), - } - res := &pb.ReceiveReply{} - if !cn.readDeadline.IsZero() { - req.TimeoutSeconds = proto.Float64(cn.readDeadline.Sub(time.Now()).Seconds()) - } - ctx, cancel := withDeadline(cn.ctx, cn.readDeadline) - defer cancel() - if err := internal.Call(ctx, "remote_socket", "Receive", req, res); err != nil { - return 0, err - } - if len(res.Data) == 0 { - return 0, io.EOF - } - if len(res.Data) > len(b) { - return 0, fmt.Errorf("socket: internal error: read too much data: %d > %d", len(res.Data), len(b)) - } - return copy(b, res.Data), nil -} - -func (cn *Conn) Write(b []byte) (n int, err error) { - const lim = 1 << 20 // max per chunk - - for n < len(b) { - chunk := b[n:] - if len(chunk) > lim { - chunk = chunk[:lim] - } - - req := &pb.SendRequest{ - SocketDescriptor: &cn.desc, - Data: chunk, - StreamOffset: &cn.offset, - } - res := &pb.SendReply{} - if !cn.writeDeadline.IsZero() { - req.TimeoutSeconds = proto.Float64(cn.writeDeadline.Sub(time.Now()).Seconds()) - } - ctx, cancel := withDeadline(cn.ctx, cn.writeDeadline) - defer cancel() - if err = internal.Call(ctx, "remote_socket", "Send", req, res); err != nil { - // assume zero bytes were sent in this RPC - break - } - n += int(res.GetDataSent()) - cn.offset += int64(res.GetDataSent()) - } - - return -} - -func (cn *Conn) Close() error { - req := &pb.CloseRequest{ - SocketDescriptor: &cn.desc, - } - res := &pb.CloseReply{} - if err := internal.Call(cn.ctx, "remote_socket", "Close", req, res); err != nil { - return err - } - cn.desc = "CLOSED" - return nil -} - -func addr(prot pb.CreateSocketRequest_SocketProtocol, ap *pb.AddressPort) net.Addr { - if ap == nil { - return nil - } - switch prot { - case pb.CreateSocketRequest_TCP: - return &net.TCPAddr{ - IP: net.IP(ap.PackedAddress), - Port: int(*ap.Port), - } - case pb.CreateSocketRequest_UDP: - return &net.UDPAddr{ - IP: net.IP(ap.PackedAddress), - Port: int(*ap.Port), - } - } - panic("unknown protocol " + prot.String()) -} - -func (cn *Conn) LocalAddr() net.Addr { return addr(cn.prot, cn.local) } -func (cn *Conn) RemoteAddr() net.Addr { return addr(cn.prot, cn.remote) } - -func (cn *Conn) SetDeadline(t time.Time) error { - cn.readDeadline = t - cn.writeDeadline = t - return nil -} - -func (cn *Conn) SetReadDeadline(t time.Time) error { - cn.readDeadline = t - return nil -} - -func (cn *Conn) SetWriteDeadline(t time.Time) error { - cn.writeDeadline = t - return nil -} - -// KeepAlive signals that the connection is still in use. -// It may be called to prevent the socket being closed due to inactivity. -func (cn *Conn) KeepAlive() error { - req := &pb.GetSocketNameRequest{ - SocketDescriptor: &cn.desc, - } - res := &pb.GetSocketNameReply{} - return internal.Call(cn.ctx, "remote_socket", "GetSocketName", req, res) -} - -func init() { - internal.RegisterErrorCodeMap("remote_socket", pb.RemoteSocketServiceError_ErrorCode_name) -} diff --git a/vendor/google.golang.org/appengine/socket/socket_vm.go b/vendor/google.golang.org/appengine/socket/socket_vm.go deleted file mode 100644 index c804169a1..000000000 --- a/vendor/google.golang.org/appengine/socket/socket_vm.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// +build !appengine - -package socket - -import ( - "net" - "time" - - "golang.org/x/net/context" -) - -// Dial connects to the address addr on the network protocol. -// The address format is host:port, where host may be a hostname or an IP address. -// Known protocols are "tcp" and "udp". -// The returned connection satisfies net.Conn, and is valid while ctx is valid; -// if the connection is to be used after ctx becomes invalid, invoke SetContext -// with the new context. -func Dial(ctx context.Context, protocol, addr string) (*Conn, error) { - conn, err := net.Dial(protocol, addr) - if err != nil { - return nil, err - } - return &Conn{conn}, nil -} - -// DialTimeout is like Dial but takes a timeout. -// The timeout includes name resolution, if required. -func DialTimeout(ctx context.Context, protocol, addr string, timeout time.Duration) (*Conn, error) { - conn, err := net.DialTimeout(protocol, addr, timeout) - if err != nil { - return nil, err - } - return &Conn{conn}, nil -} - -// LookupIP returns the given host's IP addresses. -func LookupIP(ctx context.Context, host string) (addrs []net.IP, err error) { - return net.LookupIP(host) -} - -// Conn represents a socket connection. -// It implements net.Conn. -type Conn struct { - net.Conn -} - -// SetContext sets the context that is used by this Conn. -// It is usually used only when using a Conn that was created in a different context, -// such as when a connection is created during a warmup request but used while -// servicing a user request. -func (cn *Conn) SetContext(ctx context.Context) { - // This function is not required in App Engine "flexible environment". -} - -// KeepAlive signals that the connection is still in use. -// It may be called to prevent the socket being closed due to inactivity. -func (cn *Conn) KeepAlive() error { - // This function is not required in App Engine "flexible environment". - return nil -} diff --git a/vendor/google.golang.org/appengine/timeout.go b/vendor/google.golang.org/appengine/timeout.go deleted file mode 100644 index 05642a992..000000000 --- a/vendor/google.golang.org/appengine/timeout.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2013 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -package appengine - -import "golang.org/x/net/context" - -// IsTimeoutError reports whether err is a timeout error. -func IsTimeoutError(err error) bool { - if err == context.DeadlineExceeded { - return true - } - if t, ok := err.(interface { - IsTimeout() bool - }); ok { - return t.IsTimeout() - } - return false -} diff --git a/vendor/google.golang.org/appengine/travis_install.sh b/vendor/google.golang.org/appengine/travis_install.sh deleted file mode 100644 index 785b62f46..000000000 --- a/vendor/google.golang.org/appengine/travis_install.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -set -e - -if [[ $GO111MODULE == "on" ]]; then - go get . -else - go get -u -v $(go list -f '{{join .Imports "\n"}}{{"\n"}}{{join .TestImports "\n"}}' ./... | sort | uniq | grep -v appengine) -fi - -if [[ $GOAPP == "true" ]]; then - mkdir /tmp/sdk - curl -o /tmp/sdk.zip "https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.68.zip" - unzip -q /tmp/sdk.zip -d /tmp/sdk - # NOTE: Set the following env vars in the test script: - # export PATH="$PATH:/tmp/sdk/go_appengine" - # export APPENGINE_DEV_APPSERVER=/tmp/sdk/go_appengine/dev_appserver.py -fi - diff --git a/vendor/google.golang.org/appengine/travis_test.sh b/vendor/google.golang.org/appengine/travis_test.sh deleted file mode 100644 index d4390f045..000000000 --- a/vendor/google.golang.org/appengine/travis_test.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -e - -go version -go test -v google.golang.org/appengine/... -go test -v -race google.golang.org/appengine/... -if [[ $GOAPP == "true" ]]; then - export PATH="$PATH:/tmp/sdk/go_appengine" - export APPENGINE_DEV_APPSERVER=/tmp/sdk/go_appengine/dev_appserver.py - goapp version - goapp test -v google.golang.org/appengine/... -fi diff --git a/vendor/google.golang.org/appengine/urlfetch/urlfetch.go b/vendor/google.golang.org/appengine/urlfetch/urlfetch.go deleted file mode 100644 index 6ffe1e6d9..000000000 --- a/vendor/google.golang.org/appengine/urlfetch/urlfetch.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by the Apache 2.0 -// license that can be found in the LICENSE file. - -// Package urlfetch provides an http.RoundTripper implementation -// for fetching URLs via App Engine's urlfetch service. -package urlfetch // import "google.golang.org/appengine/urlfetch" - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "strings" - "time" - - "github.com/golang/protobuf/proto" - "golang.org/x/net/context" - - "google.golang.org/appengine/internal" - pb "google.golang.org/appengine/internal/urlfetch" -) - -// Transport is an implementation of http.RoundTripper for -// App Engine. Users should generally create an http.Client using -// this transport and use the Client rather than using this transport -// directly. -type Transport struct { - Context context.Context - - // Controls whether the application checks the validity of SSL certificates - // over HTTPS connections. A value of false (the default) instructs the - // application to send a request to the server only if the certificate is - // valid and signed by a trusted certificate authority (CA), and also - // includes a hostname that matches the certificate. A value of true - // instructs the application to perform no certificate validation. - AllowInvalidServerCertificate bool -} - -// Verify statically that *Transport implements http.RoundTripper. -var _ http.RoundTripper = (*Transport)(nil) - -// Client returns an *http.Client using a default urlfetch Transport. This -// client will have the default deadline of 5 seconds, and will check the -// validity of SSL certificates. -// -// Any deadline of the provided context will be used for requests through this client; -// if the client does not have a deadline then a 5 second default is used. -func Client(ctx context.Context) *http.Client { - return &http.Client{ - Transport: &Transport{ - Context: ctx, - }, - } -} - -type bodyReader struct { - content []byte - truncated bool - closed bool -} - -// ErrTruncatedBody is the error returned after the final Read() from a -// response's Body if the body has been truncated by App Engine's proxy. -var ErrTruncatedBody = errors.New("urlfetch: truncated body") - -func statusCodeToText(code int) string { - if t := http.StatusText(code); t != "" { - return t - } - return strconv.Itoa(code) -} - -func (br *bodyReader) Read(p []byte) (n int, err error) { - if br.closed { - if br.truncated { - return 0, ErrTruncatedBody - } - return 0, io.EOF - } - n = copy(p, br.content) - if n > 0 { - br.content = br.content[n:] - return - } - if br.truncated { - br.closed = true - return 0, ErrTruncatedBody - } - return 0, io.EOF -} - -func (br *bodyReader) Close() error { - br.closed = true - br.content = nil - return nil -} - -// A map of the URL Fetch-accepted methods that take a request body. -var methodAcceptsRequestBody = map[string]bool{ - "POST": true, - "PUT": true, - "PATCH": true, -} - -// urlString returns a valid string given a URL. This function is necessary because -// the String method of URL doesn't correctly handle URLs with non-empty Opaque values. -// See http://code.google.com/p/go/issues/detail?id=4860. -func urlString(u *url.URL) string { - if u.Opaque == "" || strings.HasPrefix(u.Opaque, "//") { - return u.String() - } - aux := *u - aux.Opaque = "//" + aux.Host + aux.Opaque - return aux.String() -} - -// RoundTrip issues a single HTTP request and returns its response. Per the -// http.RoundTripper interface, RoundTrip only returns an error if there -// was an unsupported request or the URL Fetch proxy fails. -// Note that HTTP response codes such as 5xx, 403, 404, etc are not -// errors as far as the transport is concerned and will be returned -// with err set to nil. -func (t *Transport) RoundTrip(req *http.Request) (res *http.Response, err error) { - methNum, ok := pb.URLFetchRequest_RequestMethod_value[req.Method] - if !ok { - return nil, fmt.Errorf("urlfetch: unsupported HTTP method %q", req.Method) - } - - method := pb.URLFetchRequest_RequestMethod(methNum) - - freq := &pb.URLFetchRequest{ - Method: &method, - Url: proto.String(urlString(req.URL)), - FollowRedirects: proto.Bool(false), // http.Client's responsibility - MustValidateServerCertificate: proto.Bool(!t.AllowInvalidServerCertificate), - } - if deadline, ok := t.Context.Deadline(); ok { - freq.Deadline = proto.Float64(deadline.Sub(time.Now()).Seconds()) - } - - for k, vals := range req.Header { - for _, val := range vals { - freq.Header = append(freq.Header, &pb.URLFetchRequest_Header{ - Key: proto.String(k), - Value: proto.String(val), - }) - } - } - if methodAcceptsRequestBody[req.Method] && req.Body != nil { - // Avoid a []byte copy if req.Body has a Bytes method. - switch b := req.Body.(type) { - case interface { - Bytes() []byte - }: - freq.Payload = b.Bytes() - default: - freq.Payload, err = ioutil.ReadAll(req.Body) - if err != nil { - return nil, err - } - } - } - - fres := &pb.URLFetchResponse{} - if err := internal.Call(t.Context, "urlfetch", "Fetch", freq, fres); err != nil { - return nil, err - } - - res = &http.Response{} - res.StatusCode = int(*fres.StatusCode) - res.Status = fmt.Sprintf("%d %s", res.StatusCode, statusCodeToText(res.StatusCode)) - res.Header = make(http.Header) - res.Request = req - - // Faked: - res.ProtoMajor = 1 - res.ProtoMinor = 1 - res.Proto = "HTTP/1.1" - res.Close = true - - for _, h := range fres.Header { - hkey := http.CanonicalHeaderKey(*h.Key) - hval := *h.Value - if hkey == "Content-Length" { - // Will get filled in below for all but HEAD requests. - if req.Method == "HEAD" { - res.ContentLength, _ = strconv.ParseInt(hval, 10, 64) - } - continue - } - res.Header.Add(hkey, hval) - } - - if req.Method != "HEAD" { - res.ContentLength = int64(len(fres.Content)) - } - - truncated := fres.GetContentWasTruncated() - res.Body = &bodyReader{content: fres.Content, truncated: truncated} - return -} - -func init() { - internal.RegisterErrorCodeMap("urlfetch", pb.URLFetchServiceError_ErrorCode_name) - internal.RegisterTimeoutErrorCode("urlfetch", int32(pb.URLFetchServiceError_DEADLINE_EXCEEDED)) -} diff --git a/vendor/google.golang.org/genproto/googleapis/api/distribution/distribution.pb.go b/vendor/google.golang.org/genproto/googleapis/api/distribution/distribution.pb.go deleted file mode 100644 index 39ff34cfb..000000000 --- a/vendor/google.golang.org/genproto/googleapis/api/distribution/distribution.pb.go +++ /dev/null @@ -1,638 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/api/distribution.proto - -package distribution - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - any "github.com/golang/protobuf/ptypes/any" - timestamp "github.com/golang/protobuf/ptypes/timestamp" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// `Distribution` contains summary statistics for a population of values. It -// optionally contains a histogram representing the distribution of those values -// across a set of buckets. -// -// The summary statistics are the count, mean, sum of the squared deviation from -// the mean, the minimum, and the maximum of the set of population of values. -// The histogram is based on a sequence of buckets and gives a count of values -// that fall into each bucket. The boundaries of the buckets are given either -// explicitly or by formulas for buckets of fixed or exponentially increasing -// widths. -// -// Although it is not forbidden, it is generally a bad idea to include -// non-finite values (infinities or NaNs) in the population of values, as this -// will render the `mean` and `sum_of_squared_deviation` fields meaningless. -type Distribution struct { - // The number of values in the population. Must be non-negative. This value - // must equal the sum of the values in `bucket_counts` if a histogram is - // provided. - Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` - // The arithmetic mean of the values in the population. If `count` is zero - // then this field must be zero. - Mean float64 `protobuf:"fixed64,2,opt,name=mean,proto3" json:"mean,omitempty"` - // The sum of squared deviations from the mean of the values in the - // population. For values x_i this is: - // - // Sum[i=1..n]((x_i - mean)^2) - // - // Knuth, "The Art of Computer Programming", Vol. 2, page 323, 3rd edition - // describes Welford's method for accumulating this sum in one pass. - // - // If `count` is zero then this field must be zero. - SumOfSquaredDeviation float64 `protobuf:"fixed64,3,opt,name=sum_of_squared_deviation,json=sumOfSquaredDeviation,proto3" json:"sum_of_squared_deviation,omitempty"` - // If specified, contains the range of the population values. The field - // must not be present if the `count` is zero. - Range *Distribution_Range `protobuf:"bytes,4,opt,name=range,proto3" json:"range,omitempty"` - // Defines the histogram bucket boundaries. If the distribution does not - // contain a histogram, then omit this field. - BucketOptions *Distribution_BucketOptions `protobuf:"bytes,6,opt,name=bucket_options,json=bucketOptions,proto3" json:"bucket_options,omitempty"` - // The number of values in each bucket of the histogram, as described in - // `bucket_options`. If the distribution does not have a histogram, then omit - // this field. If there is a histogram, then the sum of the values in - // `bucket_counts` must equal the value in the `count` field of the - // distribution. - // - // If present, `bucket_counts` should contain N values, where N is the number - // of buckets specified in `bucket_options`. If you supply fewer than N - // values, the remaining values are assumed to be 0. - // - // The order of the values in `bucket_counts` follows the bucket numbering - // schemes described for the three bucket types. The first value must be the - // count for the underflow bucket (number 0). The next N-2 values are the - // counts for the finite buckets (number 1 through N-2). The N'th value in - // `bucket_counts` is the count for the overflow bucket (number N-1). - BucketCounts []int64 `protobuf:"varint,7,rep,packed,name=bucket_counts,json=bucketCounts,proto3" json:"bucket_counts,omitempty"` - // Must be in increasing order of `value` field. - Exemplars []*Distribution_Exemplar `protobuf:"bytes,10,rep,name=exemplars,proto3" json:"exemplars,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Distribution) Reset() { *m = Distribution{} } -func (m *Distribution) String() string { return proto.CompactTextString(m) } -func (*Distribution) ProtoMessage() {} -func (*Distribution) Descriptor() ([]byte, []int) { - return fileDescriptor_0835ee0fd90bf943, []int{0} -} - -func (m *Distribution) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Distribution.Unmarshal(m, b) -} -func (m *Distribution) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Distribution.Marshal(b, m, deterministic) -} -func (m *Distribution) XXX_Merge(src proto.Message) { - xxx_messageInfo_Distribution.Merge(m, src) -} -func (m *Distribution) XXX_Size() int { - return xxx_messageInfo_Distribution.Size(m) -} -func (m *Distribution) XXX_DiscardUnknown() { - xxx_messageInfo_Distribution.DiscardUnknown(m) -} - -var xxx_messageInfo_Distribution proto.InternalMessageInfo - -func (m *Distribution) GetCount() int64 { - if m != nil { - return m.Count - } - return 0 -} - -func (m *Distribution) GetMean() float64 { - if m != nil { - return m.Mean - } - return 0 -} - -func (m *Distribution) GetSumOfSquaredDeviation() float64 { - if m != nil { - return m.SumOfSquaredDeviation - } - return 0 -} - -func (m *Distribution) GetRange() *Distribution_Range { - if m != nil { - return m.Range - } - return nil -} - -func (m *Distribution) GetBucketOptions() *Distribution_BucketOptions { - if m != nil { - return m.BucketOptions - } - return nil -} - -func (m *Distribution) GetBucketCounts() []int64 { - if m != nil { - return m.BucketCounts - } - return nil -} - -func (m *Distribution) GetExemplars() []*Distribution_Exemplar { - if m != nil { - return m.Exemplars - } - return nil -} - -// The range of the population values. -type Distribution_Range struct { - // The minimum of the population values. - Min float64 `protobuf:"fixed64,1,opt,name=min,proto3" json:"min,omitempty"` - // The maximum of the population values. - Max float64 `protobuf:"fixed64,2,opt,name=max,proto3" json:"max,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Distribution_Range) Reset() { *m = Distribution_Range{} } -func (m *Distribution_Range) String() string { return proto.CompactTextString(m) } -func (*Distribution_Range) ProtoMessage() {} -func (*Distribution_Range) Descriptor() ([]byte, []int) { - return fileDescriptor_0835ee0fd90bf943, []int{0, 0} -} - -func (m *Distribution_Range) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Distribution_Range.Unmarshal(m, b) -} -func (m *Distribution_Range) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Distribution_Range.Marshal(b, m, deterministic) -} -func (m *Distribution_Range) XXX_Merge(src proto.Message) { - xxx_messageInfo_Distribution_Range.Merge(m, src) -} -func (m *Distribution_Range) XXX_Size() int { - return xxx_messageInfo_Distribution_Range.Size(m) -} -func (m *Distribution_Range) XXX_DiscardUnknown() { - xxx_messageInfo_Distribution_Range.DiscardUnknown(m) -} - -var xxx_messageInfo_Distribution_Range proto.InternalMessageInfo - -func (m *Distribution_Range) GetMin() float64 { - if m != nil { - return m.Min - } - return 0 -} - -func (m *Distribution_Range) GetMax() float64 { - if m != nil { - return m.Max - } - return 0 -} - -// `BucketOptions` describes the bucket boundaries used to create a histogram -// for the distribution. The buckets can be in a linear sequence, an -// exponential sequence, or each bucket can be specified explicitly. -// `BucketOptions` does not include the number of values in each bucket. -// -// A bucket has an inclusive lower bound and exclusive upper bound for the -// values that are counted for that bucket. The upper bound of a bucket must -// be strictly greater than the lower bound. The sequence of N buckets for a -// distribution consists of an underflow bucket (number 0), zero or more -// finite buckets (number 1 through N - 2) and an overflow bucket (number N - -// 1). The buckets are contiguous: the lower bound of bucket i (i > 0) is the -// same as the upper bound of bucket i - 1. The buckets span the whole range -// of finite values: lower bound of the underflow bucket is -infinity and the -// upper bound of the overflow bucket is +infinity. The finite buckets are -// so-called because both bounds are finite. -type Distribution_BucketOptions struct { - // Exactly one of these three fields must be set. - // - // Types that are valid to be assigned to Options: - // *Distribution_BucketOptions_LinearBuckets - // *Distribution_BucketOptions_ExponentialBuckets - // *Distribution_BucketOptions_ExplicitBuckets - Options isDistribution_BucketOptions_Options `protobuf_oneof:"options"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Distribution_BucketOptions) Reset() { *m = Distribution_BucketOptions{} } -func (m *Distribution_BucketOptions) String() string { return proto.CompactTextString(m) } -func (*Distribution_BucketOptions) ProtoMessage() {} -func (*Distribution_BucketOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_0835ee0fd90bf943, []int{0, 1} -} - -func (m *Distribution_BucketOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Distribution_BucketOptions.Unmarshal(m, b) -} -func (m *Distribution_BucketOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Distribution_BucketOptions.Marshal(b, m, deterministic) -} -func (m *Distribution_BucketOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_Distribution_BucketOptions.Merge(m, src) -} -func (m *Distribution_BucketOptions) XXX_Size() int { - return xxx_messageInfo_Distribution_BucketOptions.Size(m) -} -func (m *Distribution_BucketOptions) XXX_DiscardUnknown() { - xxx_messageInfo_Distribution_BucketOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_Distribution_BucketOptions proto.InternalMessageInfo - -type isDistribution_BucketOptions_Options interface { - isDistribution_BucketOptions_Options() -} - -type Distribution_BucketOptions_LinearBuckets struct { - LinearBuckets *Distribution_BucketOptions_Linear `protobuf:"bytes,1,opt,name=linear_buckets,json=linearBuckets,proto3,oneof"` -} - -type Distribution_BucketOptions_ExponentialBuckets struct { - ExponentialBuckets *Distribution_BucketOptions_Exponential `protobuf:"bytes,2,opt,name=exponential_buckets,json=exponentialBuckets,proto3,oneof"` -} - -type Distribution_BucketOptions_ExplicitBuckets struct { - ExplicitBuckets *Distribution_BucketOptions_Explicit `protobuf:"bytes,3,opt,name=explicit_buckets,json=explicitBuckets,proto3,oneof"` -} - -func (*Distribution_BucketOptions_LinearBuckets) isDistribution_BucketOptions_Options() {} - -func (*Distribution_BucketOptions_ExponentialBuckets) isDistribution_BucketOptions_Options() {} - -func (*Distribution_BucketOptions_ExplicitBuckets) isDistribution_BucketOptions_Options() {} - -func (m *Distribution_BucketOptions) GetOptions() isDistribution_BucketOptions_Options { - if m != nil { - return m.Options - } - return nil -} - -func (m *Distribution_BucketOptions) GetLinearBuckets() *Distribution_BucketOptions_Linear { - if x, ok := m.GetOptions().(*Distribution_BucketOptions_LinearBuckets); ok { - return x.LinearBuckets - } - return nil -} - -func (m *Distribution_BucketOptions) GetExponentialBuckets() *Distribution_BucketOptions_Exponential { - if x, ok := m.GetOptions().(*Distribution_BucketOptions_ExponentialBuckets); ok { - return x.ExponentialBuckets - } - return nil -} - -func (m *Distribution_BucketOptions) GetExplicitBuckets() *Distribution_BucketOptions_Explicit { - if x, ok := m.GetOptions().(*Distribution_BucketOptions_ExplicitBuckets); ok { - return x.ExplicitBuckets - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Distribution_BucketOptions) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Distribution_BucketOptions_LinearBuckets)(nil), - (*Distribution_BucketOptions_ExponentialBuckets)(nil), - (*Distribution_BucketOptions_ExplicitBuckets)(nil), - } -} - -// Specifies a linear sequence of buckets that all have the same width -// (except overflow and underflow). Each bucket represents a constant -// absolute uncertainty on the specific value in the bucket. -// -// There are `num_finite_buckets + 2` (= N) buckets. Bucket `i` has the -// following boundaries: -// -// Upper bound (0 <= i < N-1): offset + (width * i). -// Lower bound (1 <= i < N): offset + (width * (i - 1)). -type Distribution_BucketOptions_Linear struct { - // Must be greater than 0. - NumFiniteBuckets int32 `protobuf:"varint,1,opt,name=num_finite_buckets,json=numFiniteBuckets,proto3" json:"num_finite_buckets,omitempty"` - // Must be greater than 0. - Width float64 `protobuf:"fixed64,2,opt,name=width,proto3" json:"width,omitempty"` - // Lower bound of the first bucket. - Offset float64 `protobuf:"fixed64,3,opt,name=offset,proto3" json:"offset,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Distribution_BucketOptions_Linear) Reset() { *m = Distribution_BucketOptions_Linear{} } -func (m *Distribution_BucketOptions_Linear) String() string { return proto.CompactTextString(m) } -func (*Distribution_BucketOptions_Linear) ProtoMessage() {} -func (*Distribution_BucketOptions_Linear) Descriptor() ([]byte, []int) { - return fileDescriptor_0835ee0fd90bf943, []int{0, 1, 0} -} - -func (m *Distribution_BucketOptions_Linear) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Distribution_BucketOptions_Linear.Unmarshal(m, b) -} -func (m *Distribution_BucketOptions_Linear) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Distribution_BucketOptions_Linear.Marshal(b, m, deterministic) -} -func (m *Distribution_BucketOptions_Linear) XXX_Merge(src proto.Message) { - xxx_messageInfo_Distribution_BucketOptions_Linear.Merge(m, src) -} -func (m *Distribution_BucketOptions_Linear) XXX_Size() int { - return xxx_messageInfo_Distribution_BucketOptions_Linear.Size(m) -} -func (m *Distribution_BucketOptions_Linear) XXX_DiscardUnknown() { - xxx_messageInfo_Distribution_BucketOptions_Linear.DiscardUnknown(m) -} - -var xxx_messageInfo_Distribution_BucketOptions_Linear proto.InternalMessageInfo - -func (m *Distribution_BucketOptions_Linear) GetNumFiniteBuckets() int32 { - if m != nil { - return m.NumFiniteBuckets - } - return 0 -} - -func (m *Distribution_BucketOptions_Linear) GetWidth() float64 { - if m != nil { - return m.Width - } - return 0 -} - -func (m *Distribution_BucketOptions_Linear) GetOffset() float64 { - if m != nil { - return m.Offset - } - return 0 -} - -// Specifies an exponential sequence of buckets that have a width that is -// proportional to the value of the lower bound. Each bucket represents a -// constant relative uncertainty on a specific value in the bucket. -// -// There are `num_finite_buckets + 2` (= N) buckets. Bucket `i` has the -// following boundaries: -// -// Upper bound (0 <= i < N-1): scale * (growth_factor ^ i). -// Lower bound (1 <= i < N): scale * (growth_factor ^ (i - 1)). -type Distribution_BucketOptions_Exponential struct { - // Must be greater than 0. - NumFiniteBuckets int32 `protobuf:"varint,1,opt,name=num_finite_buckets,json=numFiniteBuckets,proto3" json:"num_finite_buckets,omitempty"` - // Must be greater than 1. - GrowthFactor float64 `protobuf:"fixed64,2,opt,name=growth_factor,json=growthFactor,proto3" json:"growth_factor,omitempty"` - // Must be greater than 0. - Scale float64 `protobuf:"fixed64,3,opt,name=scale,proto3" json:"scale,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Distribution_BucketOptions_Exponential) Reset() { - *m = Distribution_BucketOptions_Exponential{} -} -func (m *Distribution_BucketOptions_Exponential) String() string { return proto.CompactTextString(m) } -func (*Distribution_BucketOptions_Exponential) ProtoMessage() {} -func (*Distribution_BucketOptions_Exponential) Descriptor() ([]byte, []int) { - return fileDescriptor_0835ee0fd90bf943, []int{0, 1, 1} -} - -func (m *Distribution_BucketOptions_Exponential) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Distribution_BucketOptions_Exponential.Unmarshal(m, b) -} -func (m *Distribution_BucketOptions_Exponential) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Distribution_BucketOptions_Exponential.Marshal(b, m, deterministic) -} -func (m *Distribution_BucketOptions_Exponential) XXX_Merge(src proto.Message) { - xxx_messageInfo_Distribution_BucketOptions_Exponential.Merge(m, src) -} -func (m *Distribution_BucketOptions_Exponential) XXX_Size() int { - return xxx_messageInfo_Distribution_BucketOptions_Exponential.Size(m) -} -func (m *Distribution_BucketOptions_Exponential) XXX_DiscardUnknown() { - xxx_messageInfo_Distribution_BucketOptions_Exponential.DiscardUnknown(m) -} - -var xxx_messageInfo_Distribution_BucketOptions_Exponential proto.InternalMessageInfo - -func (m *Distribution_BucketOptions_Exponential) GetNumFiniteBuckets() int32 { - if m != nil { - return m.NumFiniteBuckets - } - return 0 -} - -func (m *Distribution_BucketOptions_Exponential) GetGrowthFactor() float64 { - if m != nil { - return m.GrowthFactor - } - return 0 -} - -func (m *Distribution_BucketOptions_Exponential) GetScale() float64 { - if m != nil { - return m.Scale - } - return 0 -} - -// Specifies a set of buckets with arbitrary widths. -// -// There are `size(bounds) + 1` (= N) buckets. Bucket `i` has the following -// boundaries: -// -// Upper bound (0 <= i < N-1): bounds[i] -// Lower bound (1 <= i < N); bounds[i - 1] -// -// The `bounds` field must contain at least one element. If `bounds` has -// only one element, then there are no finite buckets, and that single -// element is the common boundary of the overflow and underflow buckets. -type Distribution_BucketOptions_Explicit struct { - // The values must be monotonically increasing. - Bounds []float64 `protobuf:"fixed64,1,rep,packed,name=bounds,proto3" json:"bounds,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Distribution_BucketOptions_Explicit) Reset() { *m = Distribution_BucketOptions_Explicit{} } -func (m *Distribution_BucketOptions_Explicit) String() string { return proto.CompactTextString(m) } -func (*Distribution_BucketOptions_Explicit) ProtoMessage() {} -func (*Distribution_BucketOptions_Explicit) Descriptor() ([]byte, []int) { - return fileDescriptor_0835ee0fd90bf943, []int{0, 1, 2} -} - -func (m *Distribution_BucketOptions_Explicit) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Distribution_BucketOptions_Explicit.Unmarshal(m, b) -} -func (m *Distribution_BucketOptions_Explicit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Distribution_BucketOptions_Explicit.Marshal(b, m, deterministic) -} -func (m *Distribution_BucketOptions_Explicit) XXX_Merge(src proto.Message) { - xxx_messageInfo_Distribution_BucketOptions_Explicit.Merge(m, src) -} -func (m *Distribution_BucketOptions_Explicit) XXX_Size() int { - return xxx_messageInfo_Distribution_BucketOptions_Explicit.Size(m) -} -func (m *Distribution_BucketOptions_Explicit) XXX_DiscardUnknown() { - xxx_messageInfo_Distribution_BucketOptions_Explicit.DiscardUnknown(m) -} - -var xxx_messageInfo_Distribution_BucketOptions_Explicit proto.InternalMessageInfo - -func (m *Distribution_BucketOptions_Explicit) GetBounds() []float64 { - if m != nil { - return m.Bounds - } - return nil -} - -// Exemplars are example points that may be used to annotate aggregated -// distribution values. They are metadata that gives information about a -// particular value added to a Distribution bucket, such as a trace ID that -// was active when a value was added. They may contain further information, -// such as a example values and timestamps, origin, etc. -type Distribution_Exemplar struct { - // Value of the exemplar point. This value determines to which bucket the - // exemplar belongs. - Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` - // The observation (sampling) time of the above value. - Timestamp *timestamp.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Contextual information about the example value. Examples are: - // - // Trace: type.googleapis.com/google.monitoring.v3.SpanContext - // - // Literal string: type.googleapis.com/google.protobuf.StringValue - // - // Labels dropped during aggregation: - // type.googleapis.com/google.monitoring.v3.DroppedLabels - // - // There may be only a single attachment of any given message type in a - // single exemplar, and this is enforced by the system. - Attachments []*any.Any `protobuf:"bytes,3,rep,name=attachments,proto3" json:"attachments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Distribution_Exemplar) Reset() { *m = Distribution_Exemplar{} } -func (m *Distribution_Exemplar) String() string { return proto.CompactTextString(m) } -func (*Distribution_Exemplar) ProtoMessage() {} -func (*Distribution_Exemplar) Descriptor() ([]byte, []int) { - return fileDescriptor_0835ee0fd90bf943, []int{0, 2} -} - -func (m *Distribution_Exemplar) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Distribution_Exemplar.Unmarshal(m, b) -} -func (m *Distribution_Exemplar) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Distribution_Exemplar.Marshal(b, m, deterministic) -} -func (m *Distribution_Exemplar) XXX_Merge(src proto.Message) { - xxx_messageInfo_Distribution_Exemplar.Merge(m, src) -} -func (m *Distribution_Exemplar) XXX_Size() int { - return xxx_messageInfo_Distribution_Exemplar.Size(m) -} -func (m *Distribution_Exemplar) XXX_DiscardUnknown() { - xxx_messageInfo_Distribution_Exemplar.DiscardUnknown(m) -} - -var xxx_messageInfo_Distribution_Exemplar proto.InternalMessageInfo - -func (m *Distribution_Exemplar) GetValue() float64 { - if m != nil { - return m.Value - } - return 0 -} - -func (m *Distribution_Exemplar) GetTimestamp() *timestamp.Timestamp { - if m != nil { - return m.Timestamp - } - return nil -} - -func (m *Distribution_Exemplar) GetAttachments() []*any.Any { - if m != nil { - return m.Attachments - } - return nil -} - -func init() { - proto.RegisterType((*Distribution)(nil), "google.api.Distribution") - proto.RegisterType((*Distribution_Range)(nil), "google.api.Distribution.Range") - proto.RegisterType((*Distribution_BucketOptions)(nil), "google.api.Distribution.BucketOptions") - proto.RegisterType((*Distribution_BucketOptions_Linear)(nil), "google.api.Distribution.BucketOptions.Linear") - proto.RegisterType((*Distribution_BucketOptions_Exponential)(nil), "google.api.Distribution.BucketOptions.Exponential") - proto.RegisterType((*Distribution_BucketOptions_Explicit)(nil), "google.api.Distribution.BucketOptions.Explicit") - proto.RegisterType((*Distribution_Exemplar)(nil), "google.api.Distribution.Exemplar") -} - -func init() { proto.RegisterFile("google/api/distribution.proto", fileDescriptor_0835ee0fd90bf943) } - -var fileDescriptor_0835ee0fd90bf943 = []byte{ - // 631 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xed, 0x6a, 0xd4, 0x40, - 0x14, 0x6d, 0x9a, 0xdd, 0x6d, 0x7b, 0xb7, 0x5b, 0xeb, 0x58, 0x25, 0x06, 0xd4, 0xb5, 0x05, 0x59, - 0x50, 0xb3, 0xb0, 0x8a, 0x0a, 0xfe, 0x90, 0x6e, 0x3f, 0xac, 0xa0, 0xb4, 0x8c, 0xe2, 0x0f, 0x11, - 0xc2, 0x6c, 0x76, 0x92, 0x0e, 0x26, 0x33, 0x69, 0x32, 0x69, 0xb7, 0xaf, 0xe1, 0x23, 0xf8, 0x16, - 0xbe, 0x8a, 0x4f, 0x23, 0xf3, 0x91, 0x6e, 0x6a, 0x29, 0xd4, 0x7f, 0xb9, 0xf7, 0x9c, 0x7b, 0xce, - 0xbd, 0x73, 0x67, 0x02, 0x0f, 0x12, 0x21, 0x92, 0x94, 0x0e, 0x49, 0xce, 0x86, 0x53, 0x56, 0xca, - 0x82, 0x4d, 0x2a, 0xc9, 0x04, 0x0f, 0xf2, 0x42, 0x48, 0x81, 0xc0, 0xc0, 0x01, 0xc9, 0x99, 0x7f, - 0xdf, 0x52, 0x35, 0x32, 0xa9, 0xe2, 0x21, 0xe1, 0xe7, 0x86, 0xe6, 0x3f, 0xfa, 0x17, 0x92, 0x2c, - 0xa3, 0xa5, 0x24, 0x59, 0x6e, 0x08, 0x9b, 0x7f, 0x96, 0x61, 0x75, 0xb7, 0x21, 0x8f, 0x36, 0xa0, - 0x1d, 0x89, 0x8a, 0x4b, 0xcf, 0xe9, 0x3b, 0x03, 0x17, 0x9b, 0x00, 0x21, 0x68, 0x65, 0x94, 0x70, - 0x6f, 0xb1, 0xef, 0x0c, 0x1c, 0xac, 0xbf, 0xd1, 0x6b, 0xf0, 0xca, 0x2a, 0x0b, 0x45, 0x1c, 0x96, - 0x27, 0x15, 0x29, 0xe8, 0x34, 0x9c, 0xd2, 0x53, 0x46, 0x94, 0x8a, 0xe7, 0x6a, 0xde, 0xdd, 0xb2, - 0xca, 0x0e, 0xe3, 0xcf, 0x06, 0xdd, 0xad, 0x41, 0xf4, 0x12, 0xda, 0x05, 0xe1, 0x09, 0xf5, 0x5a, - 0x7d, 0x67, 0xd0, 0x1d, 0x3d, 0x0c, 0xe6, 0xb3, 0x04, 0xcd, 0x5e, 0x02, 0xac, 0x58, 0xd8, 0x90, - 0xd1, 0x27, 0x58, 0x9b, 0x54, 0xd1, 0x0f, 0x2a, 0x43, 0x91, 0x2b, 0xb4, 0xf4, 0x3a, 0xba, 0xfc, - 0xc9, 0xb5, 0xe5, 0x63, 0x4d, 0x3f, 0x34, 0x6c, 0xdc, 0x9b, 0x34, 0x43, 0xb4, 0x05, 0x36, 0x11, - 0xea, 0x09, 0x4b, 0x6f, 0xa9, 0xef, 0x0e, 0x5c, 0xbc, 0x6a, 0x92, 0x3b, 0x3a, 0x87, 0xde, 0xc1, - 0x0a, 0x9d, 0xd1, 0x2c, 0x4f, 0x49, 0x51, 0x7a, 0xd0, 0x77, 0x07, 0xdd, 0xd1, 0xe3, 0x6b, 0xed, - 0xf6, 0x2c, 0x13, 0xcf, 0x6b, 0xfc, 0xa7, 0xd0, 0xd6, 0x43, 0xa0, 0x75, 0x70, 0x33, 0xc6, 0xf5, - 0xa1, 0x3a, 0x58, 0x7d, 0xea, 0x0c, 0x99, 0xd9, 0x13, 0x55, 0x9f, 0xfe, 0xef, 0x16, 0xf4, 0x2e, - 0xf5, 0x8c, 0xbe, 0xc2, 0x5a, 0xca, 0x38, 0x25, 0x45, 0x68, 0xda, 0x2a, 0xb5, 0x40, 0x77, 0xf4, - 0xfc, 0x66, 0x33, 0x07, 0x1f, 0x75, 0xf1, 0xc1, 0x02, 0xee, 0x19, 0x19, 0x83, 0x96, 0x88, 0xc2, - 0x1d, 0x3a, 0xcb, 0x05, 0xa7, 0x5c, 0x32, 0x92, 0x5e, 0x88, 0x2f, 0x6a, 0xf1, 0xd1, 0x0d, 0xc5, - 0xf7, 0xe6, 0x0a, 0x07, 0x0b, 0x18, 0x35, 0x04, 0x6b, 0x9b, 0xef, 0xb0, 0x4e, 0x67, 0x79, 0xca, - 0x22, 0x26, 0x2f, 0x3c, 0x5c, 0xed, 0x31, 0xbc, 0xb9, 0x87, 0x2e, 0x3f, 0x58, 0xc0, 0xb7, 0x6a, - 0x29, 0xab, 0xee, 0x4f, 0xa1, 0x63, 0xe6, 0x43, 0xcf, 0x00, 0xf1, 0x2a, 0x0b, 0x63, 0xc6, 0x99, - 0xa4, 0x97, 0x8e, 0xaa, 0x8d, 0xd7, 0x79, 0x95, 0xed, 0x6b, 0xa0, 0xee, 0x6a, 0x03, 0xda, 0x67, - 0x6c, 0x2a, 0x8f, 0xed, 0xd1, 0x9b, 0x00, 0xdd, 0x83, 0x8e, 0x88, 0xe3, 0x92, 0x4a, 0x7b, 0x77, - 0x6d, 0xe4, 0x9f, 0x42, 0xb7, 0x31, 0xe8, 0x7f, 0x5a, 0x6d, 0x41, 0x2f, 0x29, 0xc4, 0x99, 0x3c, - 0x0e, 0x63, 0x12, 0x49, 0x51, 0x58, 0xcb, 0x55, 0x93, 0xdc, 0xd7, 0x39, 0xd5, 0x4f, 0x19, 0x91, - 0x94, 0x5a, 0x63, 0x13, 0xf8, 0x9b, 0xb0, 0x5c, 0x0f, 0xaf, 0x7a, 0x9b, 0x88, 0x8a, 0x4f, 0x95, - 0x91, 0xab, 0x7a, 0x33, 0xd1, 0x78, 0x05, 0x96, 0xec, 0x5b, 0xf0, 0x7f, 0x3a, 0x8a, 0x6f, 0xae, - 0x9d, 0x52, 0x3c, 0x25, 0x69, 0x45, 0xed, 0x75, 0x33, 0x01, 0x7a, 0x03, 0x2b, 0x17, 0xaf, 0xdf, - 0xae, 0xda, 0xaf, 0xd7, 0x50, 0xff, 0x1f, 0x82, 0x2f, 0x35, 0x03, 0xcf, 0xc9, 0xe8, 0x15, 0x74, - 0x89, 0x94, 0x24, 0x3a, 0xce, 0x28, 0xd7, 0x2b, 0x54, 0x0f, 0x61, 0xe3, 0x4a, 0xed, 0x36, 0x3f, - 0xc7, 0x4d, 0xe2, 0xf8, 0x04, 0xd6, 0x22, 0x91, 0x35, 0x56, 0x3d, 0xbe, 0xdd, 0xdc, 0xf5, 0x91, - 0x2a, 0x3c, 0x72, 0xbe, 0xed, 0x58, 0x42, 0x22, 0x52, 0xc2, 0x93, 0x40, 0x14, 0xc9, 0x30, 0xa1, - 0x5c, 0xcb, 0x0e, 0x0d, 0x44, 0x72, 0x56, 0x5e, 0xf9, 0x13, 0xbe, 0x6d, 0x06, 0xbf, 0x16, 0x5b, - 0xef, 0xb7, 0x8f, 0x3e, 0x4c, 0x3a, 0xba, 0xec, 0xc5, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x89, - 0xf1, 0xc2, 0x23, 0x3f, 0x05, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/api/label/label.pb.go b/vendor/google.golang.org/genproto/googleapis/api/label/label.pb.go deleted file mode 100644 index 8ecced45c..000000000 --- a/vendor/google.golang.org/genproto/googleapis/api/label/label.pb.go +++ /dev/null @@ -1,140 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/api/label.proto - -package label - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// Value types that can be used as label values. -type LabelDescriptor_ValueType int32 - -const ( - // A variable-length string. This is the default. - LabelDescriptor_STRING LabelDescriptor_ValueType = 0 - // Boolean; true or false. - LabelDescriptor_BOOL LabelDescriptor_ValueType = 1 - // A 64-bit signed integer. - LabelDescriptor_INT64 LabelDescriptor_ValueType = 2 -) - -var LabelDescriptor_ValueType_name = map[int32]string{ - 0: "STRING", - 1: "BOOL", - 2: "INT64", -} - -var LabelDescriptor_ValueType_value = map[string]int32{ - "STRING": 0, - "BOOL": 1, - "INT64": 2, -} - -func (x LabelDescriptor_ValueType) String() string { - return proto.EnumName(LabelDescriptor_ValueType_name, int32(x)) -} - -func (LabelDescriptor_ValueType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_f372a463e25ba151, []int{0, 0} -} - -// A description of a label. -type LabelDescriptor struct { - // The label key. - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - // The type of data that can be assigned to the label. - ValueType LabelDescriptor_ValueType `protobuf:"varint,2,opt,name=value_type,json=valueType,proto3,enum=google.api.LabelDescriptor_ValueType" json:"value_type,omitempty"` - // A human-readable description for the label. - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LabelDescriptor) Reset() { *m = LabelDescriptor{} } -func (m *LabelDescriptor) String() string { return proto.CompactTextString(m) } -func (*LabelDescriptor) ProtoMessage() {} -func (*LabelDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_f372a463e25ba151, []int{0} -} - -func (m *LabelDescriptor) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LabelDescriptor.Unmarshal(m, b) -} -func (m *LabelDescriptor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LabelDescriptor.Marshal(b, m, deterministic) -} -func (m *LabelDescriptor) XXX_Merge(src proto.Message) { - xxx_messageInfo_LabelDescriptor.Merge(m, src) -} -func (m *LabelDescriptor) XXX_Size() int { - return xxx_messageInfo_LabelDescriptor.Size(m) -} -func (m *LabelDescriptor) XXX_DiscardUnknown() { - xxx_messageInfo_LabelDescriptor.DiscardUnknown(m) -} - -var xxx_messageInfo_LabelDescriptor proto.InternalMessageInfo - -func (m *LabelDescriptor) GetKey() string { - if m != nil { - return m.Key - } - return "" -} - -func (m *LabelDescriptor) GetValueType() LabelDescriptor_ValueType { - if m != nil { - return m.ValueType - } - return LabelDescriptor_STRING -} - -func (m *LabelDescriptor) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func init() { - proto.RegisterEnum("google.api.LabelDescriptor_ValueType", LabelDescriptor_ValueType_name, LabelDescriptor_ValueType_value) - proto.RegisterType((*LabelDescriptor)(nil), "google.api.LabelDescriptor") -} - -func init() { proto.RegisterFile("google/api/label.proto", fileDescriptor_f372a463e25ba151) } - -var fileDescriptor_f372a463e25ba151 = []byte{ - // 252 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4b, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x4f, 0x2c, 0xc8, 0xd4, 0xcf, 0x49, 0x4c, 0x4a, 0xcd, 0xd1, 0x2b, 0x28, 0xca, - 0x2f, 0xc9, 0x17, 0xe2, 0x82, 0x88, 0xeb, 0x25, 0x16, 0x64, 0x2a, 0xed, 0x64, 0xe4, 0xe2, 0xf7, - 0x01, 0xc9, 0xb9, 0xa4, 0x16, 0x27, 0x17, 0x65, 0x16, 0x94, 0xe4, 0x17, 0x09, 0x09, 0x70, 0x31, - 0x67, 0xa7, 0x56, 0x4a, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x06, 0x81, 0x98, 0x42, 0x2e, 0x5c, 0x5c, - 0x65, 0x89, 0x39, 0xa5, 0xa9, 0xf1, 0x25, 0x95, 0x05, 0xa9, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0x7c, - 0x46, 0xaa, 0x7a, 0x08, 0x63, 0xf4, 0xd0, 0x8c, 0xd0, 0x0b, 0x03, 0xa9, 0x0e, 0xa9, 0x2c, 0x48, - 0x0d, 0xe2, 0x2c, 0x83, 0x31, 0x85, 0x14, 0xb8, 0xb8, 0x53, 0xa0, 0x4a, 0x32, 0xf3, 0xf3, 0x24, - 0x98, 0xc1, 0xe6, 0x23, 0x0b, 0x29, 0xe9, 0x70, 0x71, 0xc2, 0x75, 0x0a, 0x71, 0x71, 0xb1, 0x05, - 0x87, 0x04, 0x79, 0xfa, 0xb9, 0x0b, 0x30, 0x08, 0x71, 0x70, 0xb1, 0x38, 0xf9, 0xfb, 0xfb, 0x08, - 0x30, 0x0a, 0x71, 0x72, 0xb1, 0x7a, 0xfa, 0x85, 0x98, 0x99, 0x08, 0x30, 0x39, 0xc5, 0x73, 0xf1, - 0x25, 0xe7, 0xe7, 0x22, 0x39, 0xc3, 0x89, 0x0b, 0xec, 0x8e, 0x00, 0x90, 0x2f, 0x03, 0x18, 0xa3, - 0x4c, 0xa1, 0x32, 0xe9, 0xf9, 0x39, 0x89, 0x79, 0xe9, 0x7a, 0xf9, 0x45, 0xe9, 0xfa, 0xe9, 0xa9, - 0x79, 0xe0, 0x30, 0xd0, 0x87, 0x48, 0x25, 0x16, 0x64, 0x16, 0x23, 0x82, 0xc7, 0x1a, 0x4c, 0xfe, - 0x60, 0x64, 0x5c, 0xc4, 0xc4, 0xe2, 0xee, 0x18, 0xe0, 0x99, 0xc4, 0x06, 0x56, 0x6b, 0x0c, 0x08, - 0x00, 0x00, 0xff, 0xff, 0x57, 0x04, 0xaa, 0x1f, 0x49, 0x01, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/api/launch_stage.pb.go b/vendor/google.golang.org/genproto/googleapis/api/launch_stage.pb.go deleted file mode 100644 index 208ff134b..000000000 --- a/vendor/google.golang.org/genproto/googleapis/api/launch_stage.pb.go +++ /dev/null @@ -1,113 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/api/launch_stage.proto - -package api - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The launch stage as defined by [Google Cloud Platform -// Launch Stages](http://cloud.google.com/terms/launch-stages). -type LaunchStage int32 - -const ( - // Do not use this default value. - LaunchStage_LAUNCH_STAGE_UNSPECIFIED LaunchStage = 0 - // Early Access features are limited to a closed group of testers. To use - // these features, you must sign up in advance and sign a Trusted Tester - // agreement (which includes confidentiality provisions). These features may - // be unstable, changed in backward-incompatible ways, and are not - // guaranteed to be released. - LaunchStage_EARLY_ACCESS LaunchStage = 1 - // Alpha is a limited availability test for releases before they are cleared - // for widespread use. By Alpha, all significant design issues are resolved - // and we are in the process of verifying functionality. Alpha customers - // need to apply for access, agree to applicable terms, and have their - // projects whitelisted. Alpha releases don’t have to be feature complete, - // no SLAs are provided, and there are no technical support obligations, but - // they will be far enough along that customers can actually use them in - // test environments or for limited-use tests -- just like they would in - // normal production cases. - LaunchStage_ALPHA LaunchStage = 2 - // Beta is the point at which we are ready to open a release for any - // customer to use. There are no SLA or technical support obligations in a - // Beta release. Products will be complete from a feature perspective, but - // may have some open outstanding issues. Beta releases are suitable for - // limited production use cases. - LaunchStage_BETA LaunchStage = 3 - // GA features are open to all developers and are considered stable and - // fully qualified for production use. - LaunchStage_GA LaunchStage = 4 - // Deprecated features are scheduled to be shut down and removed. For more - // information, see the “Deprecation Policy” section of our [Terms of - // Service](https://cloud.google.com/terms/) - // and the [Google Cloud Platform Subject to the Deprecation - // Policy](https://cloud.google.com/terms/deprecation) documentation. - LaunchStage_DEPRECATED LaunchStage = 5 -) - -var LaunchStage_name = map[int32]string{ - 0: "LAUNCH_STAGE_UNSPECIFIED", - 1: "EARLY_ACCESS", - 2: "ALPHA", - 3: "BETA", - 4: "GA", - 5: "DEPRECATED", -} - -var LaunchStage_value = map[string]int32{ - "LAUNCH_STAGE_UNSPECIFIED": 0, - "EARLY_ACCESS": 1, - "ALPHA": 2, - "BETA": 3, - "GA": 4, - "DEPRECATED": 5, -} - -func (x LaunchStage) String() string { - return proto.EnumName(LaunchStage_name, int32(x)) -} - -func (LaunchStage) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_6b5f68b6c1cefff8, []int{0} -} - -func init() { - proto.RegisterEnum("google.api.LaunchStage", LaunchStage_name, LaunchStage_value) -} - -func init() { proto.RegisterFile("google/api/launch_stage.proto", fileDescriptor_6b5f68b6c1cefff8) } - -var fileDescriptor_6b5f68b6c1cefff8 = []byte{ - // 225 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x8f, 0xc1, 0x4a, 0xc3, 0x40, - 0x14, 0x45, 0x6d, 0x4c, 0x8b, 0x3e, 0xa5, 0x3c, 0x66, 0xe5, 0x42, 0x7f, 0x40, 0x30, 0x59, 0xb8, - 0x74, 0xf5, 0x32, 0x79, 0xa6, 0x81, 0x50, 0x86, 0x4e, 0xba, 0xb0, 0x9b, 0x30, 0x96, 0x30, 0x8e, - 0xc4, 0xcc, 0xd0, 0xd6, 0x1f, 0xf2, 0x4b, 0x25, 0x89, 0x60, 0xd7, 0xe7, 0xc0, 0x3d, 0x17, 0x1e, - 0xac, 0xf7, 0xb6, 0x6b, 0x53, 0x13, 0x5c, 0xda, 0x99, 0xef, 0x7e, 0xff, 0xd1, 0x1c, 0x4f, 0xc6, - 0xb6, 0x49, 0x38, 0xf8, 0x93, 0x17, 0x30, 0xe1, 0xc4, 0x04, 0xf7, 0xf8, 0x09, 0x37, 0xd5, 0x68, - 0xe8, 0x41, 0x10, 0xf7, 0x70, 0x57, 0xd1, 0x76, 0x2d, 0x57, 0x8d, 0xae, 0xa9, 0xe0, 0x66, 0xbb, - 0xd6, 0x8a, 0x65, 0xf9, 0x5a, 0x72, 0x8e, 0x17, 0x02, 0xe1, 0x96, 0x69, 0x53, 0xbd, 0x35, 0x24, - 0x25, 0x6b, 0x8d, 0x33, 0x71, 0x0d, 0x73, 0xaa, 0xd4, 0x8a, 0x30, 0x12, 0x57, 0x10, 0x67, 0x5c, - 0x13, 0x5e, 0x8a, 0x05, 0x44, 0x05, 0x61, 0x2c, 0x96, 0x00, 0x39, 0xab, 0x0d, 0x4b, 0xaa, 0x39, - 0xc7, 0x79, 0xb6, 0x83, 0xe5, 0xde, 0x7f, 0x25, 0xff, 0xeb, 0x19, 0x9e, 0x6d, 0xab, 0xa1, 0x4d, - 0xcd, 0x76, 0x4f, 0x7f, 0xdc, 0xfa, 0xce, 0xf4, 0x36, 0xf1, 0x07, 0x9b, 0xda, 0xb6, 0x1f, 0xcb, - 0xd3, 0x09, 0x99, 0xe0, 0x8e, 0xc3, 0xb7, 0x17, 0x13, 0xdc, 0x4f, 0x14, 0x17, 0xa4, 0xca, 0xf7, - 0xc5, 0x28, 0x3c, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x8e, 0xd5, 0x39, 0x1a, 0xfb, 0x00, 0x00, - 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/api/metric/metric.pb.go b/vendor/google.golang.org/genproto/googleapis/api/metric/metric.pb.go deleted file mode 100644 index 2d10759f7..000000000 --- a/vendor/google.golang.org/genproto/googleapis/api/metric/metric.pb.go +++ /dev/null @@ -1,535 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/api/metric.proto - -package metric - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - duration "github.com/golang/protobuf/ptypes/duration" - api "google.golang.org/genproto/googleapis/api" - label "google.golang.org/genproto/googleapis/api/label" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The kind of measurement. It describes how the data is reported. -type MetricDescriptor_MetricKind int32 - -const ( - // Do not use this default value. - MetricDescriptor_METRIC_KIND_UNSPECIFIED MetricDescriptor_MetricKind = 0 - // An instantaneous measurement of a value. - MetricDescriptor_GAUGE MetricDescriptor_MetricKind = 1 - // The change in a value during a time interval. - MetricDescriptor_DELTA MetricDescriptor_MetricKind = 2 - // A value accumulated over a time interval. Cumulative - // measurements in a time series should have the same start time - // and increasing end times, until an event resets the cumulative - // value to zero and sets a new start time for the following - // points. - MetricDescriptor_CUMULATIVE MetricDescriptor_MetricKind = 3 -) - -var MetricDescriptor_MetricKind_name = map[int32]string{ - 0: "METRIC_KIND_UNSPECIFIED", - 1: "GAUGE", - 2: "DELTA", - 3: "CUMULATIVE", -} - -var MetricDescriptor_MetricKind_value = map[string]int32{ - "METRIC_KIND_UNSPECIFIED": 0, - "GAUGE": 1, - "DELTA": 2, - "CUMULATIVE": 3, -} - -func (x MetricDescriptor_MetricKind) String() string { - return proto.EnumName(MetricDescriptor_MetricKind_name, int32(x)) -} - -func (MetricDescriptor_MetricKind) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_927eaac1a24f8abb, []int{0, 0} -} - -// The value type of a metric. -type MetricDescriptor_ValueType int32 - -const ( - // Do not use this default value. - MetricDescriptor_VALUE_TYPE_UNSPECIFIED MetricDescriptor_ValueType = 0 - // The value is a boolean. - // This value type can be used only if the metric kind is `GAUGE`. - MetricDescriptor_BOOL MetricDescriptor_ValueType = 1 - // The value is a signed 64-bit integer. - MetricDescriptor_INT64 MetricDescriptor_ValueType = 2 - // The value is a double precision floating point number. - MetricDescriptor_DOUBLE MetricDescriptor_ValueType = 3 - // The value is a text string. - // This value type can be used only if the metric kind is `GAUGE`. - MetricDescriptor_STRING MetricDescriptor_ValueType = 4 - // The value is a [`Distribution`][google.api.Distribution]. - MetricDescriptor_DISTRIBUTION MetricDescriptor_ValueType = 5 - // The value is money. - MetricDescriptor_MONEY MetricDescriptor_ValueType = 6 -) - -var MetricDescriptor_ValueType_name = map[int32]string{ - 0: "VALUE_TYPE_UNSPECIFIED", - 1: "BOOL", - 2: "INT64", - 3: "DOUBLE", - 4: "STRING", - 5: "DISTRIBUTION", - 6: "MONEY", -} - -var MetricDescriptor_ValueType_value = map[string]int32{ - "VALUE_TYPE_UNSPECIFIED": 0, - "BOOL": 1, - "INT64": 2, - "DOUBLE": 3, - "STRING": 4, - "DISTRIBUTION": 5, - "MONEY": 6, -} - -func (x MetricDescriptor_ValueType) String() string { - return proto.EnumName(MetricDescriptor_ValueType_name, int32(x)) -} - -func (MetricDescriptor_ValueType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_927eaac1a24f8abb, []int{0, 1} -} - -// Defines a metric type and its schema. Once a metric descriptor is created, -// deleting or altering it stops data collection and makes the metric type's -// existing data unusable. -type MetricDescriptor struct { - // The resource name of the metric descriptor. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The metric type, including its DNS name prefix. The type is not - // URL-encoded. All user-defined metric types have the DNS name - // `custom.googleapis.com` or `external.googleapis.com`. Metric types should - // use a natural hierarchical grouping. For example: - // - // "custom.googleapis.com/invoice/paid/amount" - // "external.googleapis.com/prometheus/up" - // "appengine.googleapis.com/http/server/response_latencies" - Type string `protobuf:"bytes,8,opt,name=type,proto3" json:"type,omitempty"` - // The set of labels that can be used to describe a specific - // instance of this metric type. For example, the - // `appengine.googleapis.com/http/server/response_latencies` metric - // type has a label for the HTTP response code, `response_code`, so - // you can look at latencies for successful responses or just - // for responses that failed. - Labels []*label.LabelDescriptor `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty"` - // Whether the metric records instantaneous values, changes to a value, etc. - // Some combinations of `metric_kind` and `value_type` might not be supported. - MetricKind MetricDescriptor_MetricKind `protobuf:"varint,3,opt,name=metric_kind,json=metricKind,proto3,enum=google.api.MetricDescriptor_MetricKind" json:"metric_kind,omitempty"` - // Whether the measurement is an integer, a floating-point number, etc. - // Some combinations of `metric_kind` and `value_type` might not be supported. - ValueType MetricDescriptor_ValueType `protobuf:"varint,4,opt,name=value_type,json=valueType,proto3,enum=google.api.MetricDescriptor_ValueType" json:"value_type,omitempty"` - // The units in which the metric value is reported. It is only applicable - // if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The `unit` - // defines the representation of the stored metric values. - // - // Different systems may scale the values to be more easily displayed (so a - // value of `0.02KBy` _might_ be displayed as `20By`, and a value of - // `3523KBy` _might_ be displayed as `3.5MBy`). However, if the `unit` is - // `KBy`, then the value of the metric is always in thousands of bytes, no - // matter how it may be displayed.. - // - // If you want a custom metric to record the exact number of CPU-seconds used - // by a job, you can create an `INT64 CUMULATIVE` metric whose `unit` is - // `s{CPU}` (or equivalently `1s{CPU}` or just `s`). If the job uses 12,005 - // CPU-seconds, then the value is written as `12005`. - // - // Alternatively, if you want a custome metric to record data in a more - // granular way, you can create a `DOUBLE CUMULATIVE` metric whose `unit` is - // `ks{CPU}`, and then write the value `12.005` (which is `12005/1000`), - // or use `Kis{CPU}` and write `11.723` (which is `12005/1024`). - // - // The supported units are a subset of [The Unified Code for Units of - // Measure](http://unitsofmeasure.org/ucum.html) standard: - // - // **Basic units (UNIT)** - // - // * `bit` bit - // * `By` byte - // * `s` second - // * `min` minute - // * `h` hour - // * `d` day - // - // **Prefixes (PREFIX)** - // - // * `k` kilo (10^3) - // * `M` mega (10^6) - // * `G` giga (10^9) - // * `T` tera (10^12) - // * `P` peta (10^15) - // * `E` exa (10^18) - // * `Z` zetta (10^21) - // * `Y` yotta (10^24) - // - // * `m` milli (10^-3) - // * `u` micro (10^-6) - // * `n` nano (10^-9) - // * `p` pico (10^-12) - // * `f` femto (10^-15) - // * `a` atto (10^-18) - // * `z` zepto (10^-21) - // * `y` yocto (10^-24) - // - // * `Ki` kibi (2^10) - // * `Mi` mebi (2^20) - // * `Gi` gibi (2^30) - // * `Ti` tebi (2^40) - // * `Pi` pebi (2^50) - // - // **Grammar** - // - // The grammar also includes these connectors: - // - // * `/` division or ratio (as an infix operator). For examples, - // `kBy/{email}` or `MiBy/10ms` (although you should almost never - // have `/s` in a metric `unit`; rates should always be computed at - // query time from the underlying cumulative or delta value). - // * `.` multiplication or composition (as an infix operator). For - // examples, `GBy.d` or `k{watt}.h`. - // - // The grammar for a unit is as follows: - // - // Expression = Component { "." Component } { "/" Component } ; - // - // Component = ( [ PREFIX ] UNIT | "%" ) [ Annotation ] - // | Annotation - // | "1" - // ; - // - // Annotation = "{" NAME "}" ; - // - // Notes: - // - // * `Annotation` is just a comment if it follows a `UNIT`. If the annotation - // is used alone, then the unit is equivalent to `1`. For examples, - // `{request}/s == 1/s`, `By{transmitted}/s == By/s`. - // * `NAME` is a sequence of non-blank printable ASCII characters not - // containing `{` or `}`. - // * `1` represents a unitary [dimensionless - // unit](https://en.wikipedia.org/wiki/Dimensionless_quantity) of 1, such - // as in `1/s`. It is typically used when none of the basic units are - // appropriate. For example, "new users per day" can be represented as - // `1/d` or `{new-users}/d` (and a metric value `5` would mean "5 new - // users). Alternatively, "thousands of page views per day" would be - // represented as `1000/d` or `k1/d` or `k{page_views}/d` (and a metric - // value of `5.3` would mean "5300 page views per day"). - // * `%` represents dimensionless value of 1/100, and annotates values giving - // a percentage (so the metric values are typically in the range of 0..100, - // and a metric value `3` means "3 percent"). - // * `10^2.%` indicates a metric contains a ratio, typically in the range - // 0..1, that will be multiplied by 100 and displayed as a percentage - // (so a metric value `0.03` means "3 percent"). - // - Unit string `protobuf:"bytes,5,opt,name=unit,proto3" json:"unit,omitempty"` - // A detailed description of the metric, which can be used in documentation. - Description string `protobuf:"bytes,6,opt,name=description,proto3" json:"description,omitempty"` - // A concise name for the metric, which can be displayed in user interfaces. - // Use sentence case without an ending period, for example "Request count". - // This field is optional but it is recommended to be set for any metrics - // associated with user-visible concepts, such as Quota. - DisplayName string `protobuf:"bytes,7,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // Optional. Metadata which can be used to guide usage of the metric. - Metadata *MetricDescriptor_MetricDescriptorMetadata `protobuf:"bytes,10,opt,name=metadata,proto3" json:"metadata,omitempty"` - // Optional. The launch stage of the metric definition. - LaunchStage api.LaunchStage `protobuf:"varint,12,opt,name=launch_stage,json=launchStage,proto3,enum=google.api.LaunchStage" json:"launch_stage,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MetricDescriptor) Reset() { *m = MetricDescriptor{} } -func (m *MetricDescriptor) String() string { return proto.CompactTextString(m) } -func (*MetricDescriptor) ProtoMessage() {} -func (*MetricDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_927eaac1a24f8abb, []int{0} -} - -func (m *MetricDescriptor) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MetricDescriptor.Unmarshal(m, b) -} -func (m *MetricDescriptor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MetricDescriptor.Marshal(b, m, deterministic) -} -func (m *MetricDescriptor) XXX_Merge(src proto.Message) { - xxx_messageInfo_MetricDescriptor.Merge(m, src) -} -func (m *MetricDescriptor) XXX_Size() int { - return xxx_messageInfo_MetricDescriptor.Size(m) -} -func (m *MetricDescriptor) XXX_DiscardUnknown() { - xxx_messageInfo_MetricDescriptor.DiscardUnknown(m) -} - -var xxx_messageInfo_MetricDescriptor proto.InternalMessageInfo - -func (m *MetricDescriptor) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *MetricDescriptor) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *MetricDescriptor) GetLabels() []*label.LabelDescriptor { - if m != nil { - return m.Labels - } - return nil -} - -func (m *MetricDescriptor) GetMetricKind() MetricDescriptor_MetricKind { - if m != nil { - return m.MetricKind - } - return MetricDescriptor_METRIC_KIND_UNSPECIFIED -} - -func (m *MetricDescriptor) GetValueType() MetricDescriptor_ValueType { - if m != nil { - return m.ValueType - } - return MetricDescriptor_VALUE_TYPE_UNSPECIFIED -} - -func (m *MetricDescriptor) GetUnit() string { - if m != nil { - return m.Unit - } - return "" -} - -func (m *MetricDescriptor) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *MetricDescriptor) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -func (m *MetricDescriptor) GetMetadata() *MetricDescriptor_MetricDescriptorMetadata { - if m != nil { - return m.Metadata - } - return nil -} - -func (m *MetricDescriptor) GetLaunchStage() api.LaunchStage { - if m != nil { - return m.LaunchStage - } - return api.LaunchStage_LAUNCH_STAGE_UNSPECIFIED -} - -// Additional annotations that can be used to guide the usage of a metric. -type MetricDescriptor_MetricDescriptorMetadata struct { - // Deprecated. Please use the MetricDescriptor.launch_stage instead. - // The launch stage of the metric definition. - LaunchStage api.LaunchStage `protobuf:"varint,1,opt,name=launch_stage,json=launchStage,proto3,enum=google.api.LaunchStage" json:"launch_stage,omitempty"` // Deprecated: Do not use. - // The sampling period of metric data points. For metrics which are written - // periodically, consecutive data points are stored at this time interval, - // excluding data loss due to errors. Metrics with a higher granularity have - // a smaller sampling period. - SamplePeriod *duration.Duration `protobuf:"bytes,2,opt,name=sample_period,json=samplePeriod,proto3" json:"sample_period,omitempty"` - // The delay of data points caused by ingestion. Data points older than this - // age are guaranteed to be ingested and available to be read, excluding - // data loss due to errors. - IngestDelay *duration.Duration `protobuf:"bytes,3,opt,name=ingest_delay,json=ingestDelay,proto3" json:"ingest_delay,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MetricDescriptor_MetricDescriptorMetadata) Reset() { - *m = MetricDescriptor_MetricDescriptorMetadata{} -} -func (m *MetricDescriptor_MetricDescriptorMetadata) String() string { return proto.CompactTextString(m) } -func (*MetricDescriptor_MetricDescriptorMetadata) ProtoMessage() {} -func (*MetricDescriptor_MetricDescriptorMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_927eaac1a24f8abb, []int{0, 0} -} - -func (m *MetricDescriptor_MetricDescriptorMetadata) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MetricDescriptor_MetricDescriptorMetadata.Unmarshal(m, b) -} -func (m *MetricDescriptor_MetricDescriptorMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MetricDescriptor_MetricDescriptorMetadata.Marshal(b, m, deterministic) -} -func (m *MetricDescriptor_MetricDescriptorMetadata) XXX_Merge(src proto.Message) { - xxx_messageInfo_MetricDescriptor_MetricDescriptorMetadata.Merge(m, src) -} -func (m *MetricDescriptor_MetricDescriptorMetadata) XXX_Size() int { - return xxx_messageInfo_MetricDescriptor_MetricDescriptorMetadata.Size(m) -} -func (m *MetricDescriptor_MetricDescriptorMetadata) XXX_DiscardUnknown() { - xxx_messageInfo_MetricDescriptor_MetricDescriptorMetadata.DiscardUnknown(m) -} - -var xxx_messageInfo_MetricDescriptor_MetricDescriptorMetadata proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *MetricDescriptor_MetricDescriptorMetadata) GetLaunchStage() api.LaunchStage { - if m != nil { - return m.LaunchStage - } - return api.LaunchStage_LAUNCH_STAGE_UNSPECIFIED -} - -func (m *MetricDescriptor_MetricDescriptorMetadata) GetSamplePeriod() *duration.Duration { - if m != nil { - return m.SamplePeriod - } - return nil -} - -func (m *MetricDescriptor_MetricDescriptorMetadata) GetIngestDelay() *duration.Duration { - if m != nil { - return m.IngestDelay - } - return nil -} - -// A specific metric, identified by specifying values for all of the -// labels of a [`MetricDescriptor`][google.api.MetricDescriptor]. -type Metric struct { - // An existing metric type, see [google.api.MetricDescriptor][google.api.MetricDescriptor]. - // For example, `custom.googleapis.com/invoice/paid/amount`. - Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` - // The set of label values that uniquely identify this metric. All - // labels listed in the `MetricDescriptor` must be assigned values. - Labels map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Metric) Reset() { *m = Metric{} } -func (m *Metric) String() string { return proto.CompactTextString(m) } -func (*Metric) ProtoMessage() {} -func (*Metric) Descriptor() ([]byte, []int) { - return fileDescriptor_927eaac1a24f8abb, []int{1} -} - -func (m *Metric) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Metric.Unmarshal(m, b) -} -func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Metric.Marshal(b, m, deterministic) -} -func (m *Metric) XXX_Merge(src proto.Message) { - xxx_messageInfo_Metric.Merge(m, src) -} -func (m *Metric) XXX_Size() int { - return xxx_messageInfo_Metric.Size(m) -} -func (m *Metric) XXX_DiscardUnknown() { - xxx_messageInfo_Metric.DiscardUnknown(m) -} - -var xxx_messageInfo_Metric proto.InternalMessageInfo - -func (m *Metric) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *Metric) GetLabels() map[string]string { - if m != nil { - return m.Labels - } - return nil -} - -func init() { - proto.RegisterEnum("google.api.MetricDescriptor_MetricKind", MetricDescriptor_MetricKind_name, MetricDescriptor_MetricKind_value) - proto.RegisterEnum("google.api.MetricDescriptor_ValueType", MetricDescriptor_ValueType_name, MetricDescriptor_ValueType_value) - proto.RegisterType((*MetricDescriptor)(nil), "google.api.MetricDescriptor") - proto.RegisterType((*MetricDescriptor_MetricDescriptorMetadata)(nil), "google.api.MetricDescriptor.MetricDescriptorMetadata") - proto.RegisterType((*Metric)(nil), "google.api.Metric") - proto.RegisterMapType((map[string]string)(nil), "google.api.Metric.LabelsEntry") -} - -func init() { proto.RegisterFile("google/api/metric.proto", fileDescriptor_927eaac1a24f8abb) } - -var fileDescriptor_927eaac1a24f8abb = []byte{ - // 661 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xdd, 0x6e, 0xd3, 0x30, - 0x14, 0x26, 0xe9, 0xcf, 0xd6, 0x93, 0x32, 0x45, 0x16, 0xda, 0x42, 0x27, 0xa6, 0xd2, 0x0b, 0xe8, - 0x55, 0x2b, 0x6d, 0x30, 0x60, 0xa0, 0x49, 0xed, 0x12, 0x4a, 0xb4, 0x36, 0x2d, 0x59, 0x32, 0x69, - 0xdc, 0x44, 0x5e, 0x63, 0x42, 0xb4, 0x34, 0x09, 0x49, 0x3a, 0xa9, 0x4f, 0xc0, 0x25, 0xef, 0xc0, - 0x53, 0xf1, 0x38, 0xc8, 0x76, 0xda, 0x66, 0x45, 0x54, 0x5c, 0xe5, 0xf8, 0xfb, 0xbe, 0xf3, 0xd9, - 0xc7, 0x3e, 0x27, 0x70, 0xe0, 0x45, 0x91, 0x17, 0x90, 0x2e, 0x8e, 0xfd, 0xee, 0x8c, 0x64, 0x89, - 0x3f, 0xed, 0xc4, 0x49, 0x94, 0x45, 0x08, 0x38, 0xd1, 0xc1, 0xb1, 0xdf, 0xd8, 0x2f, 0x88, 0x02, - 0x7c, 0x4b, 0x02, 0xae, 0x69, 0x3c, 0x7b, 0x80, 0xcf, 0xc3, 0xe9, 0x37, 0x27, 0xcd, 0xb0, 0x47, - 0x72, 0xfa, 0x28, 0xa7, 0xd9, 0xea, 0x76, 0xfe, 0xb5, 0xeb, 0xce, 0x13, 0x9c, 0xf9, 0x51, 0xc8, - 0xf9, 0xd6, 0x8f, 0x1d, 0x90, 0x47, 0x6c, 0x4f, 0x95, 0xa4, 0xd3, 0xc4, 0x8f, 0xb3, 0x28, 0x41, - 0x08, 0xca, 0x21, 0x9e, 0x11, 0x45, 0x68, 0x0a, 0xed, 0x9a, 0xc9, 0x62, 0x8a, 0x65, 0x8b, 0x98, - 0x28, 0xbb, 0x1c, 0xa3, 0x31, 0x3a, 0x81, 0x2a, 0x3b, 0x4a, 0xaa, 0x88, 0xcd, 0x52, 0x5b, 0x3a, - 0x3e, 0xec, 0xac, 0x0f, 0xdc, 0x19, 0x52, 0x66, 0x6d, 0x6a, 0xe6, 0x52, 0xf4, 0x09, 0x24, 0x5e, - 0xa4, 0x73, 0xe7, 0x87, 0xae, 0x52, 0x6a, 0x0a, 0xed, 0xbd, 0xe3, 0x97, 0xc5, 0xcc, 0xcd, 0xf3, - 0xe4, 0xc0, 0xa5, 0x1f, 0xba, 0x26, 0xcc, 0x56, 0x31, 0xd2, 0x00, 0xee, 0x71, 0x30, 0x27, 0x0e, - 0x3b, 0x58, 0x99, 0x19, 0xbd, 0xd8, 0x6a, 0x74, 0x4d, 0xe5, 0xd6, 0x22, 0x26, 0x66, 0xed, 0x7e, - 0x19, 0xd2, 0xca, 0xe6, 0xa1, 0x9f, 0x29, 0x15, 0x5e, 0x19, 0x8d, 0x51, 0x13, 0x24, 0x37, 0x4f, - 0xf3, 0xa3, 0x50, 0xa9, 0x32, 0xaa, 0x08, 0xa1, 0xe7, 0x50, 0x77, 0xfd, 0x34, 0x0e, 0xf0, 0xc2, - 0x61, 0x77, 0xb5, 0x93, 0x4b, 0x38, 0x66, 0xd0, 0x2b, 0xfb, 0x0c, 0xbb, 0x33, 0x92, 0x61, 0x17, - 0x67, 0x58, 0x81, 0xa6, 0xd0, 0x96, 0x8e, 0x5f, 0xff, 0x47, 0x99, 0x6b, 0x60, 0x94, 0x27, 0x9b, - 0x2b, 0x1b, 0x74, 0x06, 0xf5, 0xe2, 0x23, 0x2b, 0x75, 0x56, 0xf4, 0xc1, 0xc3, 0x7b, 0xa7, 0xfc, - 0x15, 0xa5, 0x4d, 0x29, 0x58, 0x2f, 0x1a, 0xbf, 0x05, 0x50, 0xfe, 0xb5, 0x05, 0x3a, 0xdf, 0x30, - 0x16, 0xb6, 0x1a, 0xf7, 0x45, 0x45, 0x78, 0x60, 0x8e, 0xce, 0xe1, 0x71, 0x8a, 0x67, 0x71, 0x40, - 0x9c, 0x98, 0x24, 0x7e, 0xe4, 0x2a, 0x22, 0x2b, 0xf8, 0xe9, 0xd2, 0x60, 0xd9, 0x7f, 0x1d, 0x35, - 0xef, 0x3f, 0xb3, 0xce, 0xf5, 0x13, 0x26, 0x47, 0x1f, 0xa0, 0xee, 0x87, 0x1e, 0x49, 0x33, 0xc7, - 0x25, 0x01, 0x5e, 0xb0, 0xb6, 0xd8, 0x9a, 0x2e, 0x71, 0xb9, 0x4a, 0xd5, 0xad, 0x31, 0xc0, 0xba, - 0x47, 0xd0, 0x21, 0x1c, 0x8c, 0x34, 0xcb, 0xd4, 0x2f, 0x9c, 0x4b, 0xdd, 0x50, 0x1d, 0xdb, 0xb8, - 0x9a, 0x68, 0x17, 0xfa, 0x47, 0x5d, 0x53, 0xe5, 0x47, 0xa8, 0x06, 0x95, 0x41, 0xcf, 0x1e, 0x68, - 0xb2, 0x40, 0x43, 0x55, 0x1b, 0x5a, 0x3d, 0x59, 0x44, 0x7b, 0x00, 0x17, 0xf6, 0xc8, 0x1e, 0xf6, - 0x2c, 0xfd, 0x5a, 0x93, 0x4b, 0xad, 0xef, 0x50, 0x5b, 0xf5, 0x0a, 0x6a, 0xc0, 0xfe, 0x75, 0x6f, - 0x68, 0x6b, 0x8e, 0x75, 0x33, 0xd1, 0x36, 0xec, 0x76, 0xa1, 0xdc, 0x1f, 0x8f, 0x87, 0xdc, 0x4d, - 0x37, 0xac, 0xd3, 0x57, 0xb2, 0x88, 0x00, 0xaa, 0xea, 0xd8, 0xee, 0x0f, 0x35, 0xb9, 0x44, 0xe3, - 0x2b, 0xcb, 0xd4, 0x8d, 0x81, 0x5c, 0x46, 0x32, 0xd4, 0x55, 0x9d, 0xae, 0xfa, 0xb6, 0xa5, 0x8f, - 0x0d, 0xb9, 0x42, 0x93, 0x46, 0x63, 0x43, 0xbb, 0x91, 0xab, 0xad, 0x9f, 0x02, 0x54, 0x79, 0x11, - 0xab, 0x59, 0x2b, 0x15, 0x66, 0xed, 0x74, 0x63, 0xd6, 0x8e, 0xfe, 0x6e, 0x25, 0x3e, 0x72, 0xa9, - 0x16, 0x66, 0xc9, 0x62, 0x39, 0x6e, 0x8d, 0x77, 0x20, 0x15, 0x60, 0x24, 0x43, 0xe9, 0x8e, 0x2c, - 0xf2, 0xc9, 0xa6, 0x21, 0x7a, 0x02, 0x15, 0x36, 0x0b, 0xec, 0xc5, 0x6a, 0x26, 0x5f, 0x9c, 0x89, - 0x6f, 0x85, 0xbe, 0x03, 0x7b, 0xd3, 0x68, 0x56, 0xd8, 0xa7, 0x2f, 0xf1, 0x8d, 0x26, 0xf4, 0x35, - 0x26, 0xc2, 0x97, 0x37, 0x39, 0xe5, 0x45, 0x01, 0x0e, 0xbd, 0x4e, 0x94, 0x78, 0x5d, 0x8f, 0x84, - 0xec, 0xad, 0xba, 0x9c, 0xc2, 0xb1, 0x9f, 0x16, 0xfe, 0x6b, 0xef, 0xf9, 0xe7, 0x97, 0x58, 0x1e, - 0xf4, 0x26, 0xfa, 0x6d, 0x95, 0x49, 0x4f, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x9a, 0x6a, - 0xfb, 0x01, 0x05, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/api/monitoredres/monitored_resource.pb.go b/vendor/google.golang.org/genproto/googleapis/api/monitoredres/monitored_resource.pb.go deleted file mode 100644 index d2ffbd4e0..000000000 --- a/vendor/google.golang.org/genproto/googleapis/api/monitoredres/monitored_resource.pb.go +++ /dev/null @@ -1,306 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/api/monitored_resource.proto - -package monitoredres - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - _struct "github.com/golang/protobuf/ptypes/struct" - api "google.golang.org/genproto/googleapis/api" - label "google.golang.org/genproto/googleapis/api/label" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// An object that describes the schema of a [MonitoredResource][google.api.MonitoredResource] object using a -// type name and a set of labels. For example, the monitored resource -// descriptor for Google Compute Engine VM instances has a type of -// `"gce_instance"` and specifies the use of the labels `"instance_id"` and -// `"zone"` to identify particular VM instances. -// -// Different APIs can support different monitored resource types. APIs generally -// provide a `list` method that returns the monitored resource descriptors used -// by the API. -type MonitoredResourceDescriptor struct { - // Optional. The resource name of the monitored resource descriptor: - // `"projects/{project_id}/monitoredResourceDescriptors/{type}"` where - // {type} is the value of the `type` field in this object and - // {project_id} is a project ID that provides API-specific context for - // accessing the type. APIs that do not use project information can use the - // resource name format `"monitoredResourceDescriptors/{type}"`. - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - // Required. The monitored resource type. For example, the type - // `"cloudsql_database"` represents databases in Google Cloud SQL. - // The maximum length of this value is 256 characters. - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - // Optional. A concise name for the monitored resource type that might be - // displayed in user interfaces. It should be a Title Cased Noun Phrase, - // without any article or other determiners. For example, - // `"Google Cloud SQL Database"`. - DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // Optional. A detailed description of the monitored resource type that might - // be used in documentation. - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - // Required. A set of labels used to describe instances of this monitored - // resource type. For example, an individual Google Cloud SQL database is - // identified by values for the labels `"database_id"` and `"zone"`. - Labels []*label.LabelDescriptor `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` - // Optional. The launch stage of the monitored resource definition. - LaunchStage api.LaunchStage `protobuf:"varint,7,opt,name=launch_stage,json=launchStage,proto3,enum=google.api.LaunchStage" json:"launch_stage,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MonitoredResourceDescriptor) Reset() { *m = MonitoredResourceDescriptor{} } -func (m *MonitoredResourceDescriptor) String() string { return proto.CompactTextString(m) } -func (*MonitoredResourceDescriptor) ProtoMessage() {} -func (*MonitoredResourceDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_6cd8bd738b08f2bf, []int{0} -} - -func (m *MonitoredResourceDescriptor) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MonitoredResourceDescriptor.Unmarshal(m, b) -} -func (m *MonitoredResourceDescriptor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MonitoredResourceDescriptor.Marshal(b, m, deterministic) -} -func (m *MonitoredResourceDescriptor) XXX_Merge(src proto.Message) { - xxx_messageInfo_MonitoredResourceDescriptor.Merge(m, src) -} -func (m *MonitoredResourceDescriptor) XXX_Size() int { - return xxx_messageInfo_MonitoredResourceDescriptor.Size(m) -} -func (m *MonitoredResourceDescriptor) XXX_DiscardUnknown() { - xxx_messageInfo_MonitoredResourceDescriptor.DiscardUnknown(m) -} - -var xxx_messageInfo_MonitoredResourceDescriptor proto.InternalMessageInfo - -func (m *MonitoredResourceDescriptor) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *MonitoredResourceDescriptor) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *MonitoredResourceDescriptor) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -func (m *MonitoredResourceDescriptor) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *MonitoredResourceDescriptor) GetLabels() []*label.LabelDescriptor { - if m != nil { - return m.Labels - } - return nil -} - -func (m *MonitoredResourceDescriptor) GetLaunchStage() api.LaunchStage { - if m != nil { - return m.LaunchStage - } - return api.LaunchStage_LAUNCH_STAGE_UNSPECIFIED -} - -// An object representing a resource that can be used for monitoring, logging, -// billing, or other purposes. Examples include virtual machine instances, -// databases, and storage devices such as disks. The `type` field identifies a -// [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor] object that describes the resource's -// schema. Information in the `labels` field identifies the actual resource and -// its attributes according to the schema. For example, a particular Compute -// Engine VM instance could be represented by the following object, because the -// [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor] for `"gce_instance"` has labels -// `"instance_id"` and `"zone"`: -// -// { "type": "gce_instance", -// "labels": { "instance_id": "12345678901234", -// "zone": "us-central1-a" }} -type MonitoredResource struct { - // Required. The monitored resource type. This field must match - // the `type` field of a [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor] object. For - // example, the type of a Compute Engine VM instance is `gce_instance`. - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - // Required. Values for all of the labels listed in the associated monitored - // resource descriptor. For example, Compute Engine VM instances use the - // labels `"project_id"`, `"instance_id"`, and `"zone"`. - Labels map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MonitoredResource) Reset() { *m = MonitoredResource{} } -func (m *MonitoredResource) String() string { return proto.CompactTextString(m) } -func (*MonitoredResource) ProtoMessage() {} -func (*MonitoredResource) Descriptor() ([]byte, []int) { - return fileDescriptor_6cd8bd738b08f2bf, []int{1} -} - -func (m *MonitoredResource) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MonitoredResource.Unmarshal(m, b) -} -func (m *MonitoredResource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MonitoredResource.Marshal(b, m, deterministic) -} -func (m *MonitoredResource) XXX_Merge(src proto.Message) { - xxx_messageInfo_MonitoredResource.Merge(m, src) -} -func (m *MonitoredResource) XXX_Size() int { - return xxx_messageInfo_MonitoredResource.Size(m) -} -func (m *MonitoredResource) XXX_DiscardUnknown() { - xxx_messageInfo_MonitoredResource.DiscardUnknown(m) -} - -var xxx_messageInfo_MonitoredResource proto.InternalMessageInfo - -func (m *MonitoredResource) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *MonitoredResource) GetLabels() map[string]string { - if m != nil { - return m.Labels - } - return nil -} - -// Auxiliary metadata for a [MonitoredResource][google.api.MonitoredResource] object. -// [MonitoredResource][google.api.MonitoredResource] objects contain the minimum set of information to -// uniquely identify a monitored resource instance. There is some other useful -// auxiliary metadata. Monitoring and Logging use an ingestion -// pipeline to extract metadata for cloud resources of all types, and store -// the metadata in this message. -type MonitoredResourceMetadata struct { - // Output only. Values for predefined system metadata labels. - // System labels are a kind of metadata extracted by Google, including - // "machine_image", "vpc", "subnet_id", - // "security_group", "name", etc. - // System label values can be only strings, Boolean values, or a list of - // strings. For example: - // - // { "name": "my-test-instance", - // "security_group": ["a", "b", "c"], - // "spot_instance": false } - SystemLabels *_struct.Struct `protobuf:"bytes,1,opt,name=system_labels,json=systemLabels,proto3" json:"system_labels,omitempty"` - // Output only. A map of user-defined metadata labels. - UserLabels map[string]string `protobuf:"bytes,2,rep,name=user_labels,json=userLabels,proto3" json:"user_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MonitoredResourceMetadata) Reset() { *m = MonitoredResourceMetadata{} } -func (m *MonitoredResourceMetadata) String() string { return proto.CompactTextString(m) } -func (*MonitoredResourceMetadata) ProtoMessage() {} -func (*MonitoredResourceMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_6cd8bd738b08f2bf, []int{2} -} - -func (m *MonitoredResourceMetadata) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MonitoredResourceMetadata.Unmarshal(m, b) -} -func (m *MonitoredResourceMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MonitoredResourceMetadata.Marshal(b, m, deterministic) -} -func (m *MonitoredResourceMetadata) XXX_Merge(src proto.Message) { - xxx_messageInfo_MonitoredResourceMetadata.Merge(m, src) -} -func (m *MonitoredResourceMetadata) XXX_Size() int { - return xxx_messageInfo_MonitoredResourceMetadata.Size(m) -} -func (m *MonitoredResourceMetadata) XXX_DiscardUnknown() { - xxx_messageInfo_MonitoredResourceMetadata.DiscardUnknown(m) -} - -var xxx_messageInfo_MonitoredResourceMetadata proto.InternalMessageInfo - -func (m *MonitoredResourceMetadata) GetSystemLabels() *_struct.Struct { - if m != nil { - return m.SystemLabels - } - return nil -} - -func (m *MonitoredResourceMetadata) GetUserLabels() map[string]string { - if m != nil { - return m.UserLabels - } - return nil -} - -func init() { - proto.RegisterType((*MonitoredResourceDescriptor)(nil), "google.api.MonitoredResourceDescriptor") - proto.RegisterType((*MonitoredResource)(nil), "google.api.MonitoredResource") - proto.RegisterMapType((map[string]string)(nil), "google.api.MonitoredResource.LabelsEntry") - proto.RegisterType((*MonitoredResourceMetadata)(nil), "google.api.MonitoredResourceMetadata") - proto.RegisterMapType((map[string]string)(nil), "google.api.MonitoredResourceMetadata.UserLabelsEntry") -} - -func init() { - proto.RegisterFile("google/api/monitored_resource.proto", fileDescriptor_6cd8bd738b08f2bf) -} - -var fileDescriptor_6cd8bd738b08f2bf = []byte{ - // 448 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x4d, 0x8b, 0xd4, 0x40, - 0x10, 0xa5, 0x67, 0x66, 0x57, 0xac, 0x8c, 0xab, 0x36, 0xb2, 0xc6, 0xac, 0x42, 0x1c, 0x2f, 0xe3, - 0x25, 0x81, 0x5d, 0x04, 0x5d, 0xf5, 0xb0, 0xab, 0x22, 0x82, 0x2b, 0x43, 0x16, 0x3d, 0x78, 0x09, - 0x3d, 0x49, 0x1b, 0x83, 0x49, 0x3a, 0x74, 0x77, 0x84, 0xfc, 0x1d, 0xc1, 0xff, 0xe7, 0x51, 0xf0, - 0x22, 0xfd, 0x91, 0x49, 0x62, 0x44, 0xf0, 0x56, 0xf5, 0xde, 0xab, 0xaa, 0xf7, 0xd2, 0x04, 0x1e, - 0x64, 0x8c, 0x65, 0x05, 0x0d, 0x49, 0x9d, 0x87, 0x25, 0xab, 0x72, 0xc9, 0x38, 0x4d, 0x63, 0x4e, - 0x05, 0x6b, 0x78, 0x42, 0x83, 0x9a, 0x33, 0xc9, 0x30, 0x18, 0x51, 0x40, 0xea, 0xdc, 0x3b, 0x1c, - 0x0c, 0x14, 0x64, 0x4b, 0x0b, 0xa3, 0xf1, 0xee, 0x8d, 0xf0, 0xa6, 0x4a, 0x3e, 0xc7, 0x42, 0x92, - 0xcc, 0xae, 0xf0, 0xee, 0x5a, 0x5a, 0x77, 0xdb, 0xe6, 0x53, 0x28, 0x24, 0x6f, 0x12, 0x69, 0xd8, - 0xd5, 0x2f, 0x04, 0x47, 0x17, 0xdd, 0xf5, 0xc8, 0x1e, 0x7f, 0x49, 0x45, 0xc2, 0xf3, 0x5a, 0x32, - 0x8e, 0x31, 0x2c, 0x2a, 0x52, 0x52, 0x77, 0xcf, 0x47, 0xeb, 0xab, 0x91, 0xae, 0x15, 0x26, 0xdb, - 0x9a, 0xba, 0xc8, 0x60, 0xaa, 0xc6, 0xf7, 0x61, 0x99, 0xe6, 0xa2, 0x2e, 0x48, 0x1b, 0x6b, 0xfd, - 0x4c, 0x73, 0x8e, 0xc5, 0xde, 0xa9, 0x31, 0x1f, 0x9c, 0xd4, 0x2e, 0xce, 0x59, 0xe5, 0xce, 0xad, - 0xa2, 0x87, 0xf0, 0x09, 0xec, 0xeb, 0x60, 0xc2, 0x5d, 0xf8, 0xf3, 0xb5, 0x73, 0x7c, 0x14, 0xf4, - 0xf1, 0x83, 0xb7, 0x8a, 0xe9, 0x9d, 0x45, 0x56, 0x8a, 0x4f, 0x61, 0x39, 0x4c, 0xed, 0x5e, 0xf1, - 0xd1, 0xfa, 0xe0, 0xf8, 0xf6, 0x78, 0x54, 0xf1, 0x97, 0x8a, 0x8e, 0x9c, 0xa2, 0x6f, 0x56, 0xdf, - 0x11, 0xdc, 0x9c, 0xa4, 0xff, 0x6b, 0xbe, 0xb3, 0x9d, 0xb5, 0x99, 0xb6, 0xf6, 0x70, 0xb8, 0x7f, - 0xb2, 0xc2, 0x98, 0x15, 0xaf, 0x2a, 0xc9, 0xdb, 0xce, 0xa8, 0xf7, 0x04, 0x9c, 0x01, 0x8c, 0x6f, - 0xc0, 0xfc, 0x0b, 0x6d, 0xed, 0x11, 0x55, 0xe2, 0x5b, 0xb0, 0xf7, 0x95, 0x14, 0x4d, 0xf7, 0xf1, - 0x4c, 0x73, 0x3a, 0x7b, 0x8c, 0x56, 0x3f, 0x10, 0xdc, 0x99, 0x1c, 0xb9, 0xa0, 0x92, 0xa4, 0x44, - 0x12, 0xfc, 0x0c, 0xae, 0x89, 0x56, 0x48, 0x5a, 0xc6, 0xd6, 0xa2, 0xda, 0xe9, 0xf4, 0x9f, 0xa0, - 0x7b, 0xf9, 0xe0, 0x52, 0xbf, 0x7c, 0xb4, 0x34, 0x6a, 0x63, 0x06, 0x7f, 0x00, 0xa7, 0x11, 0x94, - 0xc7, 0xa3, 0x78, 0x8f, 0xfe, 0x19, 0xaf, 0xbb, 0x1c, 0xbc, 0x17, 0x94, 0x0f, 0xa3, 0x42, 0xb3, - 0x03, 0xbc, 0xe7, 0x70, 0xfd, 0x0f, 0xfa, 0x7f, 0x22, 0x9f, 0xb7, 0x70, 0x90, 0xb0, 0x72, 0x60, - 0xe3, 0xfc, 0x70, 0xe2, 0x63, 0xa3, 0x82, 0x6d, 0xd0, 0xc7, 0x17, 0x56, 0x95, 0xb1, 0x82, 0x54, - 0x59, 0xc0, 0x78, 0x16, 0x66, 0xb4, 0xd2, 0xb1, 0x43, 0x43, 0x91, 0x3a, 0x17, 0xe3, 0x3f, 0x8d, - 0x53, 0xf1, 0x74, 0xd8, 0xfc, 0x44, 0xe8, 0xdb, 0x6c, 0xf1, 0xfa, 0x6c, 0xf3, 0x66, 0xbb, 0xaf, - 0x27, 0x4f, 0x7e, 0x07, 0x00, 0x00, 0xff, 0xff, 0x4b, 0xa6, 0xca, 0xf1, 0xa2, 0x03, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/container/v1/cluster_service.pb.go b/vendor/google.golang.org/genproto/googleapis/container/v1/cluster_service.pb.go deleted file mode 100644 index 0b2647dab..000000000 --- a/vendor/google.golang.org/genproto/googleapis/container/v1/cluster_service.pb.go +++ /dev/null @@ -1,9166 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/container/v1/cluster_service.proto - -package container - -import ( - context "context" - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - empty "github.com/golang/protobuf/ptypes/empty" - timestamp "github.com/golang/protobuf/ptypes/timestamp" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// Possible values for Effect in taint. -type NodeTaint_Effect int32 - -const ( - // Not set - NodeTaint_EFFECT_UNSPECIFIED NodeTaint_Effect = 0 - // NoSchedule - NodeTaint_NO_SCHEDULE NodeTaint_Effect = 1 - // PreferNoSchedule - NodeTaint_PREFER_NO_SCHEDULE NodeTaint_Effect = 2 - // NoExecute - NodeTaint_NO_EXECUTE NodeTaint_Effect = 3 -) - -var NodeTaint_Effect_name = map[int32]string{ - 0: "EFFECT_UNSPECIFIED", - 1: "NO_SCHEDULE", - 2: "PREFER_NO_SCHEDULE", - 3: "NO_EXECUTE", -} - -var NodeTaint_Effect_value = map[string]int32{ - "EFFECT_UNSPECIFIED": 0, - "NO_SCHEDULE": 1, - "PREFER_NO_SCHEDULE": 2, - "NO_EXECUTE": 3, -} - -func (x NodeTaint_Effect) String() string { - return proto.EnumName(NodeTaint_Effect_name, int32(x)) -} - -func (NodeTaint_Effect) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{2, 0} -} - -// Allowed Network Policy providers. -type NetworkPolicy_Provider int32 - -const ( - // Not set - NetworkPolicy_PROVIDER_UNSPECIFIED NetworkPolicy_Provider = 0 - // Tigera (Calico Felix). - NetworkPolicy_CALICO NetworkPolicy_Provider = 1 -) - -var NetworkPolicy_Provider_name = map[int32]string{ - 0: "PROVIDER_UNSPECIFIED", - 1: "CALICO", -} - -var NetworkPolicy_Provider_value = map[string]int32{ - "PROVIDER_UNSPECIFIED": 0, - "CALICO": 1, -} - -func (x NetworkPolicy_Provider) String() string { - return proto.EnumName(NetworkPolicy_Provider_name, int32(x)) -} - -func (NetworkPolicy_Provider) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{15, 0} -} - -// The current status of the cluster. -type Cluster_Status int32 - -const ( - // Not set. - Cluster_STATUS_UNSPECIFIED Cluster_Status = 0 - // The PROVISIONING state indicates the cluster is being created. - Cluster_PROVISIONING Cluster_Status = 1 - // The RUNNING state indicates the cluster has been created and is fully - // usable. - Cluster_RUNNING Cluster_Status = 2 - // The RECONCILING state indicates that some work is actively being done on - // the cluster, such as upgrading the master or node software. Details can - // be found in the `statusMessage` field. - Cluster_RECONCILING Cluster_Status = 3 - // The STOPPING state indicates the cluster is being deleted. - Cluster_STOPPING Cluster_Status = 4 - // The ERROR state indicates the cluster may be unusable. Details - // can be found in the `statusMessage` field. - Cluster_ERROR Cluster_Status = 5 - // The DEGRADED state indicates the cluster requires user action to restore - // full functionality. Details can be found in the `statusMessage` field. - Cluster_DEGRADED Cluster_Status = 6 -) - -var Cluster_Status_name = map[int32]string{ - 0: "STATUS_UNSPECIFIED", - 1: "PROVISIONING", - 2: "RUNNING", - 3: "RECONCILING", - 4: "STOPPING", - 5: "ERROR", - 6: "DEGRADED", -} - -var Cluster_Status_value = map[string]int32{ - "STATUS_UNSPECIFIED": 0, - "PROVISIONING": 1, - "RUNNING": 2, - "RECONCILING": 3, - "STOPPING": 4, - "ERROR": 5, - "DEGRADED": 6, -} - -func (x Cluster_Status) String() string { - return proto.EnumName(Cluster_Status_name, int32(x)) -} - -func (Cluster_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{18, 0} -} - -// Current status of the operation. -type Operation_Status int32 - -const ( - // Not set. - Operation_STATUS_UNSPECIFIED Operation_Status = 0 - // The operation has been created. - Operation_PENDING Operation_Status = 1 - // The operation is currently running. - Operation_RUNNING Operation_Status = 2 - // The operation is done, either cancelled or completed. - Operation_DONE Operation_Status = 3 - // The operation is aborting. - Operation_ABORTING Operation_Status = 4 -) - -var Operation_Status_name = map[int32]string{ - 0: "STATUS_UNSPECIFIED", - 1: "PENDING", - 2: "RUNNING", - 3: "DONE", - 4: "ABORTING", -} - -var Operation_Status_value = map[string]int32{ - "STATUS_UNSPECIFIED": 0, - "PENDING": 1, - "RUNNING": 2, - "DONE": 3, - "ABORTING": 4, -} - -func (x Operation_Status) String() string { - return proto.EnumName(Operation_Status_name, int32(x)) -} - -func (Operation_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{20, 0} -} - -// Operation type. -type Operation_Type int32 - -const ( - // Not set. - Operation_TYPE_UNSPECIFIED Operation_Type = 0 - // Cluster create. - Operation_CREATE_CLUSTER Operation_Type = 1 - // Cluster delete. - Operation_DELETE_CLUSTER Operation_Type = 2 - // A master upgrade. - Operation_UPGRADE_MASTER Operation_Type = 3 - // A node upgrade. - Operation_UPGRADE_NODES Operation_Type = 4 - // Cluster repair. - Operation_REPAIR_CLUSTER Operation_Type = 5 - // Cluster update. - Operation_UPDATE_CLUSTER Operation_Type = 6 - // Node pool create. - Operation_CREATE_NODE_POOL Operation_Type = 7 - // Node pool delete. - Operation_DELETE_NODE_POOL Operation_Type = 8 - // Set node pool management. - Operation_SET_NODE_POOL_MANAGEMENT Operation_Type = 9 - // Automatic node pool repair. - Operation_AUTO_REPAIR_NODES Operation_Type = 10 - // Automatic node upgrade. - Operation_AUTO_UPGRADE_NODES Operation_Type = 11 - // Set labels. - Operation_SET_LABELS Operation_Type = 12 - // Set/generate master auth materials - Operation_SET_MASTER_AUTH Operation_Type = 13 - // Set node pool size. - Operation_SET_NODE_POOL_SIZE Operation_Type = 14 - // Updates network policy for a cluster. - Operation_SET_NETWORK_POLICY Operation_Type = 15 - // Set the maintenance policy. - Operation_SET_MAINTENANCE_POLICY Operation_Type = 16 -) - -var Operation_Type_name = map[int32]string{ - 0: "TYPE_UNSPECIFIED", - 1: "CREATE_CLUSTER", - 2: "DELETE_CLUSTER", - 3: "UPGRADE_MASTER", - 4: "UPGRADE_NODES", - 5: "REPAIR_CLUSTER", - 6: "UPDATE_CLUSTER", - 7: "CREATE_NODE_POOL", - 8: "DELETE_NODE_POOL", - 9: "SET_NODE_POOL_MANAGEMENT", - 10: "AUTO_REPAIR_NODES", - 11: "AUTO_UPGRADE_NODES", - 12: "SET_LABELS", - 13: "SET_MASTER_AUTH", - 14: "SET_NODE_POOL_SIZE", - 15: "SET_NETWORK_POLICY", - 16: "SET_MAINTENANCE_POLICY", -} - -var Operation_Type_value = map[string]int32{ - "TYPE_UNSPECIFIED": 0, - "CREATE_CLUSTER": 1, - "DELETE_CLUSTER": 2, - "UPGRADE_MASTER": 3, - "UPGRADE_NODES": 4, - "REPAIR_CLUSTER": 5, - "UPDATE_CLUSTER": 6, - "CREATE_NODE_POOL": 7, - "DELETE_NODE_POOL": 8, - "SET_NODE_POOL_MANAGEMENT": 9, - "AUTO_REPAIR_NODES": 10, - "AUTO_UPGRADE_NODES": 11, - "SET_LABELS": 12, - "SET_MASTER_AUTH": 13, - "SET_NODE_POOL_SIZE": 14, - "SET_NETWORK_POLICY": 15, - "SET_MAINTENANCE_POLICY": 16, -} - -func (x Operation_Type) String() string { - return proto.EnumName(Operation_Type_name, int32(x)) -} - -func (Operation_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{20, 1} -} - -// Operation type: what type update to perform. -type SetMasterAuthRequest_Action int32 - -const ( - // Operation is unknown and will error out. - SetMasterAuthRequest_UNKNOWN SetMasterAuthRequest_Action = 0 - // Set the password to a user generated value. - SetMasterAuthRequest_SET_PASSWORD SetMasterAuthRequest_Action = 1 - // Generate a new password and set it to that. - SetMasterAuthRequest_GENERATE_PASSWORD SetMasterAuthRequest_Action = 2 - // Set the username. If an empty username is provided, basic authentication - // is disabled for the cluster. If a non-empty username is provided, basic - // authentication is enabled, with either a provided password or a generated - // one. - SetMasterAuthRequest_SET_USERNAME SetMasterAuthRequest_Action = 3 -) - -var SetMasterAuthRequest_Action_name = map[int32]string{ - 0: "UNKNOWN", - 1: "SET_PASSWORD", - 2: "GENERATE_PASSWORD", - 3: "SET_USERNAME", -} - -var SetMasterAuthRequest_Action_value = map[string]int32{ - "UNKNOWN": 0, - "SET_PASSWORD": 1, - "GENERATE_PASSWORD": 2, - "SET_USERNAME": 3, -} - -func (x SetMasterAuthRequest_Action) String() string { - return proto.EnumName(SetMasterAuthRequest_Action_name, int32(x)) -} - -func (SetMasterAuthRequest_Action) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{31, 0} -} - -// The current status of the node pool instance. -type NodePool_Status int32 - -const ( - // Not set. - NodePool_STATUS_UNSPECIFIED NodePool_Status = 0 - // The PROVISIONING state indicates the node pool is being created. - NodePool_PROVISIONING NodePool_Status = 1 - // The RUNNING state indicates the node pool has been created - // and is fully usable. - NodePool_RUNNING NodePool_Status = 2 - // The RUNNING_WITH_ERROR state indicates the node pool has been created - // and is partially usable. Some error state has occurred and some - // functionality may be impaired. Customer may need to reissue a request - // or trigger a new update. - NodePool_RUNNING_WITH_ERROR NodePool_Status = 3 - // The RECONCILING state indicates that some work is actively being done on - // the node pool, such as upgrading node software. Details can - // be found in the `statusMessage` field. - NodePool_RECONCILING NodePool_Status = 4 - // The STOPPING state indicates the node pool is being deleted. - NodePool_STOPPING NodePool_Status = 5 - // The ERROR state indicates the node pool may be unusable. Details - // can be found in the `statusMessage` field. - NodePool_ERROR NodePool_Status = 6 -) - -var NodePool_Status_name = map[int32]string{ - 0: "STATUS_UNSPECIFIED", - 1: "PROVISIONING", - 2: "RUNNING", - 3: "RUNNING_WITH_ERROR", - 4: "RECONCILING", - 5: "STOPPING", - 6: "ERROR", -} - -var NodePool_Status_value = map[string]int32{ - "STATUS_UNSPECIFIED": 0, - "PROVISIONING": 1, - "RUNNING": 2, - "RUNNING_WITH_ERROR": 3, - "RECONCILING": 4, - "STOPPING": 5, - "ERROR": 6, -} - -func (x NodePool_Status) String() string { - return proto.EnumName(NodePool_Status_name, int32(x)) -} - -func (NodePool_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{45, 0} -} - -// Code for each condition -type StatusCondition_Code int32 - -const ( - // UNKNOWN indicates a generic condition. - StatusCondition_UNKNOWN StatusCondition_Code = 0 - // GCE_STOCKOUT indicates a Google Compute Engine stockout. - StatusCondition_GCE_STOCKOUT StatusCondition_Code = 1 - // GKE_SERVICE_ACCOUNT_DELETED indicates that the user deleted their robot - // service account. - StatusCondition_GKE_SERVICE_ACCOUNT_DELETED StatusCondition_Code = 2 - // Google Compute Engine quota was exceeded. - StatusCondition_GCE_QUOTA_EXCEEDED StatusCondition_Code = 3 - // Cluster state was manually changed by an SRE due to a system logic error. - StatusCondition_SET_BY_OPERATOR StatusCondition_Code = 4 - // Unable to perform an encrypt operation against the CloudKMS key used for - // etcd level encryption. - // More codes TBA - StatusCondition_CLOUD_KMS_KEY_ERROR StatusCondition_Code = 7 -) - -var StatusCondition_Code_name = map[int32]string{ - 0: "UNKNOWN", - 1: "GCE_STOCKOUT", - 2: "GKE_SERVICE_ACCOUNT_DELETED", - 3: "GCE_QUOTA_EXCEEDED", - 4: "SET_BY_OPERATOR", - 7: "CLOUD_KMS_KEY_ERROR", -} - -var StatusCondition_Code_value = map[string]int32{ - "UNKNOWN": 0, - "GCE_STOCKOUT": 1, - "GKE_SERVICE_ACCOUNT_DELETED": 2, - "GCE_QUOTA_EXCEEDED": 3, - "SET_BY_OPERATOR": 4, - "CLOUD_KMS_KEY_ERROR": 7, -} - -func (x StatusCondition_Code) String() string { - return proto.EnumName(StatusCondition_Code_name, int32(x)) -} - -func (StatusCondition_Code) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{68, 0} -} - -// State of etcd encryption. -type DatabaseEncryption_State int32 - -const ( - // Should never be set - DatabaseEncryption_UNKNOWN DatabaseEncryption_State = 0 - // Secrets in etcd are encrypted. - DatabaseEncryption_ENCRYPTED DatabaseEncryption_State = 1 - // Secrets in etcd are stored in plain text (at etcd level) - this is - // unrelated to GCE level full disk encryption. - DatabaseEncryption_DECRYPTED DatabaseEncryption_State = 2 -) - -var DatabaseEncryption_State_name = map[int32]string{ - 0: "UNKNOWN", - 1: "ENCRYPTED", - 2: "DECRYPTED", -} - -var DatabaseEncryption_State_value = map[string]int32{ - "UNKNOWN": 0, - "ENCRYPTED": 1, - "DECRYPTED": 2, -} - -func (x DatabaseEncryption_State) String() string { - return proto.EnumName(DatabaseEncryption_State_name, int32(x)) -} - -func (DatabaseEncryption_State) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{72, 0} -} - -// Status shows the current usage of a secondary IP range. -type UsableSubnetworkSecondaryRange_Status int32 - -const ( - // UNKNOWN is the zero value of the Status enum. It's not a valid status. - UsableSubnetworkSecondaryRange_UNKNOWN UsableSubnetworkSecondaryRange_Status = 0 - // UNUSED denotes that this range is unclaimed by any cluster. - UsableSubnetworkSecondaryRange_UNUSED UsableSubnetworkSecondaryRange_Status = 1 - // IN_USE_SERVICE denotes that this range is claimed by a cluster for - // services. It cannot be used for other clusters. - UsableSubnetworkSecondaryRange_IN_USE_SERVICE UsableSubnetworkSecondaryRange_Status = 2 - // IN_USE_SHAREABLE_POD denotes this range was created by the network admin - // and is currently claimed by a cluster for pods. It can only be used by - // other clusters as a pod range. - UsableSubnetworkSecondaryRange_IN_USE_SHAREABLE_POD UsableSubnetworkSecondaryRange_Status = 3 - // IN_USE_MANAGED_POD denotes this range was created by GKE and is claimed - // for pods. It cannot be used for other clusters. - UsableSubnetworkSecondaryRange_IN_USE_MANAGED_POD UsableSubnetworkSecondaryRange_Status = 4 -) - -var UsableSubnetworkSecondaryRange_Status_name = map[int32]string{ - 0: "UNKNOWN", - 1: "UNUSED", - 2: "IN_USE_SERVICE", - 3: "IN_USE_SHAREABLE_POD", - 4: "IN_USE_MANAGED_POD", -} - -var UsableSubnetworkSecondaryRange_Status_value = map[string]int32{ - "UNKNOWN": 0, - "UNUSED": 1, - "IN_USE_SERVICE": 2, - "IN_USE_SHAREABLE_POD": 3, - "IN_USE_MANAGED_POD": 4, -} - -func (x UsableSubnetworkSecondaryRange_Status) String() string { - return proto.EnumName(UsableSubnetworkSecondaryRange_Status_name, int32(x)) -} - -func (UsableSubnetworkSecondaryRange_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{75, 0} -} - -// Parameters that describe the nodes in a cluster. -type NodeConfig struct { - // The name of a Google Compute Engine [machine - // type](/compute/docs/machine-types) (e.g. - // `n1-standard-1`). - // - // If unspecified, the default machine type is - // `n1-standard-1`. - MachineType string `protobuf:"bytes,1,opt,name=machine_type,json=machineType,proto3" json:"machine_type,omitempty"` - // Size of the disk attached to each node, specified in GB. - // The smallest allowed disk size is 10GB. - // - // If unspecified, the default disk size is 100GB. - DiskSizeGb int32 `protobuf:"varint,2,opt,name=disk_size_gb,json=diskSizeGb,proto3" json:"disk_size_gb,omitempty"` - // The set of Google API scopes to be made available on all of the - // node VMs under the "default" service account. - // - // The following scopes are recommended, but not required, and by default are - // not included: - // - // * `https://www.googleapis.com/auth/compute` is required for mounting - // persistent storage on your nodes. - // * `https://www.googleapis.com/auth/devstorage.read_only` is required for - // communicating with **gcr.io** - // (the [Google Container Registry](/container-registry/)). - // - // If unspecified, no scopes are added, unless Cloud Logging or Cloud - // Monitoring are enabled, in which case their required scopes will be added. - OauthScopes []string `protobuf:"bytes,3,rep,name=oauth_scopes,json=oauthScopes,proto3" json:"oauth_scopes,omitempty"` - // The Google Cloud Platform Service Account to be used by the node VMs. If - // no Service Account is specified, the "default" service account is used. - ServiceAccount string `protobuf:"bytes,9,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` - // The metadata key/value pairs assigned to instances in the cluster. - // - // Keys must conform to the regexp [a-zA-Z0-9-_]+ and be less than 128 bytes - // in length. These are reflected as part of a URL in the metadata server. - // Additionally, to avoid ambiguity, keys must not conflict with any other - // metadata keys for the project or be one of the reserved keys: - // "cluster-location" - // "cluster-name" - // "cluster-uid" - // "configure-sh" - // "containerd-configure-sh" - // "enable-os-login" - // "gci-update-strategy" - // "gci-ensure-gke-docker" - // "instance-template" - // "kube-env" - // "startup-script" - // "user-data" - // "disable-address-manager" - // "windows-startup-script-ps1" - // "common-psm1" - // "k8s-node-setup-psm1" - // "install-ssh-psm1" - // "user-profile-psm1" - // "serial-port-logging-enable" - // - // Values are free-form strings, and only have meaning as interpreted by - // the image running in the instance. The only restriction placed on them is - // that each value's size must be less than or equal to 32 KB. - // - // The total size of all keys and values must be less than 512 KB. - Metadata map[string]string `protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // The image type to use for this node. Note that for a given image type, - // the latest version of it will be used. - ImageType string `protobuf:"bytes,5,opt,name=image_type,json=imageType,proto3" json:"image_type,omitempty"` - // The map of Kubernetes labels (key/value pairs) to be applied to each node. - // These will added in addition to any default label(s) that - // Kubernetes may apply to the node. - // In case of conflict in label keys, the applied set may differ depending on - // the Kubernetes version -- it's best to assume the behavior is undefined - // and conflicts should be avoided. - // For more information, including usage and the valid values, see: - // https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ - Labels map[string]string `protobuf:"bytes,6,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // The number of local SSD disks to be attached to the node. - // - // The limit for this value is dependent upon the maximum number of - // disks available on a machine per zone. See: - // https://cloud.google.com/compute/docs/disks/local-ssd - // for more information. - LocalSsdCount int32 `protobuf:"varint,7,opt,name=local_ssd_count,json=localSsdCount,proto3" json:"local_ssd_count,omitempty"` - // The list of instance tags applied to all nodes. Tags are used to identify - // valid sources or targets for network firewalls and are specified by - // the client during cluster or node pool creation. Each tag within the list - // must comply with RFC1035. - Tags []string `protobuf:"bytes,8,rep,name=tags,proto3" json:"tags,omitempty"` - // Whether the nodes are created as preemptible VM instances. See: - // https://cloud.google.com/compute/docs/instances/preemptible for more - // information about preemptible VM instances. - Preemptible bool `protobuf:"varint,10,opt,name=preemptible,proto3" json:"preemptible,omitempty"` - // A list of hardware accelerators to be attached to each node. - // See https://cloud.google.com/compute/docs/gpus for more information about - // support for GPUs. - Accelerators []*AcceleratorConfig `protobuf:"bytes,11,rep,name=accelerators,proto3" json:"accelerators,omitempty"` - // Type of the disk attached to each node (e.g. 'pd-standard' or 'pd-ssd') - // - // If unspecified, the default disk type is 'pd-standard' - DiskType string `protobuf:"bytes,12,opt,name=disk_type,json=diskType,proto3" json:"disk_type,omitempty"` - // Minimum CPU platform to be used by this instance. The instance may be - // scheduled on the specified or newer CPU platform. Applicable values are the - // friendly names of CPU platforms, such as - // minCpuPlatform: "Intel Haswell" or - // minCpuPlatform: "Intel Sandy Bridge". For more - // information, read [how to specify min CPU - // platform](https://cloud.google.com/compute/docs/instances/specify-min-cpu-platform) - MinCpuPlatform string `protobuf:"bytes,13,opt,name=min_cpu_platform,json=minCpuPlatform,proto3" json:"min_cpu_platform,omitempty"` - // List of kubernetes taints to be applied to each node. - // - // For more information, including usage and the valid values, see: - // https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ - Taints []*NodeTaint `protobuf:"bytes,15,rep,name=taints,proto3" json:"taints,omitempty"` - // Shielded Instance options. - ShieldedInstanceConfig *ShieldedInstanceConfig `protobuf:"bytes,20,opt,name=shielded_instance_config,json=shieldedInstanceConfig,proto3" json:"shielded_instance_config,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NodeConfig) Reset() { *m = NodeConfig{} } -func (m *NodeConfig) String() string { return proto.CompactTextString(m) } -func (*NodeConfig) ProtoMessage() {} -func (*NodeConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{0} -} - -func (m *NodeConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NodeConfig.Unmarshal(m, b) -} -func (m *NodeConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NodeConfig.Marshal(b, m, deterministic) -} -func (m *NodeConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_NodeConfig.Merge(m, src) -} -func (m *NodeConfig) XXX_Size() int { - return xxx_messageInfo_NodeConfig.Size(m) -} -func (m *NodeConfig) XXX_DiscardUnknown() { - xxx_messageInfo_NodeConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_NodeConfig proto.InternalMessageInfo - -func (m *NodeConfig) GetMachineType() string { - if m != nil { - return m.MachineType - } - return "" -} - -func (m *NodeConfig) GetDiskSizeGb() int32 { - if m != nil { - return m.DiskSizeGb - } - return 0 -} - -func (m *NodeConfig) GetOauthScopes() []string { - if m != nil { - return m.OauthScopes - } - return nil -} - -func (m *NodeConfig) GetServiceAccount() string { - if m != nil { - return m.ServiceAccount - } - return "" -} - -func (m *NodeConfig) GetMetadata() map[string]string { - if m != nil { - return m.Metadata - } - return nil -} - -func (m *NodeConfig) GetImageType() string { - if m != nil { - return m.ImageType - } - return "" -} - -func (m *NodeConfig) GetLabels() map[string]string { - if m != nil { - return m.Labels - } - return nil -} - -func (m *NodeConfig) GetLocalSsdCount() int32 { - if m != nil { - return m.LocalSsdCount - } - return 0 -} - -func (m *NodeConfig) GetTags() []string { - if m != nil { - return m.Tags - } - return nil -} - -func (m *NodeConfig) GetPreemptible() bool { - if m != nil { - return m.Preemptible - } - return false -} - -func (m *NodeConfig) GetAccelerators() []*AcceleratorConfig { - if m != nil { - return m.Accelerators - } - return nil -} - -func (m *NodeConfig) GetDiskType() string { - if m != nil { - return m.DiskType - } - return "" -} - -func (m *NodeConfig) GetMinCpuPlatform() string { - if m != nil { - return m.MinCpuPlatform - } - return "" -} - -func (m *NodeConfig) GetTaints() []*NodeTaint { - if m != nil { - return m.Taints - } - return nil -} - -func (m *NodeConfig) GetShieldedInstanceConfig() *ShieldedInstanceConfig { - if m != nil { - return m.ShieldedInstanceConfig - } - return nil -} - -// A set of Shielded Instance options. -type ShieldedInstanceConfig struct { - // Defines whether the instance has Secure Boot enabled. - // - // Secure Boot helps ensure that the system only runs authentic software by - // verifying the digital signature of all boot components, and halting the - // boot process if signature verification fails. - EnableSecureBoot bool `protobuf:"varint,1,opt,name=enable_secure_boot,json=enableSecureBoot,proto3" json:"enable_secure_boot,omitempty"` - // Defines whether the instance has integrity monitoring enabled. - // - // Enables monitoring and attestation of the boot integrity of the instance. - // The attestation is performed against the integrity policy baseline. This - // baseline is initially derived from the implicitly trusted boot image when - // the instance is created. - EnableIntegrityMonitoring bool `protobuf:"varint,2,opt,name=enable_integrity_monitoring,json=enableIntegrityMonitoring,proto3" json:"enable_integrity_monitoring,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ShieldedInstanceConfig) Reset() { *m = ShieldedInstanceConfig{} } -func (m *ShieldedInstanceConfig) String() string { return proto.CompactTextString(m) } -func (*ShieldedInstanceConfig) ProtoMessage() {} -func (*ShieldedInstanceConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{1} -} - -func (m *ShieldedInstanceConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ShieldedInstanceConfig.Unmarshal(m, b) -} -func (m *ShieldedInstanceConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ShieldedInstanceConfig.Marshal(b, m, deterministic) -} -func (m *ShieldedInstanceConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShieldedInstanceConfig.Merge(m, src) -} -func (m *ShieldedInstanceConfig) XXX_Size() int { - return xxx_messageInfo_ShieldedInstanceConfig.Size(m) -} -func (m *ShieldedInstanceConfig) XXX_DiscardUnknown() { - xxx_messageInfo_ShieldedInstanceConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_ShieldedInstanceConfig proto.InternalMessageInfo - -func (m *ShieldedInstanceConfig) GetEnableSecureBoot() bool { - if m != nil { - return m.EnableSecureBoot - } - return false -} - -func (m *ShieldedInstanceConfig) GetEnableIntegrityMonitoring() bool { - if m != nil { - return m.EnableIntegrityMonitoring - } - return false -} - -// Kubernetes taint is comprised of three fields: key, value, and effect. Effect -// can only be one of three types: NoSchedule, PreferNoSchedule or NoExecute. -// -// For more information, including usage and the valid values, see: -// https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -type NodeTaint struct { - // Key for taint. - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - // Value for taint. - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - // Effect for taint. - Effect NodeTaint_Effect `protobuf:"varint,3,opt,name=effect,proto3,enum=google.container.v1.NodeTaint_Effect" json:"effect,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NodeTaint) Reset() { *m = NodeTaint{} } -func (m *NodeTaint) String() string { return proto.CompactTextString(m) } -func (*NodeTaint) ProtoMessage() {} -func (*NodeTaint) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{2} -} - -func (m *NodeTaint) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NodeTaint.Unmarshal(m, b) -} -func (m *NodeTaint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NodeTaint.Marshal(b, m, deterministic) -} -func (m *NodeTaint) XXX_Merge(src proto.Message) { - xxx_messageInfo_NodeTaint.Merge(m, src) -} -func (m *NodeTaint) XXX_Size() int { - return xxx_messageInfo_NodeTaint.Size(m) -} -func (m *NodeTaint) XXX_DiscardUnknown() { - xxx_messageInfo_NodeTaint.DiscardUnknown(m) -} - -var xxx_messageInfo_NodeTaint proto.InternalMessageInfo - -func (m *NodeTaint) GetKey() string { - if m != nil { - return m.Key - } - return "" -} - -func (m *NodeTaint) GetValue() string { - if m != nil { - return m.Value - } - return "" -} - -func (m *NodeTaint) GetEffect() NodeTaint_Effect { - if m != nil { - return m.Effect - } - return NodeTaint_EFFECT_UNSPECIFIED -} - -// The authentication information for accessing the master endpoint. -// Authentication can be done using HTTP basic auth or using client -// certificates. -type MasterAuth struct { - // The username to use for HTTP basic authentication to the master endpoint. - // For clusters v1.6.0 and later, basic authentication can be disabled by - // leaving username unspecified (or setting it to the empty string). - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - // The password to use for HTTP basic authentication to the master endpoint. - // Because the master endpoint is open to the Internet, you should create a - // strong password. If a password is provided for cluster creation, username - // must be non-empty. - Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` - // Configuration for client certificate authentication on the cluster. For - // clusters before v1.12, if no configuration is specified, a client - // certificate is issued. - ClientCertificateConfig *ClientCertificateConfig `protobuf:"bytes,3,opt,name=client_certificate_config,json=clientCertificateConfig,proto3" json:"client_certificate_config,omitempty"` - // [Output only] Base64-encoded public certificate that is the root of - // trust for the cluster. - ClusterCaCertificate string `protobuf:"bytes,100,opt,name=cluster_ca_certificate,json=clusterCaCertificate,proto3" json:"cluster_ca_certificate,omitempty"` - // [Output only] Base64-encoded public certificate used by clients to - // authenticate to the cluster endpoint. - ClientCertificate string `protobuf:"bytes,101,opt,name=client_certificate,json=clientCertificate,proto3" json:"client_certificate,omitempty"` - // [Output only] Base64-encoded private key used by clients to authenticate - // to the cluster endpoint. - ClientKey string `protobuf:"bytes,102,opt,name=client_key,json=clientKey,proto3" json:"client_key,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MasterAuth) Reset() { *m = MasterAuth{} } -func (m *MasterAuth) String() string { return proto.CompactTextString(m) } -func (*MasterAuth) ProtoMessage() {} -func (*MasterAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{3} -} - -func (m *MasterAuth) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MasterAuth.Unmarshal(m, b) -} -func (m *MasterAuth) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MasterAuth.Marshal(b, m, deterministic) -} -func (m *MasterAuth) XXX_Merge(src proto.Message) { - xxx_messageInfo_MasterAuth.Merge(m, src) -} -func (m *MasterAuth) XXX_Size() int { - return xxx_messageInfo_MasterAuth.Size(m) -} -func (m *MasterAuth) XXX_DiscardUnknown() { - xxx_messageInfo_MasterAuth.DiscardUnknown(m) -} - -var xxx_messageInfo_MasterAuth proto.InternalMessageInfo - -func (m *MasterAuth) GetUsername() string { - if m != nil { - return m.Username - } - return "" -} - -func (m *MasterAuth) GetPassword() string { - if m != nil { - return m.Password - } - return "" -} - -func (m *MasterAuth) GetClientCertificateConfig() *ClientCertificateConfig { - if m != nil { - return m.ClientCertificateConfig - } - return nil -} - -func (m *MasterAuth) GetClusterCaCertificate() string { - if m != nil { - return m.ClusterCaCertificate - } - return "" -} - -func (m *MasterAuth) GetClientCertificate() string { - if m != nil { - return m.ClientCertificate - } - return "" -} - -func (m *MasterAuth) GetClientKey() string { - if m != nil { - return m.ClientKey - } - return "" -} - -// Configuration for client certificates on the cluster. -type ClientCertificateConfig struct { - // Issue a client certificate. - IssueClientCertificate bool `protobuf:"varint,1,opt,name=issue_client_certificate,json=issueClientCertificate,proto3" json:"issue_client_certificate,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ClientCertificateConfig) Reset() { *m = ClientCertificateConfig{} } -func (m *ClientCertificateConfig) String() string { return proto.CompactTextString(m) } -func (*ClientCertificateConfig) ProtoMessage() {} -func (*ClientCertificateConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{4} -} - -func (m *ClientCertificateConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ClientCertificateConfig.Unmarshal(m, b) -} -func (m *ClientCertificateConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ClientCertificateConfig.Marshal(b, m, deterministic) -} -func (m *ClientCertificateConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_ClientCertificateConfig.Merge(m, src) -} -func (m *ClientCertificateConfig) XXX_Size() int { - return xxx_messageInfo_ClientCertificateConfig.Size(m) -} -func (m *ClientCertificateConfig) XXX_DiscardUnknown() { - xxx_messageInfo_ClientCertificateConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_ClientCertificateConfig proto.InternalMessageInfo - -func (m *ClientCertificateConfig) GetIssueClientCertificate() bool { - if m != nil { - return m.IssueClientCertificate - } - return false -} - -// Configuration for the addons that can be automatically spun up in the -// cluster, enabling additional functionality. -type AddonsConfig struct { - // Configuration for the HTTP (L7) load balancing controller addon, which - // makes it easy to set up HTTP load balancers for services in a cluster. - HttpLoadBalancing *HttpLoadBalancing `protobuf:"bytes,1,opt,name=http_load_balancing,json=httpLoadBalancing,proto3" json:"http_load_balancing,omitempty"` - // Configuration for the horizontal pod autoscaling feature, which - // increases or decreases the number of replica pods a replication controller - // has based on the resource usage of the existing pods. - HorizontalPodAutoscaling *HorizontalPodAutoscaling `protobuf:"bytes,2,opt,name=horizontal_pod_autoscaling,json=horizontalPodAutoscaling,proto3" json:"horizontal_pod_autoscaling,omitempty"` - // Configuration for the Kubernetes Dashboard. - // This addon is deprecated, and will be disabled in 1.15. It is recommended - // to use the Cloud Console to manage and monitor your Kubernetes clusters, - // workloads and applications. For more information, see: - // https://cloud.google.com/kubernetes-engine/docs/concepts/dashboards - KubernetesDashboard *KubernetesDashboard `protobuf:"bytes,3,opt,name=kubernetes_dashboard,json=kubernetesDashboard,proto3" json:"kubernetes_dashboard,omitempty"` // Deprecated: Do not use. - // Configuration for NetworkPolicy. This only tracks whether the addon - // is enabled or not on the Master, it does not track whether network policy - // is enabled for the nodes. - NetworkPolicyConfig *NetworkPolicyConfig `protobuf:"bytes,4,opt,name=network_policy_config,json=networkPolicyConfig,proto3" json:"network_policy_config,omitempty"` - // Configuration for the Cloud Run addon, which allows the user to use a - // managed Knative service. - CloudRunConfig *CloudRunConfig `protobuf:"bytes,7,opt,name=cloud_run_config,json=cloudRunConfig,proto3" json:"cloud_run_config,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AddonsConfig) Reset() { *m = AddonsConfig{} } -func (m *AddonsConfig) String() string { return proto.CompactTextString(m) } -func (*AddonsConfig) ProtoMessage() {} -func (*AddonsConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{5} -} - -func (m *AddonsConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AddonsConfig.Unmarshal(m, b) -} -func (m *AddonsConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AddonsConfig.Marshal(b, m, deterministic) -} -func (m *AddonsConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddonsConfig.Merge(m, src) -} -func (m *AddonsConfig) XXX_Size() int { - return xxx_messageInfo_AddonsConfig.Size(m) -} -func (m *AddonsConfig) XXX_DiscardUnknown() { - xxx_messageInfo_AddonsConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_AddonsConfig proto.InternalMessageInfo - -func (m *AddonsConfig) GetHttpLoadBalancing() *HttpLoadBalancing { - if m != nil { - return m.HttpLoadBalancing - } - return nil -} - -func (m *AddonsConfig) GetHorizontalPodAutoscaling() *HorizontalPodAutoscaling { - if m != nil { - return m.HorizontalPodAutoscaling - } - return nil -} - -// Deprecated: Do not use. -func (m *AddonsConfig) GetKubernetesDashboard() *KubernetesDashboard { - if m != nil { - return m.KubernetesDashboard - } - return nil -} - -func (m *AddonsConfig) GetNetworkPolicyConfig() *NetworkPolicyConfig { - if m != nil { - return m.NetworkPolicyConfig - } - return nil -} - -func (m *AddonsConfig) GetCloudRunConfig() *CloudRunConfig { - if m != nil { - return m.CloudRunConfig - } - return nil -} - -// Configuration options for the HTTP (L7) load balancing controller addon, -// which makes it easy to set up HTTP load balancers for services in a cluster. -type HttpLoadBalancing struct { - // Whether the HTTP Load Balancing controller is enabled in the cluster. - // When enabled, it runs a small pod in the cluster that manages the load - // balancers. - Disabled bool `protobuf:"varint,1,opt,name=disabled,proto3" json:"disabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *HttpLoadBalancing) Reset() { *m = HttpLoadBalancing{} } -func (m *HttpLoadBalancing) String() string { return proto.CompactTextString(m) } -func (*HttpLoadBalancing) ProtoMessage() {} -func (*HttpLoadBalancing) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{6} -} - -func (m *HttpLoadBalancing) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_HttpLoadBalancing.Unmarshal(m, b) -} -func (m *HttpLoadBalancing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_HttpLoadBalancing.Marshal(b, m, deterministic) -} -func (m *HttpLoadBalancing) XXX_Merge(src proto.Message) { - xxx_messageInfo_HttpLoadBalancing.Merge(m, src) -} -func (m *HttpLoadBalancing) XXX_Size() int { - return xxx_messageInfo_HttpLoadBalancing.Size(m) -} -func (m *HttpLoadBalancing) XXX_DiscardUnknown() { - xxx_messageInfo_HttpLoadBalancing.DiscardUnknown(m) -} - -var xxx_messageInfo_HttpLoadBalancing proto.InternalMessageInfo - -func (m *HttpLoadBalancing) GetDisabled() bool { - if m != nil { - return m.Disabled - } - return false -} - -// Configuration options for the horizontal pod autoscaling feature, which -// increases or decreases the number of replica pods a replication controller -// has based on the resource usage of the existing pods. -type HorizontalPodAutoscaling struct { - // Whether the Horizontal Pod Autoscaling feature is enabled in the cluster. - // When enabled, it ensures that a Heapster pod is running in the cluster, - // which is also used by the Cloud Monitoring service. - Disabled bool `protobuf:"varint,1,opt,name=disabled,proto3" json:"disabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *HorizontalPodAutoscaling) Reset() { *m = HorizontalPodAutoscaling{} } -func (m *HorizontalPodAutoscaling) String() string { return proto.CompactTextString(m) } -func (*HorizontalPodAutoscaling) ProtoMessage() {} -func (*HorizontalPodAutoscaling) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{7} -} - -func (m *HorizontalPodAutoscaling) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_HorizontalPodAutoscaling.Unmarshal(m, b) -} -func (m *HorizontalPodAutoscaling) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_HorizontalPodAutoscaling.Marshal(b, m, deterministic) -} -func (m *HorizontalPodAutoscaling) XXX_Merge(src proto.Message) { - xxx_messageInfo_HorizontalPodAutoscaling.Merge(m, src) -} -func (m *HorizontalPodAutoscaling) XXX_Size() int { - return xxx_messageInfo_HorizontalPodAutoscaling.Size(m) -} -func (m *HorizontalPodAutoscaling) XXX_DiscardUnknown() { - xxx_messageInfo_HorizontalPodAutoscaling.DiscardUnknown(m) -} - -var xxx_messageInfo_HorizontalPodAutoscaling proto.InternalMessageInfo - -func (m *HorizontalPodAutoscaling) GetDisabled() bool { - if m != nil { - return m.Disabled - } - return false -} - -// Configuration for the Kubernetes Dashboard. -type KubernetesDashboard struct { - // Whether the Kubernetes Dashboard is enabled for this cluster. - Disabled bool `protobuf:"varint,1,opt,name=disabled,proto3" json:"disabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *KubernetesDashboard) Reset() { *m = KubernetesDashboard{} } -func (m *KubernetesDashboard) String() string { return proto.CompactTextString(m) } -func (*KubernetesDashboard) ProtoMessage() {} -func (*KubernetesDashboard) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{8} -} - -func (m *KubernetesDashboard) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_KubernetesDashboard.Unmarshal(m, b) -} -func (m *KubernetesDashboard) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_KubernetesDashboard.Marshal(b, m, deterministic) -} -func (m *KubernetesDashboard) XXX_Merge(src proto.Message) { - xxx_messageInfo_KubernetesDashboard.Merge(m, src) -} -func (m *KubernetesDashboard) XXX_Size() int { - return xxx_messageInfo_KubernetesDashboard.Size(m) -} -func (m *KubernetesDashboard) XXX_DiscardUnknown() { - xxx_messageInfo_KubernetesDashboard.DiscardUnknown(m) -} - -var xxx_messageInfo_KubernetesDashboard proto.InternalMessageInfo - -func (m *KubernetesDashboard) GetDisabled() bool { - if m != nil { - return m.Disabled - } - return false -} - -// Configuration for NetworkPolicy. This only tracks whether the addon -// is enabled or not on the Master, it does not track whether network policy -// is enabled for the nodes. -type NetworkPolicyConfig struct { - // Whether NetworkPolicy is enabled for this cluster. - Disabled bool `protobuf:"varint,1,opt,name=disabled,proto3" json:"disabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NetworkPolicyConfig) Reset() { *m = NetworkPolicyConfig{} } -func (m *NetworkPolicyConfig) String() string { return proto.CompactTextString(m) } -func (*NetworkPolicyConfig) ProtoMessage() {} -func (*NetworkPolicyConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{9} -} - -func (m *NetworkPolicyConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NetworkPolicyConfig.Unmarshal(m, b) -} -func (m *NetworkPolicyConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NetworkPolicyConfig.Marshal(b, m, deterministic) -} -func (m *NetworkPolicyConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_NetworkPolicyConfig.Merge(m, src) -} -func (m *NetworkPolicyConfig) XXX_Size() int { - return xxx_messageInfo_NetworkPolicyConfig.Size(m) -} -func (m *NetworkPolicyConfig) XXX_DiscardUnknown() { - xxx_messageInfo_NetworkPolicyConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_NetworkPolicyConfig proto.InternalMessageInfo - -func (m *NetworkPolicyConfig) GetDisabled() bool { - if m != nil { - return m.Disabled - } - return false -} - -// Configuration options for private clusters. -type PrivateClusterConfig struct { - // Whether nodes have internal IP addresses only. If enabled, all nodes are - // given only RFC 1918 private addresses and communicate with the master via - // private networking. - EnablePrivateNodes bool `protobuf:"varint,1,opt,name=enable_private_nodes,json=enablePrivateNodes,proto3" json:"enable_private_nodes,omitempty"` - // Whether the master's internal IP address is used as the cluster endpoint. - EnablePrivateEndpoint bool `protobuf:"varint,2,opt,name=enable_private_endpoint,json=enablePrivateEndpoint,proto3" json:"enable_private_endpoint,omitempty"` - // The IP range in CIDR notation to use for the hosted master network. This - // range will be used for assigning internal IP addresses to the master or - // set of masters, as well as the ILB VIP. This range must not overlap with - // any other ranges in use within the cluster's network. - MasterIpv4CidrBlock string `protobuf:"bytes,3,opt,name=master_ipv4_cidr_block,json=masterIpv4CidrBlock,proto3" json:"master_ipv4_cidr_block,omitempty"` - // Output only. The internal IP address of this cluster's master endpoint. - PrivateEndpoint string `protobuf:"bytes,4,opt,name=private_endpoint,json=privateEndpoint,proto3" json:"private_endpoint,omitempty"` - // Output only. The external IP address of this cluster's master endpoint. - PublicEndpoint string `protobuf:"bytes,5,opt,name=public_endpoint,json=publicEndpoint,proto3" json:"public_endpoint,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PrivateClusterConfig) Reset() { *m = PrivateClusterConfig{} } -func (m *PrivateClusterConfig) String() string { return proto.CompactTextString(m) } -func (*PrivateClusterConfig) ProtoMessage() {} -func (*PrivateClusterConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{10} -} - -func (m *PrivateClusterConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PrivateClusterConfig.Unmarshal(m, b) -} -func (m *PrivateClusterConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PrivateClusterConfig.Marshal(b, m, deterministic) -} -func (m *PrivateClusterConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_PrivateClusterConfig.Merge(m, src) -} -func (m *PrivateClusterConfig) XXX_Size() int { - return xxx_messageInfo_PrivateClusterConfig.Size(m) -} -func (m *PrivateClusterConfig) XXX_DiscardUnknown() { - xxx_messageInfo_PrivateClusterConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_PrivateClusterConfig proto.InternalMessageInfo - -func (m *PrivateClusterConfig) GetEnablePrivateNodes() bool { - if m != nil { - return m.EnablePrivateNodes - } - return false -} - -func (m *PrivateClusterConfig) GetEnablePrivateEndpoint() bool { - if m != nil { - return m.EnablePrivateEndpoint - } - return false -} - -func (m *PrivateClusterConfig) GetMasterIpv4CidrBlock() string { - if m != nil { - return m.MasterIpv4CidrBlock - } - return "" -} - -func (m *PrivateClusterConfig) GetPrivateEndpoint() string { - if m != nil { - return m.PrivateEndpoint - } - return "" -} - -func (m *PrivateClusterConfig) GetPublicEndpoint() string { - if m != nil { - return m.PublicEndpoint - } - return "" -} - -// Configuration for returning group information from authenticators. -type AuthenticatorGroupsConfig struct { - // Whether this cluster should return group membership lookups - // during authentication using a group of security groups. - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - // The name of the security group-of-groups to be used. Only relevant - // if enabled = true. - SecurityGroup string `protobuf:"bytes,2,opt,name=security_group,json=securityGroup,proto3" json:"security_group,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AuthenticatorGroupsConfig) Reset() { *m = AuthenticatorGroupsConfig{} } -func (m *AuthenticatorGroupsConfig) String() string { return proto.CompactTextString(m) } -func (*AuthenticatorGroupsConfig) ProtoMessage() {} -func (*AuthenticatorGroupsConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{11} -} - -func (m *AuthenticatorGroupsConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AuthenticatorGroupsConfig.Unmarshal(m, b) -} -func (m *AuthenticatorGroupsConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AuthenticatorGroupsConfig.Marshal(b, m, deterministic) -} -func (m *AuthenticatorGroupsConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_AuthenticatorGroupsConfig.Merge(m, src) -} -func (m *AuthenticatorGroupsConfig) XXX_Size() int { - return xxx_messageInfo_AuthenticatorGroupsConfig.Size(m) -} -func (m *AuthenticatorGroupsConfig) XXX_DiscardUnknown() { - xxx_messageInfo_AuthenticatorGroupsConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_AuthenticatorGroupsConfig proto.InternalMessageInfo - -func (m *AuthenticatorGroupsConfig) GetEnabled() bool { - if m != nil { - return m.Enabled - } - return false -} - -func (m *AuthenticatorGroupsConfig) GetSecurityGroup() string { - if m != nil { - return m.SecurityGroup - } - return "" -} - -// Configuration options for the Cloud Run feature. -type CloudRunConfig struct { - // Whether Cloud Run addon is enabled for this cluster. - Disabled bool `protobuf:"varint,1,opt,name=disabled,proto3" json:"disabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CloudRunConfig) Reset() { *m = CloudRunConfig{} } -func (m *CloudRunConfig) String() string { return proto.CompactTextString(m) } -func (*CloudRunConfig) ProtoMessage() {} -func (*CloudRunConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{12} -} - -func (m *CloudRunConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CloudRunConfig.Unmarshal(m, b) -} -func (m *CloudRunConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CloudRunConfig.Marshal(b, m, deterministic) -} -func (m *CloudRunConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_CloudRunConfig.Merge(m, src) -} -func (m *CloudRunConfig) XXX_Size() int { - return xxx_messageInfo_CloudRunConfig.Size(m) -} -func (m *CloudRunConfig) XXX_DiscardUnknown() { - xxx_messageInfo_CloudRunConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_CloudRunConfig proto.InternalMessageInfo - -func (m *CloudRunConfig) GetDisabled() bool { - if m != nil { - return m.Disabled - } - return false -} - -// Configuration options for the master authorized networks feature. Enabled -// master authorized networks will disallow all external traffic to access -// Kubernetes master through HTTPS except traffic from the given CIDR blocks, -// Google Compute Engine Public IPs and Google Prod IPs. -type MasterAuthorizedNetworksConfig struct { - // Whether or not master authorized networks is enabled. - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - // cidr_blocks define up to 50 external networks that could access - // Kubernetes master through HTTPS. - CidrBlocks []*MasterAuthorizedNetworksConfig_CidrBlock `protobuf:"bytes,2,rep,name=cidr_blocks,json=cidrBlocks,proto3" json:"cidr_blocks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MasterAuthorizedNetworksConfig) Reset() { *m = MasterAuthorizedNetworksConfig{} } -func (m *MasterAuthorizedNetworksConfig) String() string { return proto.CompactTextString(m) } -func (*MasterAuthorizedNetworksConfig) ProtoMessage() {} -func (*MasterAuthorizedNetworksConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{13} -} - -func (m *MasterAuthorizedNetworksConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MasterAuthorizedNetworksConfig.Unmarshal(m, b) -} -func (m *MasterAuthorizedNetworksConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MasterAuthorizedNetworksConfig.Marshal(b, m, deterministic) -} -func (m *MasterAuthorizedNetworksConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_MasterAuthorizedNetworksConfig.Merge(m, src) -} -func (m *MasterAuthorizedNetworksConfig) XXX_Size() int { - return xxx_messageInfo_MasterAuthorizedNetworksConfig.Size(m) -} -func (m *MasterAuthorizedNetworksConfig) XXX_DiscardUnknown() { - xxx_messageInfo_MasterAuthorizedNetworksConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_MasterAuthorizedNetworksConfig proto.InternalMessageInfo - -func (m *MasterAuthorizedNetworksConfig) GetEnabled() bool { - if m != nil { - return m.Enabled - } - return false -} - -func (m *MasterAuthorizedNetworksConfig) GetCidrBlocks() []*MasterAuthorizedNetworksConfig_CidrBlock { - if m != nil { - return m.CidrBlocks - } - return nil -} - -// CidrBlock contains an optional name and one CIDR block. -type MasterAuthorizedNetworksConfig_CidrBlock struct { - // display_name is an optional field for users to identify CIDR blocks. - DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // cidr_block must be specified in CIDR notation. - CidrBlock string `protobuf:"bytes,2,opt,name=cidr_block,json=cidrBlock,proto3" json:"cidr_block,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MasterAuthorizedNetworksConfig_CidrBlock) Reset() { - *m = MasterAuthorizedNetworksConfig_CidrBlock{} -} -func (m *MasterAuthorizedNetworksConfig_CidrBlock) String() string { return proto.CompactTextString(m) } -func (*MasterAuthorizedNetworksConfig_CidrBlock) ProtoMessage() {} -func (*MasterAuthorizedNetworksConfig_CidrBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{13, 0} -} - -func (m *MasterAuthorizedNetworksConfig_CidrBlock) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MasterAuthorizedNetworksConfig_CidrBlock.Unmarshal(m, b) -} -func (m *MasterAuthorizedNetworksConfig_CidrBlock) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MasterAuthorizedNetworksConfig_CidrBlock.Marshal(b, m, deterministic) -} -func (m *MasterAuthorizedNetworksConfig_CidrBlock) XXX_Merge(src proto.Message) { - xxx_messageInfo_MasterAuthorizedNetworksConfig_CidrBlock.Merge(m, src) -} -func (m *MasterAuthorizedNetworksConfig_CidrBlock) XXX_Size() int { - return xxx_messageInfo_MasterAuthorizedNetworksConfig_CidrBlock.Size(m) -} -func (m *MasterAuthorizedNetworksConfig_CidrBlock) XXX_DiscardUnknown() { - xxx_messageInfo_MasterAuthorizedNetworksConfig_CidrBlock.DiscardUnknown(m) -} - -var xxx_messageInfo_MasterAuthorizedNetworksConfig_CidrBlock proto.InternalMessageInfo - -func (m *MasterAuthorizedNetworksConfig_CidrBlock) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -func (m *MasterAuthorizedNetworksConfig_CidrBlock) GetCidrBlock() string { - if m != nil { - return m.CidrBlock - } - return "" -} - -// Configuration for the legacy Attribute Based Access Control authorization -// mode. -type LegacyAbac struct { - // Whether the ABAC authorizer is enabled for this cluster. When enabled, - // identities in the system, including service accounts, nodes, and - // controllers, will have statically granted permissions beyond those - // provided by the RBAC configuration or IAM. - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LegacyAbac) Reset() { *m = LegacyAbac{} } -func (m *LegacyAbac) String() string { return proto.CompactTextString(m) } -func (*LegacyAbac) ProtoMessage() {} -func (*LegacyAbac) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{14} -} - -func (m *LegacyAbac) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LegacyAbac.Unmarshal(m, b) -} -func (m *LegacyAbac) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LegacyAbac.Marshal(b, m, deterministic) -} -func (m *LegacyAbac) XXX_Merge(src proto.Message) { - xxx_messageInfo_LegacyAbac.Merge(m, src) -} -func (m *LegacyAbac) XXX_Size() int { - return xxx_messageInfo_LegacyAbac.Size(m) -} -func (m *LegacyAbac) XXX_DiscardUnknown() { - xxx_messageInfo_LegacyAbac.DiscardUnknown(m) -} - -var xxx_messageInfo_LegacyAbac proto.InternalMessageInfo - -func (m *LegacyAbac) GetEnabled() bool { - if m != nil { - return m.Enabled - } - return false -} - -// Configuration options for the NetworkPolicy feature. -// https://kubernetes.io/docs/concepts/services-networking/networkpolicies/ -type NetworkPolicy struct { - // The selected network policy provider. - Provider NetworkPolicy_Provider `protobuf:"varint,1,opt,name=provider,proto3,enum=google.container.v1.NetworkPolicy_Provider" json:"provider,omitempty"` - // Whether network policy is enabled on the cluster. - Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NetworkPolicy) Reset() { *m = NetworkPolicy{} } -func (m *NetworkPolicy) String() string { return proto.CompactTextString(m) } -func (*NetworkPolicy) ProtoMessage() {} -func (*NetworkPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{15} -} - -func (m *NetworkPolicy) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NetworkPolicy.Unmarshal(m, b) -} -func (m *NetworkPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NetworkPolicy.Marshal(b, m, deterministic) -} -func (m *NetworkPolicy) XXX_Merge(src proto.Message) { - xxx_messageInfo_NetworkPolicy.Merge(m, src) -} -func (m *NetworkPolicy) XXX_Size() int { - return xxx_messageInfo_NetworkPolicy.Size(m) -} -func (m *NetworkPolicy) XXX_DiscardUnknown() { - xxx_messageInfo_NetworkPolicy.DiscardUnknown(m) -} - -var xxx_messageInfo_NetworkPolicy proto.InternalMessageInfo - -func (m *NetworkPolicy) GetProvider() NetworkPolicy_Provider { - if m != nil { - return m.Provider - } - return NetworkPolicy_PROVIDER_UNSPECIFIED -} - -func (m *NetworkPolicy) GetEnabled() bool { - if m != nil { - return m.Enabled - } - return false -} - -// Configuration for Binary Authorization. -type BinaryAuthorization struct { - // Enable Binary Authorization for this cluster. If enabled, all container - // images will be validated by Binary Authorization. - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BinaryAuthorization) Reset() { *m = BinaryAuthorization{} } -func (m *BinaryAuthorization) String() string { return proto.CompactTextString(m) } -func (*BinaryAuthorization) ProtoMessage() {} -func (*BinaryAuthorization) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{16} -} - -func (m *BinaryAuthorization) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BinaryAuthorization.Unmarshal(m, b) -} -func (m *BinaryAuthorization) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BinaryAuthorization.Marshal(b, m, deterministic) -} -func (m *BinaryAuthorization) XXX_Merge(src proto.Message) { - xxx_messageInfo_BinaryAuthorization.Merge(m, src) -} -func (m *BinaryAuthorization) XXX_Size() int { - return xxx_messageInfo_BinaryAuthorization.Size(m) -} -func (m *BinaryAuthorization) XXX_DiscardUnknown() { - xxx_messageInfo_BinaryAuthorization.DiscardUnknown(m) -} - -var xxx_messageInfo_BinaryAuthorization proto.InternalMessageInfo - -func (m *BinaryAuthorization) GetEnabled() bool { - if m != nil { - return m.Enabled - } - return false -} - -// Configuration for controlling how IPs are allocated in the cluster. -type IPAllocationPolicy struct { - // Whether alias IPs will be used for pod IPs in the cluster. - UseIpAliases bool `protobuf:"varint,1,opt,name=use_ip_aliases,json=useIpAliases,proto3" json:"use_ip_aliases,omitempty"` - // Whether a new subnetwork will be created automatically for the cluster. - // - // This field is only applicable when `use_ip_aliases` is true. - CreateSubnetwork bool `protobuf:"varint,2,opt,name=create_subnetwork,json=createSubnetwork,proto3" json:"create_subnetwork,omitempty"` - // A custom subnetwork name to be used if `create_subnetwork` is true. If - // this field is empty, then an automatic name will be chosen for the new - // subnetwork. - SubnetworkName string `protobuf:"bytes,3,opt,name=subnetwork_name,json=subnetworkName,proto3" json:"subnetwork_name,omitempty"` - // This field is deprecated, use cluster_ipv4_cidr_block. - ClusterIpv4Cidr string `protobuf:"bytes,4,opt,name=cluster_ipv4_cidr,json=clusterIpv4Cidr,proto3" json:"cluster_ipv4_cidr,omitempty"` // Deprecated: Do not use. - // This field is deprecated, use node_ipv4_cidr_block. - NodeIpv4Cidr string `protobuf:"bytes,5,opt,name=node_ipv4_cidr,json=nodeIpv4Cidr,proto3" json:"node_ipv4_cidr,omitempty"` // Deprecated: Do not use. - // This field is deprecated, use services_ipv4_cidr_block. - ServicesIpv4Cidr string `protobuf:"bytes,6,opt,name=services_ipv4_cidr,json=servicesIpv4Cidr,proto3" json:"services_ipv4_cidr,omitempty"` // Deprecated: Do not use. - // The name of the secondary range to be used for the cluster CIDR - // block. The secondary range will be used for pod IP - // addresses. This must be an existing secondary range associated - // with the cluster subnetwork. - // - // This field is only applicable with use_ip_aliases is true and - // create_subnetwork is false. - ClusterSecondaryRangeName string `protobuf:"bytes,7,opt,name=cluster_secondary_range_name,json=clusterSecondaryRangeName,proto3" json:"cluster_secondary_range_name,omitempty"` - // The name of the secondary range to be used as for the services - // CIDR block. The secondary range will be used for service - // ClusterIPs. This must be an existing secondary range associated - // with the cluster subnetwork. - // - // This field is only applicable with use_ip_aliases is true and - // create_subnetwork is false. - ServicesSecondaryRangeName string `protobuf:"bytes,8,opt,name=services_secondary_range_name,json=servicesSecondaryRangeName,proto3" json:"services_secondary_range_name,omitempty"` - // The IP address range for the cluster pod IPs. If this field is set, then - // `cluster.cluster_ipv4_cidr` must be left blank. - // - // This field is only applicable when `use_ip_aliases` is true. - // - // Set to blank to have a range chosen with the default size. - // - // Set to /netmask (e.g. `/14`) to have a range chosen with a specific - // netmask. - // - // Set to a - // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) - // notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g. - // `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range - // to use. - ClusterIpv4CidrBlock string `protobuf:"bytes,9,opt,name=cluster_ipv4_cidr_block,json=clusterIpv4CidrBlock,proto3" json:"cluster_ipv4_cidr_block,omitempty"` - // The IP address range of the instance IPs in this cluster. - // - // This is applicable only if `create_subnetwork` is true. - // - // Set to blank to have a range chosen with the default size. - // - // Set to /netmask (e.g. `/14`) to have a range chosen with a specific - // netmask. - // - // Set to a - // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) - // notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g. - // `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range - // to use. - NodeIpv4CidrBlock string `protobuf:"bytes,10,opt,name=node_ipv4_cidr_block,json=nodeIpv4CidrBlock,proto3" json:"node_ipv4_cidr_block,omitempty"` - // The IP address range of the services IPs in this cluster. If blank, a range - // will be automatically chosen with the default size. - // - // This field is only applicable when `use_ip_aliases` is true. - // - // Set to blank to have a range chosen with the default size. - // - // Set to /netmask (e.g. `/14`) to have a range chosen with a specific - // netmask. - // - // Set to a - // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) - // notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g. - // `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range - // to use. - ServicesIpv4CidrBlock string `protobuf:"bytes,11,opt,name=services_ipv4_cidr_block,json=servicesIpv4CidrBlock,proto3" json:"services_ipv4_cidr_block,omitempty"` - // The IP address range of the Cloud TPUs in this cluster. If unspecified, a - // range will be automatically chosen with the default size. - // - // This field is only applicable when `use_ip_aliases` is true. - // - // If unspecified, the range will use the default size. - // - // Set to /netmask (e.g. `/14`) to have a range chosen with a specific - // netmask. - // - // Set to a - // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) - // notation (e.g. `10.96.0.0/14`) from the RFC-1918 private networks (e.g. - // `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`) to pick a specific range - // to use. - TpuIpv4CidrBlock string `protobuf:"bytes,13,opt,name=tpu_ipv4_cidr_block,json=tpuIpv4CidrBlock,proto3" json:"tpu_ipv4_cidr_block,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *IPAllocationPolicy) Reset() { *m = IPAllocationPolicy{} } -func (m *IPAllocationPolicy) String() string { return proto.CompactTextString(m) } -func (*IPAllocationPolicy) ProtoMessage() {} -func (*IPAllocationPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{17} -} - -func (m *IPAllocationPolicy) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_IPAllocationPolicy.Unmarshal(m, b) -} -func (m *IPAllocationPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_IPAllocationPolicy.Marshal(b, m, deterministic) -} -func (m *IPAllocationPolicy) XXX_Merge(src proto.Message) { - xxx_messageInfo_IPAllocationPolicy.Merge(m, src) -} -func (m *IPAllocationPolicy) XXX_Size() int { - return xxx_messageInfo_IPAllocationPolicy.Size(m) -} -func (m *IPAllocationPolicy) XXX_DiscardUnknown() { - xxx_messageInfo_IPAllocationPolicy.DiscardUnknown(m) -} - -var xxx_messageInfo_IPAllocationPolicy proto.InternalMessageInfo - -func (m *IPAllocationPolicy) GetUseIpAliases() bool { - if m != nil { - return m.UseIpAliases - } - return false -} - -func (m *IPAllocationPolicy) GetCreateSubnetwork() bool { - if m != nil { - return m.CreateSubnetwork - } - return false -} - -func (m *IPAllocationPolicy) GetSubnetworkName() string { - if m != nil { - return m.SubnetworkName - } - return "" -} - -// Deprecated: Do not use. -func (m *IPAllocationPolicy) GetClusterIpv4Cidr() string { - if m != nil { - return m.ClusterIpv4Cidr - } - return "" -} - -// Deprecated: Do not use. -func (m *IPAllocationPolicy) GetNodeIpv4Cidr() string { - if m != nil { - return m.NodeIpv4Cidr - } - return "" -} - -// Deprecated: Do not use. -func (m *IPAllocationPolicy) GetServicesIpv4Cidr() string { - if m != nil { - return m.ServicesIpv4Cidr - } - return "" -} - -func (m *IPAllocationPolicy) GetClusterSecondaryRangeName() string { - if m != nil { - return m.ClusterSecondaryRangeName - } - return "" -} - -func (m *IPAllocationPolicy) GetServicesSecondaryRangeName() string { - if m != nil { - return m.ServicesSecondaryRangeName - } - return "" -} - -func (m *IPAllocationPolicy) GetClusterIpv4CidrBlock() string { - if m != nil { - return m.ClusterIpv4CidrBlock - } - return "" -} - -func (m *IPAllocationPolicy) GetNodeIpv4CidrBlock() string { - if m != nil { - return m.NodeIpv4CidrBlock - } - return "" -} - -func (m *IPAllocationPolicy) GetServicesIpv4CidrBlock() string { - if m != nil { - return m.ServicesIpv4CidrBlock - } - return "" -} - -func (m *IPAllocationPolicy) GetTpuIpv4CidrBlock() string { - if m != nil { - return m.TpuIpv4CidrBlock - } - return "" -} - -// A Google Kubernetes Engine cluster. -type Cluster struct { - // The name of this cluster. The name must be unique within this project - // and location (e.g. zone or region), and can be up to 40 characters with - // the following restrictions: - // - // * Lowercase letters, numbers, and hyphens only. - // * Must start with a letter. - // * Must end with a number or a letter. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // An optional description of this cluster. - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - // The number of nodes to create in this cluster. You must ensure that your - // Compute Engine resource quota - // is sufficient for this number of instances. You must also have available - // firewall and routes quota. - // For requests, this field should only be used in lieu of a - // "node_pool" object, since this configuration (along with the - // "node_config") will be used to create a "NodePool" object with an - // auto-generated name. Do not use this and a node_pool at the same time. - // - // This field is deprecated, use node_pool.initial_node_count instead. - InitialNodeCount int32 `protobuf:"varint,3,opt,name=initial_node_count,json=initialNodeCount,proto3" json:"initial_node_count,omitempty"` // Deprecated: Do not use. - // Parameters used in creating the cluster's nodes. - // For requests, this field should only be used in lieu of a - // "node_pool" object, since this configuration (along with the - // "initial_node_count") will be used to create a "NodePool" object with an - // auto-generated name. Do not use this and a node_pool at the same time. - // For responses, this field will be populated with the node configuration of - // the first node pool. (For configuration of each node pool, see - // `node_pool.config`) - // - // If unspecified, the defaults are used. - // This field is deprecated, use node_pool.config instead. - NodeConfig *NodeConfig `protobuf:"bytes,4,opt,name=node_config,json=nodeConfig,proto3" json:"node_config,omitempty"` // Deprecated: Do not use. - // The authentication information for accessing the master endpoint. - // If unspecified, the defaults are used: - // For clusters before v1.12, if master_auth is unspecified, `username` will - // be set to "admin", a random password will be generated, and a client - // certificate will be issued. - MasterAuth *MasterAuth `protobuf:"bytes,5,opt,name=master_auth,json=masterAuth,proto3" json:"master_auth,omitempty"` - // The logging service the cluster should use to write logs. - // Currently available options: - // - // * "logging.googleapis.com/kubernetes" - the Google Cloud Logging - // service with Kubernetes-native resource model - // * `logging.googleapis.com` - the Google Cloud Logging service. - // * `none` - no logs will be exported from the cluster. - // * if left as an empty string,`logging.googleapis.com` will be used. - LoggingService string `protobuf:"bytes,6,opt,name=logging_service,json=loggingService,proto3" json:"logging_service,omitempty"` - // The monitoring service the cluster should use to write metrics. - // Currently available options: - // - // * `monitoring.googleapis.com` - the Google Cloud Monitoring service. - // * `none` - no metrics will be exported from the cluster. - // * if left as an empty string, `monitoring.googleapis.com` will be used. - MonitoringService string `protobuf:"bytes,7,opt,name=monitoring_service,json=monitoringService,proto3" json:"monitoring_service,omitempty"` - // The name of the Google Compute Engine - // [network](/compute/docs/networks-and-firewalls#networks) to which the - // cluster is connected. If left unspecified, the `default` network - // will be used. - Network string `protobuf:"bytes,8,opt,name=network,proto3" json:"network,omitempty"` - // The IP address range of the container pods in this cluster, in - // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) - // notation (e.g. `10.96.0.0/14`). Leave blank to have - // one automatically chosen or specify a `/14` block in `10.0.0.0/8`. - ClusterIpv4Cidr string `protobuf:"bytes,9,opt,name=cluster_ipv4_cidr,json=clusterIpv4Cidr,proto3" json:"cluster_ipv4_cidr,omitempty"` - // Configurations for the various addons available to run in the cluster. - AddonsConfig *AddonsConfig `protobuf:"bytes,10,opt,name=addons_config,json=addonsConfig,proto3" json:"addons_config,omitempty"` - // The name of the Google Compute Engine - // [subnetwork](/compute/docs/subnetworks) to which the - // cluster is connected. - Subnetwork string `protobuf:"bytes,11,opt,name=subnetwork,proto3" json:"subnetwork,omitempty"` - // The node pools associated with this cluster. - // This field should not be set if "node_config" or "initial_node_count" are - // specified. - NodePools []*NodePool `protobuf:"bytes,12,rep,name=node_pools,json=nodePools,proto3" json:"node_pools,omitempty"` - // The list of Google Compute Engine - // [zones](/compute/docs/zones#available) in which the cluster's nodes - // should be located. - Locations []string `protobuf:"bytes,13,rep,name=locations,proto3" json:"locations,omitempty"` - // Kubernetes alpha features are enabled on this cluster. This includes alpha - // API groups (e.g. v1alpha1) and features that may not be production ready in - // the kubernetes version of the master and nodes. - // The cluster has no SLA for uptime and master/node upgrades are disabled. - // Alpha enabled clusters are automatically deleted thirty days after - // creation. - EnableKubernetesAlpha bool `protobuf:"varint,14,opt,name=enable_kubernetes_alpha,json=enableKubernetesAlpha,proto3" json:"enable_kubernetes_alpha,omitempty"` - // The resource labels for the cluster to use to annotate any related - // Google Compute Engine resources. - ResourceLabels map[string]string `protobuf:"bytes,15,rep,name=resource_labels,json=resourceLabels,proto3" json:"resource_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // The fingerprint of the set of labels for this cluster. - LabelFingerprint string `protobuf:"bytes,16,opt,name=label_fingerprint,json=labelFingerprint,proto3" json:"label_fingerprint,omitempty"` - // Configuration for the legacy ABAC authorization mode. - LegacyAbac *LegacyAbac `protobuf:"bytes,18,opt,name=legacy_abac,json=legacyAbac,proto3" json:"legacy_abac,omitempty"` - // Configuration options for the NetworkPolicy feature. - NetworkPolicy *NetworkPolicy `protobuf:"bytes,19,opt,name=network_policy,json=networkPolicy,proto3" json:"network_policy,omitempty"` - // Configuration for cluster IP allocation. - IpAllocationPolicy *IPAllocationPolicy `protobuf:"bytes,20,opt,name=ip_allocation_policy,json=ipAllocationPolicy,proto3" json:"ip_allocation_policy,omitempty"` - // The configuration options for master authorized networks feature. - MasterAuthorizedNetworksConfig *MasterAuthorizedNetworksConfig `protobuf:"bytes,22,opt,name=master_authorized_networks_config,json=masterAuthorizedNetworksConfig,proto3" json:"master_authorized_networks_config,omitempty"` - // Configure the maintenance policy for this cluster. - MaintenancePolicy *MaintenancePolicy `protobuf:"bytes,23,opt,name=maintenance_policy,json=maintenancePolicy,proto3" json:"maintenance_policy,omitempty"` - // Configuration for Binary Authorization. - BinaryAuthorization *BinaryAuthorization `protobuf:"bytes,24,opt,name=binary_authorization,json=binaryAuthorization,proto3" json:"binary_authorization,omitempty"` - // Cluster-level autoscaling configuration. - Autoscaling *ClusterAutoscaling `protobuf:"bytes,26,opt,name=autoscaling,proto3" json:"autoscaling,omitempty"` - // Configuration for cluster networking. - NetworkConfig *NetworkConfig `protobuf:"bytes,27,opt,name=network_config,json=networkConfig,proto3" json:"network_config,omitempty"` - // The default constraint on the maximum number of pods that can be run - // simultaneously on a node in the node pool of this cluster. Only honored - // if cluster created with IP Alias support. - DefaultMaxPodsConstraint *MaxPodsConstraint `protobuf:"bytes,30,opt,name=default_max_pods_constraint,json=defaultMaxPodsConstraint,proto3" json:"default_max_pods_constraint,omitempty"` - // Configuration for exporting resource usages. Resource usage export is - // disabled when this config is unspecified. - ResourceUsageExportConfig *ResourceUsageExportConfig `protobuf:"bytes,33,opt,name=resource_usage_export_config,json=resourceUsageExportConfig,proto3" json:"resource_usage_export_config,omitempty"` - // Configuration controlling RBAC group membership information. - AuthenticatorGroupsConfig *AuthenticatorGroupsConfig `protobuf:"bytes,34,opt,name=authenticator_groups_config,json=authenticatorGroupsConfig,proto3" json:"authenticator_groups_config,omitempty"` - // Configuration for private cluster. - PrivateClusterConfig *PrivateClusterConfig `protobuf:"bytes,37,opt,name=private_cluster_config,json=privateClusterConfig,proto3" json:"private_cluster_config,omitempty"` - // Configuration of etcd encryption. - DatabaseEncryption *DatabaseEncryption `protobuf:"bytes,38,opt,name=database_encryption,json=databaseEncryption,proto3" json:"database_encryption,omitempty"` - // Cluster-level Vertical Pod Autoscaling configuration. - VerticalPodAutoscaling *VerticalPodAutoscaling `protobuf:"bytes,39,opt,name=vertical_pod_autoscaling,json=verticalPodAutoscaling,proto3" json:"vertical_pod_autoscaling,omitempty"` - // [Output only] Server-defined URL for the resource. - SelfLink string `protobuf:"bytes,100,opt,name=self_link,json=selfLink,proto3" json:"self_link,omitempty"` - // [Output only] The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field is deprecated, use location instead. - Zone string `protobuf:"bytes,101,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // [Output only] The IP address of this cluster's master endpoint. - // The endpoint can be accessed from the internet at - // `https://username:password@endpoint/`. - // - // See the `masterAuth` property of this resource for username and - // password information. - Endpoint string `protobuf:"bytes,102,opt,name=endpoint,proto3" json:"endpoint,omitempty"` - // The initial Kubernetes version for this cluster. Valid versions are those - // found in validMasterVersions returned by getServerConfig. The version can - // be upgraded over time; such upgrades are reflected in - // currentMasterVersion and currentNodeVersion. - // - // Users may specify either explicit versions offered by - // Kubernetes Engine or version aliases, which have the following behavior: - // - // - "latest": picks the highest valid Kubernetes version - // - "1.X": picks the highest valid patch+gke.N patch in the 1.X version - // - "1.X.Y": picks the highest valid gke.N patch in the 1.X.Y version - // - "1.X.Y-gke.N": picks an explicit Kubernetes version - // - "","-": picks the default Kubernetes version - InitialClusterVersion string `protobuf:"bytes,103,opt,name=initial_cluster_version,json=initialClusterVersion,proto3" json:"initial_cluster_version,omitempty"` - // [Output only] The current software version of the master endpoint. - CurrentMasterVersion string `protobuf:"bytes,104,opt,name=current_master_version,json=currentMasterVersion,proto3" json:"current_master_version,omitempty"` - // [Output only] Deprecated, use - // [NodePools.version](/kubernetes-engine/docs/reference/rest/v1/projects.zones.clusters.nodePools) - // instead. The current version of the node software components. If they are - // currently at multiple versions because they're in the process of being - // upgraded, this reflects the minimum version of all nodes. - CurrentNodeVersion string `protobuf:"bytes,105,opt,name=current_node_version,json=currentNodeVersion,proto3" json:"current_node_version,omitempty"` // Deprecated: Do not use. - // [Output only] The time the cluster was created, in - // [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format. - CreateTime string `protobuf:"bytes,106,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` - // [Output only] The current status of this cluster. - Status Cluster_Status `protobuf:"varint,107,opt,name=status,proto3,enum=google.container.v1.Cluster_Status" json:"status,omitempty"` - // [Output only] Additional information about the current status of this - // cluster, if available. - StatusMessage string `protobuf:"bytes,108,opt,name=status_message,json=statusMessage,proto3" json:"status_message,omitempty"` - // [Output only] The size of the address space on each node for hosting - // containers. This is provisioned from within the `container_ipv4_cidr` - // range. This field will only be set when cluster is in route-based network - // mode. - NodeIpv4CidrSize int32 `protobuf:"varint,109,opt,name=node_ipv4_cidr_size,json=nodeIpv4CidrSize,proto3" json:"node_ipv4_cidr_size,omitempty"` - // [Output only] The IP address range of the Kubernetes services in - // this cluster, in - // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) - // notation (e.g. `1.2.3.4/29`). Service addresses are - // typically put in the last `/16` from the container CIDR. - ServicesIpv4Cidr string `protobuf:"bytes,110,opt,name=services_ipv4_cidr,json=servicesIpv4Cidr,proto3" json:"services_ipv4_cidr,omitempty"` - // Deprecated. Use node_pools.instance_group_urls. - InstanceGroupUrls []string `protobuf:"bytes,111,rep,name=instance_group_urls,json=instanceGroupUrls,proto3" json:"instance_group_urls,omitempty"` // Deprecated: Do not use. - // [Output only] The number of nodes currently in the cluster. Deprecated. - // Call Kubernetes API directly to retrieve node information. - CurrentNodeCount int32 `protobuf:"varint,112,opt,name=current_node_count,json=currentNodeCount,proto3" json:"current_node_count,omitempty"` // Deprecated: Do not use. - // [Output only] The time the cluster will be automatically - // deleted in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format. - ExpireTime string `protobuf:"bytes,113,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"` - // [Output only] The name of the Google Compute Engine - // [zone](/compute/docs/regions-zones/regions-zones#available) or - // [region](/compute/docs/regions-zones/regions-zones#available) in which - // the cluster resides. - Location string `protobuf:"bytes,114,opt,name=location,proto3" json:"location,omitempty"` - // Enable the ability to use Cloud TPUs in this cluster. - EnableTpu bool `protobuf:"varint,115,opt,name=enable_tpu,json=enableTpu,proto3" json:"enable_tpu,omitempty"` - // [Output only] The IP address range of the Cloud TPUs in this cluster, in - // [CIDR](http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) - // notation (e.g. `1.2.3.4/29`). - TpuIpv4CidrBlock string `protobuf:"bytes,116,opt,name=tpu_ipv4_cidr_block,json=tpuIpv4CidrBlock,proto3" json:"tpu_ipv4_cidr_block,omitempty"` - // Which conditions caused the current cluster state. - Conditions []*StatusCondition `protobuf:"bytes,118,rep,name=conditions,proto3" json:"conditions,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Cluster) Reset() { *m = Cluster{} } -func (m *Cluster) String() string { return proto.CompactTextString(m) } -func (*Cluster) ProtoMessage() {} -func (*Cluster) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{18} -} - -func (m *Cluster) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Cluster.Unmarshal(m, b) -} -func (m *Cluster) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Cluster.Marshal(b, m, deterministic) -} -func (m *Cluster) XXX_Merge(src proto.Message) { - xxx_messageInfo_Cluster.Merge(m, src) -} -func (m *Cluster) XXX_Size() int { - return xxx_messageInfo_Cluster.Size(m) -} -func (m *Cluster) XXX_DiscardUnknown() { - xxx_messageInfo_Cluster.DiscardUnknown(m) -} - -var xxx_messageInfo_Cluster proto.InternalMessageInfo - -func (m *Cluster) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Cluster) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -// Deprecated: Do not use. -func (m *Cluster) GetInitialNodeCount() int32 { - if m != nil { - return m.InitialNodeCount - } - return 0 -} - -// Deprecated: Do not use. -func (m *Cluster) GetNodeConfig() *NodeConfig { - if m != nil { - return m.NodeConfig - } - return nil -} - -func (m *Cluster) GetMasterAuth() *MasterAuth { - if m != nil { - return m.MasterAuth - } - return nil -} - -func (m *Cluster) GetLoggingService() string { - if m != nil { - return m.LoggingService - } - return "" -} - -func (m *Cluster) GetMonitoringService() string { - if m != nil { - return m.MonitoringService - } - return "" -} - -func (m *Cluster) GetNetwork() string { - if m != nil { - return m.Network - } - return "" -} - -func (m *Cluster) GetClusterIpv4Cidr() string { - if m != nil { - return m.ClusterIpv4Cidr - } - return "" -} - -func (m *Cluster) GetAddonsConfig() *AddonsConfig { - if m != nil { - return m.AddonsConfig - } - return nil -} - -func (m *Cluster) GetSubnetwork() string { - if m != nil { - return m.Subnetwork - } - return "" -} - -func (m *Cluster) GetNodePools() []*NodePool { - if m != nil { - return m.NodePools - } - return nil -} - -func (m *Cluster) GetLocations() []string { - if m != nil { - return m.Locations - } - return nil -} - -func (m *Cluster) GetEnableKubernetesAlpha() bool { - if m != nil { - return m.EnableKubernetesAlpha - } - return false -} - -func (m *Cluster) GetResourceLabels() map[string]string { - if m != nil { - return m.ResourceLabels - } - return nil -} - -func (m *Cluster) GetLabelFingerprint() string { - if m != nil { - return m.LabelFingerprint - } - return "" -} - -func (m *Cluster) GetLegacyAbac() *LegacyAbac { - if m != nil { - return m.LegacyAbac - } - return nil -} - -func (m *Cluster) GetNetworkPolicy() *NetworkPolicy { - if m != nil { - return m.NetworkPolicy - } - return nil -} - -func (m *Cluster) GetIpAllocationPolicy() *IPAllocationPolicy { - if m != nil { - return m.IpAllocationPolicy - } - return nil -} - -func (m *Cluster) GetMasterAuthorizedNetworksConfig() *MasterAuthorizedNetworksConfig { - if m != nil { - return m.MasterAuthorizedNetworksConfig - } - return nil -} - -func (m *Cluster) GetMaintenancePolicy() *MaintenancePolicy { - if m != nil { - return m.MaintenancePolicy - } - return nil -} - -func (m *Cluster) GetBinaryAuthorization() *BinaryAuthorization { - if m != nil { - return m.BinaryAuthorization - } - return nil -} - -func (m *Cluster) GetAutoscaling() *ClusterAutoscaling { - if m != nil { - return m.Autoscaling - } - return nil -} - -func (m *Cluster) GetNetworkConfig() *NetworkConfig { - if m != nil { - return m.NetworkConfig - } - return nil -} - -func (m *Cluster) GetDefaultMaxPodsConstraint() *MaxPodsConstraint { - if m != nil { - return m.DefaultMaxPodsConstraint - } - return nil -} - -func (m *Cluster) GetResourceUsageExportConfig() *ResourceUsageExportConfig { - if m != nil { - return m.ResourceUsageExportConfig - } - return nil -} - -func (m *Cluster) GetAuthenticatorGroupsConfig() *AuthenticatorGroupsConfig { - if m != nil { - return m.AuthenticatorGroupsConfig - } - return nil -} - -func (m *Cluster) GetPrivateClusterConfig() *PrivateClusterConfig { - if m != nil { - return m.PrivateClusterConfig - } - return nil -} - -func (m *Cluster) GetDatabaseEncryption() *DatabaseEncryption { - if m != nil { - return m.DatabaseEncryption - } - return nil -} - -func (m *Cluster) GetVerticalPodAutoscaling() *VerticalPodAutoscaling { - if m != nil { - return m.VerticalPodAutoscaling - } - return nil -} - -func (m *Cluster) GetSelfLink() string { - if m != nil { - return m.SelfLink - } - return "" -} - -// Deprecated: Do not use. -func (m *Cluster) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -func (m *Cluster) GetEndpoint() string { - if m != nil { - return m.Endpoint - } - return "" -} - -func (m *Cluster) GetInitialClusterVersion() string { - if m != nil { - return m.InitialClusterVersion - } - return "" -} - -func (m *Cluster) GetCurrentMasterVersion() string { - if m != nil { - return m.CurrentMasterVersion - } - return "" -} - -// Deprecated: Do not use. -func (m *Cluster) GetCurrentNodeVersion() string { - if m != nil { - return m.CurrentNodeVersion - } - return "" -} - -func (m *Cluster) GetCreateTime() string { - if m != nil { - return m.CreateTime - } - return "" -} - -func (m *Cluster) GetStatus() Cluster_Status { - if m != nil { - return m.Status - } - return Cluster_STATUS_UNSPECIFIED -} - -func (m *Cluster) GetStatusMessage() string { - if m != nil { - return m.StatusMessage - } - return "" -} - -func (m *Cluster) GetNodeIpv4CidrSize() int32 { - if m != nil { - return m.NodeIpv4CidrSize - } - return 0 -} - -func (m *Cluster) GetServicesIpv4Cidr() string { - if m != nil { - return m.ServicesIpv4Cidr - } - return "" -} - -// Deprecated: Do not use. -func (m *Cluster) GetInstanceGroupUrls() []string { - if m != nil { - return m.InstanceGroupUrls - } - return nil -} - -// Deprecated: Do not use. -func (m *Cluster) GetCurrentNodeCount() int32 { - if m != nil { - return m.CurrentNodeCount - } - return 0 -} - -func (m *Cluster) GetExpireTime() string { - if m != nil { - return m.ExpireTime - } - return "" -} - -func (m *Cluster) GetLocation() string { - if m != nil { - return m.Location - } - return "" -} - -func (m *Cluster) GetEnableTpu() bool { - if m != nil { - return m.EnableTpu - } - return false -} - -func (m *Cluster) GetTpuIpv4CidrBlock() string { - if m != nil { - return m.TpuIpv4CidrBlock - } - return "" -} - -func (m *Cluster) GetConditions() []*StatusCondition { - if m != nil { - return m.Conditions - } - return nil -} - -// ClusterUpdate describes an update to the cluster. Exactly one update can -// be applied to a cluster with each request, so at most one field can be -// provided. -type ClusterUpdate struct { - // The Kubernetes version to change the nodes to (typically an - // upgrade). - // - // Users may specify either explicit versions offered by - // Kubernetes Engine or version aliases, which have the following behavior: - // - // - "latest": picks the highest valid Kubernetes version - // - "1.X": picks the highest valid patch+gke.N patch in the 1.X version - // - "1.X.Y": picks the highest valid gke.N patch in the 1.X.Y version - // - "1.X.Y-gke.N": picks an explicit Kubernetes version - // - "-": picks the Kubernetes master version - DesiredNodeVersion string `protobuf:"bytes,4,opt,name=desired_node_version,json=desiredNodeVersion,proto3" json:"desired_node_version,omitempty"` - // The monitoring service the cluster should use to write metrics. - // Currently available options: - // - // * "monitoring.googleapis.com/kubernetes" - the Google Cloud Monitoring - // service with Kubernetes-native resource model - // * "monitoring.googleapis.com" - the Google Cloud Monitoring service - // * "none" - no metrics will be exported from the cluster - DesiredMonitoringService string `protobuf:"bytes,5,opt,name=desired_monitoring_service,json=desiredMonitoringService,proto3" json:"desired_monitoring_service,omitempty"` - // Configurations for the various addons available to run in the cluster. - DesiredAddonsConfig *AddonsConfig `protobuf:"bytes,6,opt,name=desired_addons_config,json=desiredAddonsConfig,proto3" json:"desired_addons_config,omitempty"` - // The node pool to be upgraded. This field is mandatory if - // "desired_node_version", "desired_image_family" or - // "desired_node_pool_autoscaling" is specified and there is more than one - // node pool on the cluster. - DesiredNodePoolId string `protobuf:"bytes,7,opt,name=desired_node_pool_id,json=desiredNodePoolId,proto3" json:"desired_node_pool_id,omitempty"` - // The desired image type for the node pool. - // NOTE: Set the "desired_node_pool" field as well. - DesiredImageType string `protobuf:"bytes,8,opt,name=desired_image_type,json=desiredImageType,proto3" json:"desired_image_type,omitempty"` - // Configuration of etcd encryption. - DesiredDatabaseEncryption *DatabaseEncryption `protobuf:"bytes,46,opt,name=desired_database_encryption,json=desiredDatabaseEncryption,proto3" json:"desired_database_encryption,omitempty"` - // Autoscaler configuration for the node pool specified in - // desired_node_pool_id. If there is only one pool in the - // cluster and desired_node_pool_id is not provided then - // the change applies to that single node pool. - DesiredNodePoolAutoscaling *NodePoolAutoscaling `protobuf:"bytes,9,opt,name=desired_node_pool_autoscaling,json=desiredNodePoolAutoscaling,proto3" json:"desired_node_pool_autoscaling,omitempty"` - // The desired list of Google Compute Engine - // [zones](/compute/docs/zones#available) in which the cluster's nodes - // should be located. Changing the locations a cluster is in will result - // in nodes being either created or removed from the cluster, depending on - // whether locations are being added or removed. - // - // This list must always include the cluster's primary zone. - DesiredLocations []string `protobuf:"bytes,10,rep,name=desired_locations,json=desiredLocations,proto3" json:"desired_locations,omitempty"` - // The desired configuration options for master authorized networks feature. - DesiredMasterAuthorizedNetworksConfig *MasterAuthorizedNetworksConfig `protobuf:"bytes,12,opt,name=desired_master_authorized_networks_config,json=desiredMasterAuthorizedNetworksConfig,proto3" json:"desired_master_authorized_networks_config,omitempty"` - // Cluster-level autoscaling configuration. - DesiredClusterAutoscaling *ClusterAutoscaling `protobuf:"bytes,15,opt,name=desired_cluster_autoscaling,json=desiredClusterAutoscaling,proto3" json:"desired_cluster_autoscaling,omitempty"` - // The desired configuration options for the Binary Authorization feature. - DesiredBinaryAuthorization *BinaryAuthorization `protobuf:"bytes,16,opt,name=desired_binary_authorization,json=desiredBinaryAuthorization,proto3" json:"desired_binary_authorization,omitempty"` - // The logging service the cluster should use to write logs. - // Currently available options: - // - // * "logging.googleapis.com/kubernetes" - the Google Cloud Logging - // service with Kubernetes-native resource model - // * "logging.googleapis.com" - the Google Cloud Logging service - // * "none" - no logs will be exported from the cluster - DesiredLoggingService string `protobuf:"bytes,19,opt,name=desired_logging_service,json=desiredLoggingService,proto3" json:"desired_logging_service,omitempty"` - // The desired configuration for exporting resource usage. - DesiredResourceUsageExportConfig *ResourceUsageExportConfig `protobuf:"bytes,21,opt,name=desired_resource_usage_export_config,json=desiredResourceUsageExportConfig,proto3" json:"desired_resource_usage_export_config,omitempty"` - // Cluster-level Vertical Pod Autoscaling configuration. - DesiredVerticalPodAutoscaling *VerticalPodAutoscaling `protobuf:"bytes,22,opt,name=desired_vertical_pod_autoscaling,json=desiredVerticalPodAutoscaling,proto3" json:"desired_vertical_pod_autoscaling,omitempty"` - // The desired config of Intra-node visibility. - DesiredIntraNodeVisibilityConfig *IntraNodeVisibilityConfig `protobuf:"bytes,26,opt,name=desired_intra_node_visibility_config,json=desiredIntraNodeVisibilityConfig,proto3" json:"desired_intra_node_visibility_config,omitempty"` - // The Kubernetes version to change the master to. - // - // Users may specify either explicit versions offered by - // Kubernetes Engine or version aliases, which have the following behavior: - // - // - "latest": picks the highest valid Kubernetes version - // - "1.X": picks the highest valid patch+gke.N patch in the 1.X version - // - "1.X.Y": picks the highest valid gke.N patch in the 1.X.Y version - // - "1.X.Y-gke.N": picks an explicit Kubernetes version - // - "-": picks the default Kubernetes version - DesiredMasterVersion string `protobuf:"bytes,100,opt,name=desired_master_version,json=desiredMasterVersion,proto3" json:"desired_master_version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ClusterUpdate) Reset() { *m = ClusterUpdate{} } -func (m *ClusterUpdate) String() string { return proto.CompactTextString(m) } -func (*ClusterUpdate) ProtoMessage() {} -func (*ClusterUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{19} -} - -func (m *ClusterUpdate) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ClusterUpdate.Unmarshal(m, b) -} -func (m *ClusterUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ClusterUpdate.Marshal(b, m, deterministic) -} -func (m *ClusterUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_ClusterUpdate.Merge(m, src) -} -func (m *ClusterUpdate) XXX_Size() int { - return xxx_messageInfo_ClusterUpdate.Size(m) -} -func (m *ClusterUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_ClusterUpdate.DiscardUnknown(m) -} - -var xxx_messageInfo_ClusterUpdate proto.InternalMessageInfo - -func (m *ClusterUpdate) GetDesiredNodeVersion() string { - if m != nil { - return m.DesiredNodeVersion - } - return "" -} - -func (m *ClusterUpdate) GetDesiredMonitoringService() string { - if m != nil { - return m.DesiredMonitoringService - } - return "" -} - -func (m *ClusterUpdate) GetDesiredAddonsConfig() *AddonsConfig { - if m != nil { - return m.DesiredAddonsConfig - } - return nil -} - -func (m *ClusterUpdate) GetDesiredNodePoolId() string { - if m != nil { - return m.DesiredNodePoolId - } - return "" -} - -func (m *ClusterUpdate) GetDesiredImageType() string { - if m != nil { - return m.DesiredImageType - } - return "" -} - -func (m *ClusterUpdate) GetDesiredDatabaseEncryption() *DatabaseEncryption { - if m != nil { - return m.DesiredDatabaseEncryption - } - return nil -} - -func (m *ClusterUpdate) GetDesiredNodePoolAutoscaling() *NodePoolAutoscaling { - if m != nil { - return m.DesiredNodePoolAutoscaling - } - return nil -} - -func (m *ClusterUpdate) GetDesiredLocations() []string { - if m != nil { - return m.DesiredLocations - } - return nil -} - -func (m *ClusterUpdate) GetDesiredMasterAuthorizedNetworksConfig() *MasterAuthorizedNetworksConfig { - if m != nil { - return m.DesiredMasterAuthorizedNetworksConfig - } - return nil -} - -func (m *ClusterUpdate) GetDesiredClusterAutoscaling() *ClusterAutoscaling { - if m != nil { - return m.DesiredClusterAutoscaling - } - return nil -} - -func (m *ClusterUpdate) GetDesiredBinaryAuthorization() *BinaryAuthorization { - if m != nil { - return m.DesiredBinaryAuthorization - } - return nil -} - -func (m *ClusterUpdate) GetDesiredLoggingService() string { - if m != nil { - return m.DesiredLoggingService - } - return "" -} - -func (m *ClusterUpdate) GetDesiredResourceUsageExportConfig() *ResourceUsageExportConfig { - if m != nil { - return m.DesiredResourceUsageExportConfig - } - return nil -} - -func (m *ClusterUpdate) GetDesiredVerticalPodAutoscaling() *VerticalPodAutoscaling { - if m != nil { - return m.DesiredVerticalPodAutoscaling - } - return nil -} - -func (m *ClusterUpdate) GetDesiredIntraNodeVisibilityConfig() *IntraNodeVisibilityConfig { - if m != nil { - return m.DesiredIntraNodeVisibilityConfig - } - return nil -} - -func (m *ClusterUpdate) GetDesiredMasterVersion() string { - if m != nil { - return m.DesiredMasterVersion - } - return "" -} - -// This operation resource represents operations that may have happened or are -// happening on the cluster. All fields are output only. -type Operation struct { - // The server-assigned ID for the operation. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the operation - // is taking place. - // This field is deprecated, use location instead. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // The operation type. - OperationType Operation_Type `protobuf:"varint,3,opt,name=operation_type,json=operationType,proto3,enum=google.container.v1.Operation_Type" json:"operation_type,omitempty"` - // The current status of the operation. - Status Operation_Status `protobuf:"varint,4,opt,name=status,proto3,enum=google.container.v1.Operation_Status" json:"status,omitempty"` - // Detailed operation progress, if available. - Detail string `protobuf:"bytes,8,opt,name=detail,proto3" json:"detail,omitempty"` - // If an error has occurred, a textual description of the error. - StatusMessage string `protobuf:"bytes,5,opt,name=status_message,json=statusMessage,proto3" json:"status_message,omitempty"` - // Server-defined URL for the resource. - SelfLink string `protobuf:"bytes,6,opt,name=self_link,json=selfLink,proto3" json:"self_link,omitempty"` - // Server-defined URL for the target of the operation. - TargetLink string `protobuf:"bytes,7,opt,name=target_link,json=targetLink,proto3" json:"target_link,omitempty"` - // [Output only] The name of the Google Compute Engine - // [zone](/compute/docs/regions-zones/regions-zones#available) or - // [region](/compute/docs/regions-zones/regions-zones#available) in which - // the cluster resides. - Location string `protobuf:"bytes,9,opt,name=location,proto3" json:"location,omitempty"` - // [Output only] The time the operation started, in - // [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format. - StartTime string `protobuf:"bytes,10,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - // [Output only] The time the operation completed, in - // [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format. - EndTime string `protobuf:"bytes,11,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` - // Which conditions caused the current cluster state. - ClusterConditions []*StatusCondition `protobuf:"bytes,13,rep,name=cluster_conditions,json=clusterConditions,proto3" json:"cluster_conditions,omitempty"` - // Which conditions caused the current node pool state. - NodepoolConditions []*StatusCondition `protobuf:"bytes,14,rep,name=nodepool_conditions,json=nodepoolConditions,proto3" json:"nodepool_conditions,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Operation) Reset() { *m = Operation{} } -func (m *Operation) String() string { return proto.CompactTextString(m) } -func (*Operation) ProtoMessage() {} -func (*Operation) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{20} -} - -func (m *Operation) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Operation.Unmarshal(m, b) -} -func (m *Operation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Operation.Marshal(b, m, deterministic) -} -func (m *Operation) XXX_Merge(src proto.Message) { - xxx_messageInfo_Operation.Merge(m, src) -} -func (m *Operation) XXX_Size() int { - return xxx_messageInfo_Operation.Size(m) -} -func (m *Operation) XXX_DiscardUnknown() { - xxx_messageInfo_Operation.DiscardUnknown(m) -} - -var xxx_messageInfo_Operation proto.InternalMessageInfo - -func (m *Operation) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// Deprecated: Do not use. -func (m *Operation) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -func (m *Operation) GetOperationType() Operation_Type { - if m != nil { - return m.OperationType - } - return Operation_TYPE_UNSPECIFIED -} - -func (m *Operation) GetStatus() Operation_Status { - if m != nil { - return m.Status - } - return Operation_STATUS_UNSPECIFIED -} - -func (m *Operation) GetDetail() string { - if m != nil { - return m.Detail - } - return "" -} - -func (m *Operation) GetStatusMessage() string { - if m != nil { - return m.StatusMessage - } - return "" -} - -func (m *Operation) GetSelfLink() string { - if m != nil { - return m.SelfLink - } - return "" -} - -func (m *Operation) GetTargetLink() string { - if m != nil { - return m.TargetLink - } - return "" -} - -func (m *Operation) GetLocation() string { - if m != nil { - return m.Location - } - return "" -} - -func (m *Operation) GetStartTime() string { - if m != nil { - return m.StartTime - } - return "" -} - -func (m *Operation) GetEndTime() string { - if m != nil { - return m.EndTime - } - return "" -} - -func (m *Operation) GetClusterConditions() []*StatusCondition { - if m != nil { - return m.ClusterConditions - } - return nil -} - -func (m *Operation) GetNodepoolConditions() []*StatusCondition { - if m != nil { - return m.NodepoolConditions - } - return nil -} - -// CreateClusterRequest creates a cluster. -type CreateClusterRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the parent field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the parent field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Required. A [cluster - // resource](/container-engine/reference/rest/v1/projects.zones.clusters) - Cluster *Cluster `protobuf:"bytes,3,opt,name=cluster,proto3" json:"cluster,omitempty"` - // The parent (project and location) where the cluster will be created. - // Specified in the format 'projects/*/locations/*'. - Parent string `protobuf:"bytes,5,opt,name=parent,proto3" json:"parent,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateClusterRequest) Reset() { *m = CreateClusterRequest{} } -func (m *CreateClusterRequest) String() string { return proto.CompactTextString(m) } -func (*CreateClusterRequest) ProtoMessage() {} -func (*CreateClusterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{21} -} - -func (m *CreateClusterRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateClusterRequest.Unmarshal(m, b) -} -func (m *CreateClusterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateClusterRequest.Marshal(b, m, deterministic) -} -func (m *CreateClusterRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateClusterRequest.Merge(m, src) -} -func (m *CreateClusterRequest) XXX_Size() int { - return xxx_messageInfo_CreateClusterRequest.Size(m) -} -func (m *CreateClusterRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateClusterRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateClusterRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *CreateClusterRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *CreateClusterRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -func (m *CreateClusterRequest) GetCluster() *Cluster { - if m != nil { - return m.Cluster - } - return nil -} - -func (m *CreateClusterRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -// GetClusterRequest gets the settings of a cluster. -type GetClusterRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to retrieve. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // The name (project, location, cluster) of the cluster to retrieve. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetClusterRequest) Reset() { *m = GetClusterRequest{} } -func (m *GetClusterRequest) String() string { return proto.CompactTextString(m) } -func (*GetClusterRequest) ProtoMessage() {} -func (*GetClusterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{22} -} - -func (m *GetClusterRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetClusterRequest.Unmarshal(m, b) -} -func (m *GetClusterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetClusterRequest.Marshal(b, m, deterministic) -} -func (m *GetClusterRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetClusterRequest.Merge(m, src) -} -func (m *GetClusterRequest) XXX_Size() int { - return xxx_messageInfo_GetClusterRequest.Size(m) -} -func (m *GetClusterRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetClusterRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetClusterRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *GetClusterRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *GetClusterRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *GetClusterRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *GetClusterRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// UpdateClusterRequest updates the settings of a cluster. -type UpdateClusterRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to upgrade. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Required. A description of the update. - Update *ClusterUpdate `protobuf:"bytes,4,opt,name=update,proto3" json:"update,omitempty"` - // The name (project, location, cluster) of the cluster to update. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UpdateClusterRequest) Reset() { *m = UpdateClusterRequest{} } -func (m *UpdateClusterRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateClusterRequest) ProtoMessage() {} -func (*UpdateClusterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{23} -} - -func (m *UpdateClusterRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UpdateClusterRequest.Unmarshal(m, b) -} -func (m *UpdateClusterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UpdateClusterRequest.Marshal(b, m, deterministic) -} -func (m *UpdateClusterRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateClusterRequest.Merge(m, src) -} -func (m *UpdateClusterRequest) XXX_Size() int { - return xxx_messageInfo_UpdateClusterRequest.Size(m) -} -func (m *UpdateClusterRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateClusterRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_UpdateClusterRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *UpdateClusterRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *UpdateClusterRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *UpdateClusterRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *UpdateClusterRequest) GetUpdate() *ClusterUpdate { - if m != nil { - return m.Update - } - return nil -} - -func (m *UpdateClusterRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// UpdateNodePoolRequests update a node pool's image and/or version. -type UpdateNodePoolRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to upgrade. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the node pool to upgrade. - // This field has been deprecated and replaced by the name field. - NodePoolId string `protobuf:"bytes,4,opt,name=node_pool_id,json=nodePoolId,proto3" json:"node_pool_id,omitempty"` // Deprecated: Do not use. - // Required. The Kubernetes version to change the nodes to (typically an - // upgrade). - // - // Users may specify either explicit versions offered by Kubernetes Engine or - // version aliases, which have the following behavior: - // - // - "latest": picks the highest valid Kubernetes version - // - "1.X": picks the highest valid patch+gke.N patch in the 1.X version - // - "1.X.Y": picks the highest valid gke.N patch in the 1.X.Y version - // - "1.X.Y-gke.N": picks an explicit Kubernetes version - // - "-": picks the Kubernetes master version - NodeVersion string `protobuf:"bytes,5,opt,name=node_version,json=nodeVersion,proto3" json:"node_version,omitempty"` - // Required. The desired image type for the node pool. - ImageType string `protobuf:"bytes,6,opt,name=image_type,json=imageType,proto3" json:"image_type,omitempty"` - // The name (project, location, cluster, node pool) of the node pool to - // update. Specified in the format - // 'projects/*/locations/*/clusters/*/nodePools/*'. - Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UpdateNodePoolRequest) Reset() { *m = UpdateNodePoolRequest{} } -func (m *UpdateNodePoolRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateNodePoolRequest) ProtoMessage() {} -func (*UpdateNodePoolRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{24} -} - -func (m *UpdateNodePoolRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UpdateNodePoolRequest.Unmarshal(m, b) -} -func (m *UpdateNodePoolRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UpdateNodePoolRequest.Marshal(b, m, deterministic) -} -func (m *UpdateNodePoolRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateNodePoolRequest.Merge(m, src) -} -func (m *UpdateNodePoolRequest) XXX_Size() int { - return xxx_messageInfo_UpdateNodePoolRequest.Size(m) -} -func (m *UpdateNodePoolRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateNodePoolRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_UpdateNodePoolRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *UpdateNodePoolRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *UpdateNodePoolRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *UpdateNodePoolRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -// Deprecated: Do not use. -func (m *UpdateNodePoolRequest) GetNodePoolId() string { - if m != nil { - return m.NodePoolId - } - return "" -} - -func (m *UpdateNodePoolRequest) GetNodeVersion() string { - if m != nil { - return m.NodeVersion - } - return "" -} - -func (m *UpdateNodePoolRequest) GetImageType() string { - if m != nil { - return m.ImageType - } - return "" -} - -func (m *UpdateNodePoolRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// SetNodePoolAutoscalingRequest sets the autoscaler settings of a node pool. -type SetNodePoolAutoscalingRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to upgrade. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the node pool to upgrade. - // This field has been deprecated and replaced by the name field. - NodePoolId string `protobuf:"bytes,4,opt,name=node_pool_id,json=nodePoolId,proto3" json:"node_pool_id,omitempty"` // Deprecated: Do not use. - // Required. Autoscaling configuration for the node pool. - Autoscaling *NodePoolAutoscaling `protobuf:"bytes,5,opt,name=autoscaling,proto3" json:"autoscaling,omitempty"` - // The name (project, location, cluster, node pool) of the node pool to set - // autoscaler settings. Specified in the format - // 'projects/*/locations/*/clusters/*/nodePools/*'. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetNodePoolAutoscalingRequest) Reset() { *m = SetNodePoolAutoscalingRequest{} } -func (m *SetNodePoolAutoscalingRequest) String() string { return proto.CompactTextString(m) } -func (*SetNodePoolAutoscalingRequest) ProtoMessage() {} -func (*SetNodePoolAutoscalingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{25} -} - -func (m *SetNodePoolAutoscalingRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetNodePoolAutoscalingRequest.Unmarshal(m, b) -} -func (m *SetNodePoolAutoscalingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetNodePoolAutoscalingRequest.Marshal(b, m, deterministic) -} -func (m *SetNodePoolAutoscalingRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetNodePoolAutoscalingRequest.Merge(m, src) -} -func (m *SetNodePoolAutoscalingRequest) XXX_Size() int { - return xxx_messageInfo_SetNodePoolAutoscalingRequest.Size(m) -} -func (m *SetNodePoolAutoscalingRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetNodePoolAutoscalingRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetNodePoolAutoscalingRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *SetNodePoolAutoscalingRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetNodePoolAutoscalingRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *SetNodePoolAutoscalingRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetNodePoolAutoscalingRequest) GetNodePoolId() string { - if m != nil { - return m.NodePoolId - } - return "" -} - -func (m *SetNodePoolAutoscalingRequest) GetAutoscaling() *NodePoolAutoscaling { - if m != nil { - return m.Autoscaling - } - return nil -} - -func (m *SetNodePoolAutoscalingRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// SetLoggingServiceRequest sets the logging service of a cluster. -type SetLoggingServiceRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to upgrade. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Required. The logging service the cluster should use to write metrics. - // Currently available options: - // - // * "logging.googleapis.com" - the Google Cloud Logging service - // * "none" - no metrics will be exported from the cluster - LoggingService string `protobuf:"bytes,4,opt,name=logging_service,json=loggingService,proto3" json:"logging_service,omitempty"` - // The name (project, location, cluster) of the cluster to set logging. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetLoggingServiceRequest) Reset() { *m = SetLoggingServiceRequest{} } -func (m *SetLoggingServiceRequest) String() string { return proto.CompactTextString(m) } -func (*SetLoggingServiceRequest) ProtoMessage() {} -func (*SetLoggingServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{26} -} - -func (m *SetLoggingServiceRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetLoggingServiceRequest.Unmarshal(m, b) -} -func (m *SetLoggingServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetLoggingServiceRequest.Marshal(b, m, deterministic) -} -func (m *SetLoggingServiceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetLoggingServiceRequest.Merge(m, src) -} -func (m *SetLoggingServiceRequest) XXX_Size() int { - return xxx_messageInfo_SetLoggingServiceRequest.Size(m) -} -func (m *SetLoggingServiceRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetLoggingServiceRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetLoggingServiceRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *SetLoggingServiceRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetLoggingServiceRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *SetLoggingServiceRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *SetLoggingServiceRequest) GetLoggingService() string { - if m != nil { - return m.LoggingService - } - return "" -} - -func (m *SetLoggingServiceRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// SetMonitoringServiceRequest sets the monitoring service of a cluster. -type SetMonitoringServiceRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to upgrade. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Required. The monitoring service the cluster should use to write metrics. - // Currently available options: - // - // * "monitoring.googleapis.com/kubernetes" - the Google Cloud Monitoring - // service with Kubernetes-native resource model - // * "monitoring.googleapis.com" - the Google Cloud Monitoring service - // * "none" - no metrics will be exported from the cluster - MonitoringService string `protobuf:"bytes,4,opt,name=monitoring_service,json=monitoringService,proto3" json:"monitoring_service,omitempty"` - // The name (project, location, cluster) of the cluster to set monitoring. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetMonitoringServiceRequest) Reset() { *m = SetMonitoringServiceRequest{} } -func (m *SetMonitoringServiceRequest) String() string { return proto.CompactTextString(m) } -func (*SetMonitoringServiceRequest) ProtoMessage() {} -func (*SetMonitoringServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{27} -} - -func (m *SetMonitoringServiceRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetMonitoringServiceRequest.Unmarshal(m, b) -} -func (m *SetMonitoringServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetMonitoringServiceRequest.Marshal(b, m, deterministic) -} -func (m *SetMonitoringServiceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetMonitoringServiceRequest.Merge(m, src) -} -func (m *SetMonitoringServiceRequest) XXX_Size() int { - return xxx_messageInfo_SetMonitoringServiceRequest.Size(m) -} -func (m *SetMonitoringServiceRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetMonitoringServiceRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetMonitoringServiceRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *SetMonitoringServiceRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetMonitoringServiceRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *SetMonitoringServiceRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *SetMonitoringServiceRequest) GetMonitoringService() string { - if m != nil { - return m.MonitoringService - } - return "" -} - -func (m *SetMonitoringServiceRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// SetAddonsConfigRequest sets the addons associated with the cluster. -type SetAddonsConfigRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to upgrade. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Required. The desired configurations for the various addons available to run in the - // cluster. - AddonsConfig *AddonsConfig `protobuf:"bytes,4,opt,name=addons_config,json=addonsConfig,proto3" json:"addons_config,omitempty"` - // The name (project, location, cluster) of the cluster to set addons. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetAddonsConfigRequest) Reset() { *m = SetAddonsConfigRequest{} } -func (m *SetAddonsConfigRequest) String() string { return proto.CompactTextString(m) } -func (*SetAddonsConfigRequest) ProtoMessage() {} -func (*SetAddonsConfigRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{28} -} - -func (m *SetAddonsConfigRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetAddonsConfigRequest.Unmarshal(m, b) -} -func (m *SetAddonsConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetAddonsConfigRequest.Marshal(b, m, deterministic) -} -func (m *SetAddonsConfigRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetAddonsConfigRequest.Merge(m, src) -} -func (m *SetAddonsConfigRequest) XXX_Size() int { - return xxx_messageInfo_SetAddonsConfigRequest.Size(m) -} -func (m *SetAddonsConfigRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetAddonsConfigRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetAddonsConfigRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *SetAddonsConfigRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetAddonsConfigRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *SetAddonsConfigRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *SetAddonsConfigRequest) GetAddonsConfig() *AddonsConfig { - if m != nil { - return m.AddonsConfig - } - return nil -} - -func (m *SetAddonsConfigRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// SetLocationsRequest sets the locations of the cluster. -type SetLocationsRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to upgrade. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Required. The desired list of Google Compute Engine - // [zones](/compute/docs/zones#available) in which the cluster's nodes - // should be located. Changing the locations a cluster is in will result - // in nodes being either created or removed from the cluster, depending on - // whether locations are being added or removed. - // - // This list must always include the cluster's primary zone. - Locations []string `protobuf:"bytes,4,rep,name=locations,proto3" json:"locations,omitempty"` - // The name (project, location, cluster) of the cluster to set locations. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetLocationsRequest) Reset() { *m = SetLocationsRequest{} } -func (m *SetLocationsRequest) String() string { return proto.CompactTextString(m) } -func (*SetLocationsRequest) ProtoMessage() {} -func (*SetLocationsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{29} -} - -func (m *SetLocationsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetLocationsRequest.Unmarshal(m, b) -} -func (m *SetLocationsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetLocationsRequest.Marshal(b, m, deterministic) -} -func (m *SetLocationsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetLocationsRequest.Merge(m, src) -} -func (m *SetLocationsRequest) XXX_Size() int { - return xxx_messageInfo_SetLocationsRequest.Size(m) -} -func (m *SetLocationsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetLocationsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetLocationsRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *SetLocationsRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetLocationsRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *SetLocationsRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *SetLocationsRequest) GetLocations() []string { - if m != nil { - return m.Locations - } - return nil -} - -func (m *SetLocationsRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// UpdateMasterRequest updates the master of the cluster. -type UpdateMasterRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to upgrade. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Required. The Kubernetes version to change the master to. - // - // Users may specify either explicit versions offered by Kubernetes Engine or - // version aliases, which have the following behavior: - // - // - "latest": picks the highest valid Kubernetes version - // - "1.X": picks the highest valid patch+gke.N patch in the 1.X version - // - "1.X.Y": picks the highest valid gke.N patch in the 1.X.Y version - // - "1.X.Y-gke.N": picks an explicit Kubernetes version - // - "-": picks the default Kubernetes version - MasterVersion string `protobuf:"bytes,4,opt,name=master_version,json=masterVersion,proto3" json:"master_version,omitempty"` - // The name (project, location, cluster) of the cluster to update. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UpdateMasterRequest) Reset() { *m = UpdateMasterRequest{} } -func (m *UpdateMasterRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateMasterRequest) ProtoMessage() {} -func (*UpdateMasterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{30} -} - -func (m *UpdateMasterRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UpdateMasterRequest.Unmarshal(m, b) -} -func (m *UpdateMasterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UpdateMasterRequest.Marshal(b, m, deterministic) -} -func (m *UpdateMasterRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateMasterRequest.Merge(m, src) -} -func (m *UpdateMasterRequest) XXX_Size() int { - return xxx_messageInfo_UpdateMasterRequest.Size(m) -} -func (m *UpdateMasterRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateMasterRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_UpdateMasterRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *UpdateMasterRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *UpdateMasterRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *UpdateMasterRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *UpdateMasterRequest) GetMasterVersion() string { - if m != nil { - return m.MasterVersion - } - return "" -} - -func (m *UpdateMasterRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// SetMasterAuthRequest updates the admin password of a cluster. -type SetMasterAuthRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to upgrade. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Required. The exact form of action to be taken on the master auth. - Action SetMasterAuthRequest_Action `protobuf:"varint,4,opt,name=action,proto3,enum=google.container.v1.SetMasterAuthRequest_Action" json:"action,omitempty"` - // Required. A description of the update. - Update *MasterAuth `protobuf:"bytes,5,opt,name=update,proto3" json:"update,omitempty"` - // The name (project, location, cluster) of the cluster to set auth. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetMasterAuthRequest) Reset() { *m = SetMasterAuthRequest{} } -func (m *SetMasterAuthRequest) String() string { return proto.CompactTextString(m) } -func (*SetMasterAuthRequest) ProtoMessage() {} -func (*SetMasterAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{31} -} - -func (m *SetMasterAuthRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetMasterAuthRequest.Unmarshal(m, b) -} -func (m *SetMasterAuthRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetMasterAuthRequest.Marshal(b, m, deterministic) -} -func (m *SetMasterAuthRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetMasterAuthRequest.Merge(m, src) -} -func (m *SetMasterAuthRequest) XXX_Size() int { - return xxx_messageInfo_SetMasterAuthRequest.Size(m) -} -func (m *SetMasterAuthRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetMasterAuthRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetMasterAuthRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *SetMasterAuthRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetMasterAuthRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *SetMasterAuthRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *SetMasterAuthRequest) GetAction() SetMasterAuthRequest_Action { - if m != nil { - return m.Action - } - return SetMasterAuthRequest_UNKNOWN -} - -func (m *SetMasterAuthRequest) GetUpdate() *MasterAuth { - if m != nil { - return m.Update - } - return nil -} - -func (m *SetMasterAuthRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// DeleteClusterRequest deletes a cluster. -type DeleteClusterRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to delete. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // The name (project, location, cluster) of the cluster to delete. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteClusterRequest) Reset() { *m = DeleteClusterRequest{} } -func (m *DeleteClusterRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteClusterRequest) ProtoMessage() {} -func (*DeleteClusterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{32} -} - -func (m *DeleteClusterRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteClusterRequest.Unmarshal(m, b) -} -func (m *DeleteClusterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteClusterRequest.Marshal(b, m, deterministic) -} -func (m *DeleteClusterRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteClusterRequest.Merge(m, src) -} -func (m *DeleteClusterRequest) XXX_Size() int { - return xxx_messageInfo_DeleteClusterRequest.Size(m) -} -func (m *DeleteClusterRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteClusterRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteClusterRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *DeleteClusterRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *DeleteClusterRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *DeleteClusterRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *DeleteClusterRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// ListClustersRequest lists clusters. -type ListClustersRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the parent field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides, or "-" for all zones. - // This field has been deprecated and replaced by the parent field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // The parent (project and location) where the clusters will be listed. - // Specified in the format 'projects/*/locations/*'. - // Location "-" matches all zones and all regions. - Parent string `protobuf:"bytes,4,opt,name=parent,proto3" json:"parent,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListClustersRequest) Reset() { *m = ListClustersRequest{} } -func (m *ListClustersRequest) String() string { return proto.CompactTextString(m) } -func (*ListClustersRequest) ProtoMessage() {} -func (*ListClustersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{33} -} - -func (m *ListClustersRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListClustersRequest.Unmarshal(m, b) -} -func (m *ListClustersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListClustersRequest.Marshal(b, m, deterministic) -} -func (m *ListClustersRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListClustersRequest.Merge(m, src) -} -func (m *ListClustersRequest) XXX_Size() int { - return xxx_messageInfo_ListClustersRequest.Size(m) -} -func (m *ListClustersRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListClustersRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListClustersRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *ListClustersRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *ListClustersRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -func (m *ListClustersRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -// ListClustersResponse is the result of ListClustersRequest. -type ListClustersResponse struct { - // A list of clusters in the project in the specified zone, or - // across all ones. - Clusters []*Cluster `protobuf:"bytes,1,rep,name=clusters,proto3" json:"clusters,omitempty"` - // If any zones are listed here, the list of clusters returned - // may be missing those zones. - MissingZones []string `protobuf:"bytes,2,rep,name=missing_zones,json=missingZones,proto3" json:"missing_zones,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListClustersResponse) Reset() { *m = ListClustersResponse{} } -func (m *ListClustersResponse) String() string { return proto.CompactTextString(m) } -func (*ListClustersResponse) ProtoMessage() {} -func (*ListClustersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{34} -} - -func (m *ListClustersResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListClustersResponse.Unmarshal(m, b) -} -func (m *ListClustersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListClustersResponse.Marshal(b, m, deterministic) -} -func (m *ListClustersResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListClustersResponse.Merge(m, src) -} -func (m *ListClustersResponse) XXX_Size() int { - return xxx_messageInfo_ListClustersResponse.Size(m) -} -func (m *ListClustersResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListClustersResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListClustersResponse proto.InternalMessageInfo - -func (m *ListClustersResponse) GetClusters() []*Cluster { - if m != nil { - return m.Clusters - } - return nil -} - -func (m *ListClustersResponse) GetMissingZones() []string { - if m != nil { - return m.MissingZones - } - return nil -} - -// GetOperationRequest gets a single operation. -type GetOperationRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The server-assigned `name` of the operation. - // This field has been deprecated and replaced by the name field. - OperationId string `protobuf:"bytes,3,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` // Deprecated: Do not use. - // The name (project, location, operation id) of the operation to get. - // Specified in the format 'projects/*/locations/*/operations/*'. - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetOperationRequest) Reset() { *m = GetOperationRequest{} } -func (m *GetOperationRequest) String() string { return proto.CompactTextString(m) } -func (*GetOperationRequest) ProtoMessage() {} -func (*GetOperationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{35} -} - -func (m *GetOperationRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetOperationRequest.Unmarshal(m, b) -} -func (m *GetOperationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetOperationRequest.Marshal(b, m, deterministic) -} -func (m *GetOperationRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetOperationRequest.Merge(m, src) -} -func (m *GetOperationRequest) XXX_Size() int { - return xxx_messageInfo_GetOperationRequest.Size(m) -} -func (m *GetOperationRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetOperationRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetOperationRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *GetOperationRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *GetOperationRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *GetOperationRequest) GetOperationId() string { - if m != nil { - return m.OperationId - } - return "" -} - -func (m *GetOperationRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// ListOperationsRequest lists operations. -type ListOperationsRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the parent field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) to return operations for, or `-` for - // all zones. This field has been deprecated and replaced by the parent field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // The parent (project and location) where the operations will be listed. - // Specified in the format 'projects/*/locations/*'. - // Location "-" matches all zones and all regions. - Parent string `protobuf:"bytes,4,opt,name=parent,proto3" json:"parent,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListOperationsRequest) Reset() { *m = ListOperationsRequest{} } -func (m *ListOperationsRequest) String() string { return proto.CompactTextString(m) } -func (*ListOperationsRequest) ProtoMessage() {} -func (*ListOperationsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{36} -} - -func (m *ListOperationsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListOperationsRequest.Unmarshal(m, b) -} -func (m *ListOperationsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListOperationsRequest.Marshal(b, m, deterministic) -} -func (m *ListOperationsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListOperationsRequest.Merge(m, src) -} -func (m *ListOperationsRequest) XXX_Size() int { - return xxx_messageInfo_ListOperationsRequest.Size(m) -} -func (m *ListOperationsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListOperationsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListOperationsRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *ListOperationsRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *ListOperationsRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -func (m *ListOperationsRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -// CancelOperationRequest cancels a single operation. -type CancelOperationRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the operation resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The server-assigned `name` of the operation. - // This field has been deprecated and replaced by the name field. - OperationId string `protobuf:"bytes,3,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` // Deprecated: Do not use. - // The name (project, location, operation id) of the operation to cancel. - // Specified in the format 'projects/*/locations/*/operations/*'. - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CancelOperationRequest) Reset() { *m = CancelOperationRequest{} } -func (m *CancelOperationRequest) String() string { return proto.CompactTextString(m) } -func (*CancelOperationRequest) ProtoMessage() {} -func (*CancelOperationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{37} -} - -func (m *CancelOperationRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CancelOperationRequest.Unmarshal(m, b) -} -func (m *CancelOperationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CancelOperationRequest.Marshal(b, m, deterministic) -} -func (m *CancelOperationRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CancelOperationRequest.Merge(m, src) -} -func (m *CancelOperationRequest) XXX_Size() int { - return xxx_messageInfo_CancelOperationRequest.Size(m) -} -func (m *CancelOperationRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CancelOperationRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CancelOperationRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *CancelOperationRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *CancelOperationRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *CancelOperationRequest) GetOperationId() string { - if m != nil { - return m.OperationId - } - return "" -} - -func (m *CancelOperationRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// ListOperationsResponse is the result of ListOperationsRequest. -type ListOperationsResponse struct { - // A list of operations in the project in the specified zone. - Operations []*Operation `protobuf:"bytes,1,rep,name=operations,proto3" json:"operations,omitempty"` - // If any zones are listed here, the list of operations returned - // may be missing the operations from those zones. - MissingZones []string `protobuf:"bytes,2,rep,name=missing_zones,json=missingZones,proto3" json:"missing_zones,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListOperationsResponse) Reset() { *m = ListOperationsResponse{} } -func (m *ListOperationsResponse) String() string { return proto.CompactTextString(m) } -func (*ListOperationsResponse) ProtoMessage() {} -func (*ListOperationsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{38} -} - -func (m *ListOperationsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListOperationsResponse.Unmarshal(m, b) -} -func (m *ListOperationsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListOperationsResponse.Marshal(b, m, deterministic) -} -func (m *ListOperationsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListOperationsResponse.Merge(m, src) -} -func (m *ListOperationsResponse) XXX_Size() int { - return xxx_messageInfo_ListOperationsResponse.Size(m) -} -func (m *ListOperationsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListOperationsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListOperationsResponse proto.InternalMessageInfo - -func (m *ListOperationsResponse) GetOperations() []*Operation { - if m != nil { - return m.Operations - } - return nil -} - -func (m *ListOperationsResponse) GetMissingZones() []string { - if m != nil { - return m.MissingZones - } - return nil -} - -// Gets the current Kubernetes Engine service configuration. -type GetServerConfigRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) to return operations for. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // The name (project and location) of the server config to get, - // specified in the format 'projects/*/locations/*'. - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetServerConfigRequest) Reset() { *m = GetServerConfigRequest{} } -func (m *GetServerConfigRequest) String() string { return proto.CompactTextString(m) } -func (*GetServerConfigRequest) ProtoMessage() {} -func (*GetServerConfigRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{39} -} - -func (m *GetServerConfigRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetServerConfigRequest.Unmarshal(m, b) -} -func (m *GetServerConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetServerConfigRequest.Marshal(b, m, deterministic) -} -func (m *GetServerConfigRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetServerConfigRequest.Merge(m, src) -} -func (m *GetServerConfigRequest) XXX_Size() int { - return xxx_messageInfo_GetServerConfigRequest.Size(m) -} -func (m *GetServerConfigRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetServerConfigRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetServerConfigRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *GetServerConfigRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *GetServerConfigRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -func (m *GetServerConfigRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// Kubernetes Engine service configuration. -type ServerConfig struct { - // Version of Kubernetes the service deploys by default. - DefaultClusterVersion string `protobuf:"bytes,1,opt,name=default_cluster_version,json=defaultClusterVersion,proto3" json:"default_cluster_version,omitempty"` - // List of valid node upgrade target versions. - ValidNodeVersions []string `protobuf:"bytes,3,rep,name=valid_node_versions,json=validNodeVersions,proto3" json:"valid_node_versions,omitempty"` - // Default image type. - DefaultImageType string `protobuf:"bytes,4,opt,name=default_image_type,json=defaultImageType,proto3" json:"default_image_type,omitempty"` - // List of valid image types. - ValidImageTypes []string `protobuf:"bytes,5,rep,name=valid_image_types,json=validImageTypes,proto3" json:"valid_image_types,omitempty"` - // List of valid master versions. - ValidMasterVersions []string `protobuf:"bytes,6,rep,name=valid_master_versions,json=validMasterVersions,proto3" json:"valid_master_versions,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ServerConfig) Reset() { *m = ServerConfig{} } -func (m *ServerConfig) String() string { return proto.CompactTextString(m) } -func (*ServerConfig) ProtoMessage() {} -func (*ServerConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{40} -} - -func (m *ServerConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ServerConfig.Unmarshal(m, b) -} -func (m *ServerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ServerConfig.Marshal(b, m, deterministic) -} -func (m *ServerConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServerConfig.Merge(m, src) -} -func (m *ServerConfig) XXX_Size() int { - return xxx_messageInfo_ServerConfig.Size(m) -} -func (m *ServerConfig) XXX_DiscardUnknown() { - xxx_messageInfo_ServerConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_ServerConfig proto.InternalMessageInfo - -func (m *ServerConfig) GetDefaultClusterVersion() string { - if m != nil { - return m.DefaultClusterVersion - } - return "" -} - -func (m *ServerConfig) GetValidNodeVersions() []string { - if m != nil { - return m.ValidNodeVersions - } - return nil -} - -func (m *ServerConfig) GetDefaultImageType() string { - if m != nil { - return m.DefaultImageType - } - return "" -} - -func (m *ServerConfig) GetValidImageTypes() []string { - if m != nil { - return m.ValidImageTypes - } - return nil -} - -func (m *ServerConfig) GetValidMasterVersions() []string { - if m != nil { - return m.ValidMasterVersions - } - return nil -} - -// CreateNodePoolRequest creates a node pool for a cluster. -type CreateNodePoolRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://developers.google.com/console/help/new/#projectnumber). - // This field has been deprecated and replaced by the parent field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the parent field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster. - // This field has been deprecated and replaced by the parent field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Required. The node pool to create. - NodePool *NodePool `protobuf:"bytes,4,opt,name=node_pool,json=nodePool,proto3" json:"node_pool,omitempty"` - // The parent (project, location, cluster id) where the node pool will be - // created. Specified in the format - // 'projects/*/locations/*/clusters/*'. - Parent string `protobuf:"bytes,6,opt,name=parent,proto3" json:"parent,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateNodePoolRequest) Reset() { *m = CreateNodePoolRequest{} } -func (m *CreateNodePoolRequest) String() string { return proto.CompactTextString(m) } -func (*CreateNodePoolRequest) ProtoMessage() {} -func (*CreateNodePoolRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{41} -} - -func (m *CreateNodePoolRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateNodePoolRequest.Unmarshal(m, b) -} -func (m *CreateNodePoolRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateNodePoolRequest.Marshal(b, m, deterministic) -} -func (m *CreateNodePoolRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateNodePoolRequest.Merge(m, src) -} -func (m *CreateNodePoolRequest) XXX_Size() int { - return xxx_messageInfo_CreateNodePoolRequest.Size(m) -} -func (m *CreateNodePoolRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateNodePoolRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateNodePoolRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *CreateNodePoolRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *CreateNodePoolRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *CreateNodePoolRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *CreateNodePoolRequest) GetNodePool() *NodePool { - if m != nil { - return m.NodePool - } - return nil -} - -func (m *CreateNodePoolRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -// DeleteNodePoolRequest deletes a node pool for a cluster. -type DeleteNodePoolRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://developers.google.com/console/help/new/#projectnumber). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the node pool to delete. - // This field has been deprecated and replaced by the name field. - NodePoolId string `protobuf:"bytes,4,opt,name=node_pool_id,json=nodePoolId,proto3" json:"node_pool_id,omitempty"` // Deprecated: Do not use. - // The name (project, location, cluster, node pool id) of the node pool to - // delete. Specified in the format - // 'projects/*/locations/*/clusters/*/nodePools/*'. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteNodePoolRequest) Reset() { *m = DeleteNodePoolRequest{} } -func (m *DeleteNodePoolRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteNodePoolRequest) ProtoMessage() {} -func (*DeleteNodePoolRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{42} -} - -func (m *DeleteNodePoolRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteNodePoolRequest.Unmarshal(m, b) -} -func (m *DeleteNodePoolRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteNodePoolRequest.Marshal(b, m, deterministic) -} -func (m *DeleteNodePoolRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteNodePoolRequest.Merge(m, src) -} -func (m *DeleteNodePoolRequest) XXX_Size() int { - return xxx_messageInfo_DeleteNodePoolRequest.Size(m) -} -func (m *DeleteNodePoolRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteNodePoolRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteNodePoolRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *DeleteNodePoolRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *DeleteNodePoolRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *DeleteNodePoolRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -// Deprecated: Do not use. -func (m *DeleteNodePoolRequest) GetNodePoolId() string { - if m != nil { - return m.NodePoolId - } - return "" -} - -func (m *DeleteNodePoolRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// ListNodePoolsRequest lists the node pool(s) for a cluster. -type ListNodePoolsRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://developers.google.com/console/help/new/#projectnumber). - // This field has been deprecated and replaced by the parent field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the parent field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster. - // This field has been deprecated and replaced by the parent field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // The parent (project, location, cluster id) where the node pools will be - // listed. Specified in the format 'projects/*/locations/*/clusters/*'. - Parent string `protobuf:"bytes,5,opt,name=parent,proto3" json:"parent,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListNodePoolsRequest) Reset() { *m = ListNodePoolsRequest{} } -func (m *ListNodePoolsRequest) String() string { return proto.CompactTextString(m) } -func (*ListNodePoolsRequest) ProtoMessage() {} -func (*ListNodePoolsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{43} -} - -func (m *ListNodePoolsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListNodePoolsRequest.Unmarshal(m, b) -} -func (m *ListNodePoolsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListNodePoolsRequest.Marshal(b, m, deterministic) -} -func (m *ListNodePoolsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListNodePoolsRequest.Merge(m, src) -} -func (m *ListNodePoolsRequest) XXX_Size() int { - return xxx_messageInfo_ListNodePoolsRequest.Size(m) -} -func (m *ListNodePoolsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListNodePoolsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListNodePoolsRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *ListNodePoolsRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *ListNodePoolsRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *ListNodePoolsRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *ListNodePoolsRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -// GetNodePoolRequest retrieves a node pool for a cluster. -type GetNodePoolRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://developers.google.com/console/help/new/#projectnumber). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the node pool. - // This field has been deprecated and replaced by the name field. - NodePoolId string `protobuf:"bytes,4,opt,name=node_pool_id,json=nodePoolId,proto3" json:"node_pool_id,omitempty"` // Deprecated: Do not use. - // The name (project, location, cluster, node pool id) of the node pool to - // get. Specified in the format - // 'projects/*/locations/*/clusters/*/nodePools/*'. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetNodePoolRequest) Reset() { *m = GetNodePoolRequest{} } -func (m *GetNodePoolRequest) String() string { return proto.CompactTextString(m) } -func (*GetNodePoolRequest) ProtoMessage() {} -func (*GetNodePoolRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{44} -} - -func (m *GetNodePoolRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetNodePoolRequest.Unmarshal(m, b) -} -func (m *GetNodePoolRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetNodePoolRequest.Marshal(b, m, deterministic) -} -func (m *GetNodePoolRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetNodePoolRequest.Merge(m, src) -} -func (m *GetNodePoolRequest) XXX_Size() int { - return xxx_messageInfo_GetNodePoolRequest.Size(m) -} -func (m *GetNodePoolRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetNodePoolRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetNodePoolRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *GetNodePoolRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *GetNodePoolRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *GetNodePoolRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -// Deprecated: Do not use. -func (m *GetNodePoolRequest) GetNodePoolId() string { - if m != nil { - return m.NodePoolId - } - return "" -} - -func (m *GetNodePoolRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// NodePool contains the name and configuration for a cluster's node pool. -// Node pools are a set of nodes (i.e. VM's), with a common configuration and -// specification, under the control of the cluster master. They may have a set -// of Kubernetes labels applied to them, which may be used to reference them -// during pod scheduling. They may also be resized up or down, to accommodate -// the workload. -type NodePool struct { - // The name of the node pool. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The node configuration of the pool. - Config *NodeConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` - // The initial node count for the pool. You must ensure that your - // Compute Engine resource quota - // is sufficient for this number of instances. You must also have available - // firewall and routes quota. - InitialNodeCount int32 `protobuf:"varint,3,opt,name=initial_node_count,json=initialNodeCount,proto3" json:"initial_node_count,omitempty"` - // [Output only] Server-defined URL for the resource. - SelfLink string `protobuf:"bytes,100,opt,name=self_link,json=selfLink,proto3" json:"self_link,omitempty"` - // The version of the Kubernetes of this node. - Version string `protobuf:"bytes,101,opt,name=version,proto3" json:"version,omitempty"` - // [Output only] The resource URLs of the [managed instance - // groups](/compute/docs/instance-groups/creating-groups-of-managed-instances) - // associated with this node pool. - InstanceGroupUrls []string `protobuf:"bytes,102,rep,name=instance_group_urls,json=instanceGroupUrls,proto3" json:"instance_group_urls,omitempty"` - // [Output only] The status of the nodes in this pool instance. - Status NodePool_Status `protobuf:"varint,103,opt,name=status,proto3,enum=google.container.v1.NodePool_Status" json:"status,omitempty"` - // [Output only] Additional information about the current status of this - // node pool instance, if available. - StatusMessage string `protobuf:"bytes,104,opt,name=status_message,json=statusMessage,proto3" json:"status_message,omitempty"` - // Autoscaler configuration for this NodePool. Autoscaler is enabled - // only if a valid configuration is present. - Autoscaling *NodePoolAutoscaling `protobuf:"bytes,4,opt,name=autoscaling,proto3" json:"autoscaling,omitempty"` - // NodeManagement configuration for this NodePool. - Management *NodeManagement `protobuf:"bytes,5,opt,name=management,proto3" json:"management,omitempty"` - // The constraint on the maximum number of pods that can be run - // simultaneously on a node in the node pool. - MaxPodsConstraint *MaxPodsConstraint `protobuf:"bytes,6,opt,name=max_pods_constraint,json=maxPodsConstraint,proto3" json:"max_pods_constraint,omitempty"` - // Which conditions caused the current node pool state. - Conditions []*StatusCondition `protobuf:"bytes,105,rep,name=conditions,proto3" json:"conditions,omitempty"` - // [Output only] The pod CIDR block size per node in this node pool. - PodIpv4CidrSize int32 `protobuf:"varint,7,opt,name=pod_ipv4_cidr_size,json=podIpv4CidrSize,proto3" json:"pod_ipv4_cidr_size,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NodePool) Reset() { *m = NodePool{} } -func (m *NodePool) String() string { return proto.CompactTextString(m) } -func (*NodePool) ProtoMessage() {} -func (*NodePool) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{45} -} - -func (m *NodePool) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NodePool.Unmarshal(m, b) -} -func (m *NodePool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NodePool.Marshal(b, m, deterministic) -} -func (m *NodePool) XXX_Merge(src proto.Message) { - xxx_messageInfo_NodePool.Merge(m, src) -} -func (m *NodePool) XXX_Size() int { - return xxx_messageInfo_NodePool.Size(m) -} -func (m *NodePool) XXX_DiscardUnknown() { - xxx_messageInfo_NodePool.DiscardUnknown(m) -} - -var xxx_messageInfo_NodePool proto.InternalMessageInfo - -func (m *NodePool) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NodePool) GetConfig() *NodeConfig { - if m != nil { - return m.Config - } - return nil -} - -func (m *NodePool) GetInitialNodeCount() int32 { - if m != nil { - return m.InitialNodeCount - } - return 0 -} - -func (m *NodePool) GetSelfLink() string { - if m != nil { - return m.SelfLink - } - return "" -} - -func (m *NodePool) GetVersion() string { - if m != nil { - return m.Version - } - return "" -} - -func (m *NodePool) GetInstanceGroupUrls() []string { - if m != nil { - return m.InstanceGroupUrls - } - return nil -} - -func (m *NodePool) GetStatus() NodePool_Status { - if m != nil { - return m.Status - } - return NodePool_STATUS_UNSPECIFIED -} - -func (m *NodePool) GetStatusMessage() string { - if m != nil { - return m.StatusMessage - } - return "" -} - -func (m *NodePool) GetAutoscaling() *NodePoolAutoscaling { - if m != nil { - return m.Autoscaling - } - return nil -} - -func (m *NodePool) GetManagement() *NodeManagement { - if m != nil { - return m.Management - } - return nil -} - -func (m *NodePool) GetMaxPodsConstraint() *MaxPodsConstraint { - if m != nil { - return m.MaxPodsConstraint - } - return nil -} - -func (m *NodePool) GetConditions() []*StatusCondition { - if m != nil { - return m.Conditions - } - return nil -} - -func (m *NodePool) GetPodIpv4CidrSize() int32 { - if m != nil { - return m.PodIpv4CidrSize - } - return 0 -} - -// NodeManagement defines the set of node management services turned on for the -// node pool. -type NodeManagement struct { - // A flag that specifies whether node auto-upgrade is enabled for the node - // pool. If enabled, node auto-upgrade helps keep the nodes in your node pool - // up to date with the latest release version of Kubernetes. - AutoUpgrade bool `protobuf:"varint,1,opt,name=auto_upgrade,json=autoUpgrade,proto3" json:"auto_upgrade,omitempty"` - // A flag that specifies whether the node auto-repair is enabled for the node - // pool. If enabled, the nodes in this node pool will be monitored and, if - // they fail health checks too many times, an automatic repair action will be - // triggered. - AutoRepair bool `protobuf:"varint,2,opt,name=auto_repair,json=autoRepair,proto3" json:"auto_repair,omitempty"` - // Specifies the Auto Upgrade knobs for the node pool. - UpgradeOptions *AutoUpgradeOptions `protobuf:"bytes,10,opt,name=upgrade_options,json=upgradeOptions,proto3" json:"upgrade_options,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NodeManagement) Reset() { *m = NodeManagement{} } -func (m *NodeManagement) String() string { return proto.CompactTextString(m) } -func (*NodeManagement) ProtoMessage() {} -func (*NodeManagement) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{46} -} - -func (m *NodeManagement) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NodeManagement.Unmarshal(m, b) -} -func (m *NodeManagement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NodeManagement.Marshal(b, m, deterministic) -} -func (m *NodeManagement) XXX_Merge(src proto.Message) { - xxx_messageInfo_NodeManagement.Merge(m, src) -} -func (m *NodeManagement) XXX_Size() int { - return xxx_messageInfo_NodeManagement.Size(m) -} -func (m *NodeManagement) XXX_DiscardUnknown() { - xxx_messageInfo_NodeManagement.DiscardUnknown(m) -} - -var xxx_messageInfo_NodeManagement proto.InternalMessageInfo - -func (m *NodeManagement) GetAutoUpgrade() bool { - if m != nil { - return m.AutoUpgrade - } - return false -} - -func (m *NodeManagement) GetAutoRepair() bool { - if m != nil { - return m.AutoRepair - } - return false -} - -func (m *NodeManagement) GetUpgradeOptions() *AutoUpgradeOptions { - if m != nil { - return m.UpgradeOptions - } - return nil -} - -// AutoUpgradeOptions defines the set of options for the user to control how -// the Auto Upgrades will proceed. -type AutoUpgradeOptions struct { - // [Output only] This field is set when upgrades are about to commence - // with the approximate start time for the upgrades, in - // [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format. - AutoUpgradeStartTime string `protobuf:"bytes,1,opt,name=auto_upgrade_start_time,json=autoUpgradeStartTime,proto3" json:"auto_upgrade_start_time,omitempty"` - // [Output only] This field is set when upgrades are about to commence - // with the description of the upgrade. - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AutoUpgradeOptions) Reset() { *m = AutoUpgradeOptions{} } -func (m *AutoUpgradeOptions) String() string { return proto.CompactTextString(m) } -func (*AutoUpgradeOptions) ProtoMessage() {} -func (*AutoUpgradeOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{47} -} - -func (m *AutoUpgradeOptions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AutoUpgradeOptions.Unmarshal(m, b) -} -func (m *AutoUpgradeOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AutoUpgradeOptions.Marshal(b, m, deterministic) -} -func (m *AutoUpgradeOptions) XXX_Merge(src proto.Message) { - xxx_messageInfo_AutoUpgradeOptions.Merge(m, src) -} -func (m *AutoUpgradeOptions) XXX_Size() int { - return xxx_messageInfo_AutoUpgradeOptions.Size(m) -} -func (m *AutoUpgradeOptions) XXX_DiscardUnknown() { - xxx_messageInfo_AutoUpgradeOptions.DiscardUnknown(m) -} - -var xxx_messageInfo_AutoUpgradeOptions proto.InternalMessageInfo - -func (m *AutoUpgradeOptions) GetAutoUpgradeStartTime() string { - if m != nil { - return m.AutoUpgradeStartTime - } - return "" -} - -func (m *AutoUpgradeOptions) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -// MaintenancePolicy defines the maintenance policy to be used for the cluster. -type MaintenancePolicy struct { - // Specifies the maintenance window in which maintenance may be performed. - Window *MaintenanceWindow `protobuf:"bytes,1,opt,name=window,proto3" json:"window,omitempty"` - // A hash identifying the version of this policy, so that updates to fields of - // the policy won't accidentally undo intermediate changes (and so that users - // of the API unaware of some fields won't accidentally remove other fields). - // Make a get() request to the cluster to get the current - // resource version and include it with requests to set the policy. - ResourceVersion string `protobuf:"bytes,3,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MaintenancePolicy) Reset() { *m = MaintenancePolicy{} } -func (m *MaintenancePolicy) String() string { return proto.CompactTextString(m) } -func (*MaintenancePolicy) ProtoMessage() {} -func (*MaintenancePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{48} -} - -func (m *MaintenancePolicy) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MaintenancePolicy.Unmarshal(m, b) -} -func (m *MaintenancePolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MaintenancePolicy.Marshal(b, m, deterministic) -} -func (m *MaintenancePolicy) XXX_Merge(src proto.Message) { - xxx_messageInfo_MaintenancePolicy.Merge(m, src) -} -func (m *MaintenancePolicy) XXX_Size() int { - return xxx_messageInfo_MaintenancePolicy.Size(m) -} -func (m *MaintenancePolicy) XXX_DiscardUnknown() { - xxx_messageInfo_MaintenancePolicy.DiscardUnknown(m) -} - -var xxx_messageInfo_MaintenancePolicy proto.InternalMessageInfo - -func (m *MaintenancePolicy) GetWindow() *MaintenanceWindow { - if m != nil { - return m.Window - } - return nil -} - -func (m *MaintenancePolicy) GetResourceVersion() string { - if m != nil { - return m.ResourceVersion - } - return "" -} - -// MaintenanceWindow defines the maintenance window to be used for the cluster. -type MaintenanceWindow struct { - // Types that are valid to be assigned to Policy: - // *MaintenanceWindow_DailyMaintenanceWindow - // *MaintenanceWindow_RecurringWindow - Policy isMaintenanceWindow_Policy `protobuf_oneof:"policy"` - // Exceptions to maintenance window. Non-emergency maintenance should not - // occur in these windows. - MaintenanceExclusions map[string]*TimeWindow `protobuf:"bytes,4,rep,name=maintenance_exclusions,json=maintenanceExclusions,proto3" json:"maintenance_exclusions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MaintenanceWindow) Reset() { *m = MaintenanceWindow{} } -func (m *MaintenanceWindow) String() string { return proto.CompactTextString(m) } -func (*MaintenanceWindow) ProtoMessage() {} -func (*MaintenanceWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{49} -} - -func (m *MaintenanceWindow) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MaintenanceWindow.Unmarshal(m, b) -} -func (m *MaintenanceWindow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MaintenanceWindow.Marshal(b, m, deterministic) -} -func (m *MaintenanceWindow) XXX_Merge(src proto.Message) { - xxx_messageInfo_MaintenanceWindow.Merge(m, src) -} -func (m *MaintenanceWindow) XXX_Size() int { - return xxx_messageInfo_MaintenanceWindow.Size(m) -} -func (m *MaintenanceWindow) XXX_DiscardUnknown() { - xxx_messageInfo_MaintenanceWindow.DiscardUnknown(m) -} - -var xxx_messageInfo_MaintenanceWindow proto.InternalMessageInfo - -type isMaintenanceWindow_Policy interface { - isMaintenanceWindow_Policy() -} - -type MaintenanceWindow_DailyMaintenanceWindow struct { - DailyMaintenanceWindow *DailyMaintenanceWindow `protobuf:"bytes,2,opt,name=daily_maintenance_window,json=dailyMaintenanceWindow,proto3,oneof"` -} - -type MaintenanceWindow_RecurringWindow struct { - RecurringWindow *RecurringTimeWindow `protobuf:"bytes,3,opt,name=recurring_window,json=recurringWindow,proto3,oneof"` -} - -func (*MaintenanceWindow_DailyMaintenanceWindow) isMaintenanceWindow_Policy() {} - -func (*MaintenanceWindow_RecurringWindow) isMaintenanceWindow_Policy() {} - -func (m *MaintenanceWindow) GetPolicy() isMaintenanceWindow_Policy { - if m != nil { - return m.Policy - } - return nil -} - -func (m *MaintenanceWindow) GetDailyMaintenanceWindow() *DailyMaintenanceWindow { - if x, ok := m.GetPolicy().(*MaintenanceWindow_DailyMaintenanceWindow); ok { - return x.DailyMaintenanceWindow - } - return nil -} - -func (m *MaintenanceWindow) GetRecurringWindow() *RecurringTimeWindow { - if x, ok := m.GetPolicy().(*MaintenanceWindow_RecurringWindow); ok { - return x.RecurringWindow - } - return nil -} - -func (m *MaintenanceWindow) GetMaintenanceExclusions() map[string]*TimeWindow { - if m != nil { - return m.MaintenanceExclusions - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*MaintenanceWindow) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*MaintenanceWindow_DailyMaintenanceWindow)(nil), - (*MaintenanceWindow_RecurringWindow)(nil), - } -} - -// Represents an arbitrary window of time. -type TimeWindow struct { - // The time that the window first starts. - StartTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - // The time that the window ends. The end time should take place after the - // start time. - EndTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TimeWindow) Reset() { *m = TimeWindow{} } -func (m *TimeWindow) String() string { return proto.CompactTextString(m) } -func (*TimeWindow) ProtoMessage() {} -func (*TimeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{50} -} - -func (m *TimeWindow) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_TimeWindow.Unmarshal(m, b) -} -func (m *TimeWindow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_TimeWindow.Marshal(b, m, deterministic) -} -func (m *TimeWindow) XXX_Merge(src proto.Message) { - xxx_messageInfo_TimeWindow.Merge(m, src) -} -func (m *TimeWindow) XXX_Size() int { - return xxx_messageInfo_TimeWindow.Size(m) -} -func (m *TimeWindow) XXX_DiscardUnknown() { - xxx_messageInfo_TimeWindow.DiscardUnknown(m) -} - -var xxx_messageInfo_TimeWindow proto.InternalMessageInfo - -func (m *TimeWindow) GetStartTime() *timestamp.Timestamp { - if m != nil { - return m.StartTime - } - return nil -} - -func (m *TimeWindow) GetEndTime() *timestamp.Timestamp { - if m != nil { - return m.EndTime - } - return nil -} - -// Represents an arbitrary window of time that recurs. -type RecurringTimeWindow struct { - // The window of the first recurrence. - Window *TimeWindow `protobuf:"bytes,1,opt,name=window,proto3" json:"window,omitempty"` - // An RRULE (https://tools.ietf.org/html/rfc5545#section-3.8.5.3) for how - // this window reccurs. They go on for the span of time between the start and - // end time. - // - // For example, to have something repeat every weekday, you'd use: - // FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR - // To repeat some window daily (equivalent to the DailyMaintenanceWindow): - // FREQ=DAILY - // For the first weekend of every month: - // FREQ=MONTHLY;BYSETPOS=1;BYDAY=SA,SU - // This specifies how frequently the window starts. Eg, if you wanted to have - // a 9-5 UTC-4 window every weekday, you'd use something like: - // - // start time = 2019-01-01T09:00:00-0400 - // end time = 2019-01-01T17:00:00-0400 - // recurrence = FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR - // - // Windows can span multiple days. Eg, to make the window encompass every - // weekend from midnight Saturday till the last minute of Sunday UTC: - // - // start time = 2019-01-05T00:00:00Z - // end time = 2019-01-07T23:59:00Z - // recurrence = FREQ=WEEKLY;BYDAY=SA - // - // Note the start and end time's specific dates are largely arbitrary except - // to specify duration of the window and when it first starts. - // The FREQ values of HOURLY, MINUTELY, and SECONDLY are not supported. - Recurrence string `protobuf:"bytes,2,opt,name=recurrence,proto3" json:"recurrence,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RecurringTimeWindow) Reset() { *m = RecurringTimeWindow{} } -func (m *RecurringTimeWindow) String() string { return proto.CompactTextString(m) } -func (*RecurringTimeWindow) ProtoMessage() {} -func (*RecurringTimeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{51} -} - -func (m *RecurringTimeWindow) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RecurringTimeWindow.Unmarshal(m, b) -} -func (m *RecurringTimeWindow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RecurringTimeWindow.Marshal(b, m, deterministic) -} -func (m *RecurringTimeWindow) XXX_Merge(src proto.Message) { - xxx_messageInfo_RecurringTimeWindow.Merge(m, src) -} -func (m *RecurringTimeWindow) XXX_Size() int { - return xxx_messageInfo_RecurringTimeWindow.Size(m) -} -func (m *RecurringTimeWindow) XXX_DiscardUnknown() { - xxx_messageInfo_RecurringTimeWindow.DiscardUnknown(m) -} - -var xxx_messageInfo_RecurringTimeWindow proto.InternalMessageInfo - -func (m *RecurringTimeWindow) GetWindow() *TimeWindow { - if m != nil { - return m.Window - } - return nil -} - -func (m *RecurringTimeWindow) GetRecurrence() string { - if m != nil { - return m.Recurrence - } - return "" -} - -// Time window specified for daily maintenance operations. -type DailyMaintenanceWindow struct { - // Time within the maintenance window to start the maintenance operations. - // Time format should be in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) - // format "HH:MM", where HH : [00-23] and MM : [00-59] GMT. - StartTime string `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - // [Output only] Duration of the time window, automatically chosen to be - // smallest possible in the given scenario. - // Duration will be in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) - // format "PTnHnMnS". - Duration string `protobuf:"bytes,3,opt,name=duration,proto3" json:"duration,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DailyMaintenanceWindow) Reset() { *m = DailyMaintenanceWindow{} } -func (m *DailyMaintenanceWindow) String() string { return proto.CompactTextString(m) } -func (*DailyMaintenanceWindow) ProtoMessage() {} -func (*DailyMaintenanceWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{52} -} - -func (m *DailyMaintenanceWindow) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DailyMaintenanceWindow.Unmarshal(m, b) -} -func (m *DailyMaintenanceWindow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DailyMaintenanceWindow.Marshal(b, m, deterministic) -} -func (m *DailyMaintenanceWindow) XXX_Merge(src proto.Message) { - xxx_messageInfo_DailyMaintenanceWindow.Merge(m, src) -} -func (m *DailyMaintenanceWindow) XXX_Size() int { - return xxx_messageInfo_DailyMaintenanceWindow.Size(m) -} -func (m *DailyMaintenanceWindow) XXX_DiscardUnknown() { - xxx_messageInfo_DailyMaintenanceWindow.DiscardUnknown(m) -} - -var xxx_messageInfo_DailyMaintenanceWindow proto.InternalMessageInfo - -func (m *DailyMaintenanceWindow) GetStartTime() string { - if m != nil { - return m.StartTime - } - return "" -} - -func (m *DailyMaintenanceWindow) GetDuration() string { - if m != nil { - return m.Duration - } - return "" -} - -// SetNodePoolManagementRequest sets the node management properties of a node -// pool. -type SetNodePoolManagementRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to update. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the node pool to update. - // This field has been deprecated and replaced by the name field. - NodePoolId string `protobuf:"bytes,4,opt,name=node_pool_id,json=nodePoolId,proto3" json:"node_pool_id,omitempty"` // Deprecated: Do not use. - // Required. NodeManagement configuration for the node pool. - Management *NodeManagement `protobuf:"bytes,5,opt,name=management,proto3" json:"management,omitempty"` - // The name (project, location, cluster, node pool id) of the node pool to set - // management properties. Specified in the format - // 'projects/*/locations/*/clusters/*/nodePools/*'. - Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetNodePoolManagementRequest) Reset() { *m = SetNodePoolManagementRequest{} } -func (m *SetNodePoolManagementRequest) String() string { return proto.CompactTextString(m) } -func (*SetNodePoolManagementRequest) ProtoMessage() {} -func (*SetNodePoolManagementRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{53} -} - -func (m *SetNodePoolManagementRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetNodePoolManagementRequest.Unmarshal(m, b) -} -func (m *SetNodePoolManagementRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetNodePoolManagementRequest.Marshal(b, m, deterministic) -} -func (m *SetNodePoolManagementRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetNodePoolManagementRequest.Merge(m, src) -} -func (m *SetNodePoolManagementRequest) XXX_Size() int { - return xxx_messageInfo_SetNodePoolManagementRequest.Size(m) -} -func (m *SetNodePoolManagementRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetNodePoolManagementRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetNodePoolManagementRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *SetNodePoolManagementRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetNodePoolManagementRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *SetNodePoolManagementRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetNodePoolManagementRequest) GetNodePoolId() string { - if m != nil { - return m.NodePoolId - } - return "" -} - -func (m *SetNodePoolManagementRequest) GetManagement() *NodeManagement { - if m != nil { - return m.Management - } - return nil -} - -func (m *SetNodePoolManagementRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// SetNodePoolSizeRequest sets the size a node -// pool. -type SetNodePoolSizeRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to update. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the node pool to update. - // This field has been deprecated and replaced by the name field. - NodePoolId string `protobuf:"bytes,4,opt,name=node_pool_id,json=nodePoolId,proto3" json:"node_pool_id,omitempty"` // Deprecated: Do not use. - // Required. The desired node count for the pool. - NodeCount int32 `protobuf:"varint,5,opt,name=node_count,json=nodeCount,proto3" json:"node_count,omitempty"` - // The name (project, location, cluster, node pool id) of the node pool to set - // size. - // Specified in the format 'projects/*/locations/*/clusters/*/nodePools/*'. - Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetNodePoolSizeRequest) Reset() { *m = SetNodePoolSizeRequest{} } -func (m *SetNodePoolSizeRequest) String() string { return proto.CompactTextString(m) } -func (*SetNodePoolSizeRequest) ProtoMessage() {} -func (*SetNodePoolSizeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{54} -} - -func (m *SetNodePoolSizeRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetNodePoolSizeRequest.Unmarshal(m, b) -} -func (m *SetNodePoolSizeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetNodePoolSizeRequest.Marshal(b, m, deterministic) -} -func (m *SetNodePoolSizeRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetNodePoolSizeRequest.Merge(m, src) -} -func (m *SetNodePoolSizeRequest) XXX_Size() int { - return xxx_messageInfo_SetNodePoolSizeRequest.Size(m) -} -func (m *SetNodePoolSizeRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetNodePoolSizeRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetNodePoolSizeRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *SetNodePoolSizeRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetNodePoolSizeRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *SetNodePoolSizeRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetNodePoolSizeRequest) GetNodePoolId() string { - if m != nil { - return m.NodePoolId - } - return "" -} - -func (m *SetNodePoolSizeRequest) GetNodeCount() int32 { - if m != nil { - return m.NodeCount - } - return 0 -} - -func (m *SetNodePoolSizeRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// RollbackNodePoolUpgradeRequest rollbacks the previously Aborted or Failed -// NodePool upgrade. This will be an no-op if the last upgrade successfully -// completed. -type RollbackNodePoolUpgradeRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to rollback. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the node pool to rollback. - // This field has been deprecated and replaced by the name field. - NodePoolId string `protobuf:"bytes,4,opt,name=node_pool_id,json=nodePoolId,proto3" json:"node_pool_id,omitempty"` // Deprecated: Do not use. - // The name (project, location, cluster, node pool id) of the node poll to - // rollback upgrade. - // Specified in the format 'projects/*/locations/*/clusters/*/nodePools/*'. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RollbackNodePoolUpgradeRequest) Reset() { *m = RollbackNodePoolUpgradeRequest{} } -func (m *RollbackNodePoolUpgradeRequest) String() string { return proto.CompactTextString(m) } -func (*RollbackNodePoolUpgradeRequest) ProtoMessage() {} -func (*RollbackNodePoolUpgradeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{55} -} - -func (m *RollbackNodePoolUpgradeRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RollbackNodePoolUpgradeRequest.Unmarshal(m, b) -} -func (m *RollbackNodePoolUpgradeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RollbackNodePoolUpgradeRequest.Marshal(b, m, deterministic) -} -func (m *RollbackNodePoolUpgradeRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RollbackNodePoolUpgradeRequest.Merge(m, src) -} -func (m *RollbackNodePoolUpgradeRequest) XXX_Size() int { - return xxx_messageInfo_RollbackNodePoolUpgradeRequest.Size(m) -} -func (m *RollbackNodePoolUpgradeRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RollbackNodePoolUpgradeRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_RollbackNodePoolUpgradeRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *RollbackNodePoolUpgradeRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *RollbackNodePoolUpgradeRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *RollbackNodePoolUpgradeRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -// Deprecated: Do not use. -func (m *RollbackNodePoolUpgradeRequest) GetNodePoolId() string { - if m != nil { - return m.NodePoolId - } - return "" -} - -func (m *RollbackNodePoolUpgradeRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// ListNodePoolsResponse is the result of ListNodePoolsRequest. -type ListNodePoolsResponse struct { - // A list of node pools for a cluster. - NodePools []*NodePool `protobuf:"bytes,1,rep,name=node_pools,json=nodePools,proto3" json:"node_pools,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListNodePoolsResponse) Reset() { *m = ListNodePoolsResponse{} } -func (m *ListNodePoolsResponse) String() string { return proto.CompactTextString(m) } -func (*ListNodePoolsResponse) ProtoMessage() {} -func (*ListNodePoolsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{56} -} - -func (m *ListNodePoolsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListNodePoolsResponse.Unmarshal(m, b) -} -func (m *ListNodePoolsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListNodePoolsResponse.Marshal(b, m, deterministic) -} -func (m *ListNodePoolsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListNodePoolsResponse.Merge(m, src) -} -func (m *ListNodePoolsResponse) XXX_Size() int { - return xxx_messageInfo_ListNodePoolsResponse.Size(m) -} -func (m *ListNodePoolsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListNodePoolsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListNodePoolsResponse proto.InternalMessageInfo - -func (m *ListNodePoolsResponse) GetNodePools() []*NodePool { - if m != nil { - return m.NodePools - } - return nil -} - -// ClusterAutoscaling contains global, per-cluster information -// required by Cluster Autoscaler to automatically adjust -// the size of the cluster and create/delete -// node pools based on the current needs. -type ClusterAutoscaling struct { - // Enables automatic node pool creation and deletion. - EnableNodeAutoprovisioning bool `protobuf:"varint,1,opt,name=enable_node_autoprovisioning,json=enableNodeAutoprovisioning,proto3" json:"enable_node_autoprovisioning,omitempty"` - // Contains global constraints regarding minimum and maximum - // amount of resources in the cluster. - ResourceLimits []*ResourceLimit `protobuf:"bytes,2,rep,name=resource_limits,json=resourceLimits,proto3" json:"resource_limits,omitempty"` - // AutoprovisioningNodePoolDefaults contains defaults for a node pool - // created by NAP. - AutoprovisioningNodePoolDefaults *AutoprovisioningNodePoolDefaults `protobuf:"bytes,4,opt,name=autoprovisioning_node_pool_defaults,json=autoprovisioningNodePoolDefaults,proto3" json:"autoprovisioning_node_pool_defaults,omitempty"` - // The list of Google Compute Engine [zones](/compute/docs/zones#available) - // in which the NodePool's nodes can be created by NAP. - AutoprovisioningLocations []string `protobuf:"bytes,5,rep,name=autoprovisioning_locations,json=autoprovisioningLocations,proto3" json:"autoprovisioning_locations,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ClusterAutoscaling) Reset() { *m = ClusterAutoscaling{} } -func (m *ClusterAutoscaling) String() string { return proto.CompactTextString(m) } -func (*ClusterAutoscaling) ProtoMessage() {} -func (*ClusterAutoscaling) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{57} -} - -func (m *ClusterAutoscaling) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ClusterAutoscaling.Unmarshal(m, b) -} -func (m *ClusterAutoscaling) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ClusterAutoscaling.Marshal(b, m, deterministic) -} -func (m *ClusterAutoscaling) XXX_Merge(src proto.Message) { - xxx_messageInfo_ClusterAutoscaling.Merge(m, src) -} -func (m *ClusterAutoscaling) XXX_Size() int { - return xxx_messageInfo_ClusterAutoscaling.Size(m) -} -func (m *ClusterAutoscaling) XXX_DiscardUnknown() { - xxx_messageInfo_ClusterAutoscaling.DiscardUnknown(m) -} - -var xxx_messageInfo_ClusterAutoscaling proto.InternalMessageInfo - -func (m *ClusterAutoscaling) GetEnableNodeAutoprovisioning() bool { - if m != nil { - return m.EnableNodeAutoprovisioning - } - return false -} - -func (m *ClusterAutoscaling) GetResourceLimits() []*ResourceLimit { - if m != nil { - return m.ResourceLimits - } - return nil -} - -func (m *ClusterAutoscaling) GetAutoprovisioningNodePoolDefaults() *AutoprovisioningNodePoolDefaults { - if m != nil { - return m.AutoprovisioningNodePoolDefaults - } - return nil -} - -func (m *ClusterAutoscaling) GetAutoprovisioningLocations() []string { - if m != nil { - return m.AutoprovisioningLocations - } - return nil -} - -// AutoprovisioningNodePoolDefaults contains defaults for a node pool created -// by NAP. -type AutoprovisioningNodePoolDefaults struct { - // Scopes that are used by NAP when creating node pools. If oauth_scopes are - // specified, service_account should be empty. - OauthScopes []string `protobuf:"bytes,1,rep,name=oauth_scopes,json=oauthScopes,proto3" json:"oauth_scopes,omitempty"` - // The Google Cloud Platform Service Account to be used by the node VMs. If - // service_account is specified, scopes should be empty. - ServiceAccount string `protobuf:"bytes,2,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AutoprovisioningNodePoolDefaults) Reset() { *m = AutoprovisioningNodePoolDefaults{} } -func (m *AutoprovisioningNodePoolDefaults) String() string { return proto.CompactTextString(m) } -func (*AutoprovisioningNodePoolDefaults) ProtoMessage() {} -func (*AutoprovisioningNodePoolDefaults) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{58} -} - -func (m *AutoprovisioningNodePoolDefaults) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AutoprovisioningNodePoolDefaults.Unmarshal(m, b) -} -func (m *AutoprovisioningNodePoolDefaults) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AutoprovisioningNodePoolDefaults.Marshal(b, m, deterministic) -} -func (m *AutoprovisioningNodePoolDefaults) XXX_Merge(src proto.Message) { - xxx_messageInfo_AutoprovisioningNodePoolDefaults.Merge(m, src) -} -func (m *AutoprovisioningNodePoolDefaults) XXX_Size() int { - return xxx_messageInfo_AutoprovisioningNodePoolDefaults.Size(m) -} -func (m *AutoprovisioningNodePoolDefaults) XXX_DiscardUnknown() { - xxx_messageInfo_AutoprovisioningNodePoolDefaults.DiscardUnknown(m) -} - -var xxx_messageInfo_AutoprovisioningNodePoolDefaults proto.InternalMessageInfo - -func (m *AutoprovisioningNodePoolDefaults) GetOauthScopes() []string { - if m != nil { - return m.OauthScopes - } - return nil -} - -func (m *AutoprovisioningNodePoolDefaults) GetServiceAccount() string { - if m != nil { - return m.ServiceAccount - } - return "" -} - -// Contains information about amount of some resource in the cluster. -// For memory, value should be in GB. -type ResourceLimit struct { - // Resource name "cpu", "memory" or gpu-specific string. - ResourceType string `protobuf:"bytes,1,opt,name=resource_type,json=resourceType,proto3" json:"resource_type,omitempty"` - // Minimum amount of the resource in the cluster. - Minimum int64 `protobuf:"varint,2,opt,name=minimum,proto3" json:"minimum,omitempty"` - // Maximum amount of the resource in the cluster. - Maximum int64 `protobuf:"varint,3,opt,name=maximum,proto3" json:"maximum,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ResourceLimit) Reset() { *m = ResourceLimit{} } -func (m *ResourceLimit) String() string { return proto.CompactTextString(m) } -func (*ResourceLimit) ProtoMessage() {} -func (*ResourceLimit) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{59} -} - -func (m *ResourceLimit) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ResourceLimit.Unmarshal(m, b) -} -func (m *ResourceLimit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ResourceLimit.Marshal(b, m, deterministic) -} -func (m *ResourceLimit) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceLimit.Merge(m, src) -} -func (m *ResourceLimit) XXX_Size() int { - return xxx_messageInfo_ResourceLimit.Size(m) -} -func (m *ResourceLimit) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceLimit.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceLimit proto.InternalMessageInfo - -func (m *ResourceLimit) GetResourceType() string { - if m != nil { - return m.ResourceType - } - return "" -} - -func (m *ResourceLimit) GetMinimum() int64 { - if m != nil { - return m.Minimum - } - return 0 -} - -func (m *ResourceLimit) GetMaximum() int64 { - if m != nil { - return m.Maximum - } - return 0 -} - -// NodePoolAutoscaling contains information required by cluster autoscaler to -// adjust the size of the node pool to the current cluster usage. -type NodePoolAutoscaling struct { - // Is autoscaling enabled for this node pool. - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - // Minimum number of nodes in the NodePool. Must be >= 1 and <= - // max_node_count. - MinNodeCount int32 `protobuf:"varint,2,opt,name=min_node_count,json=minNodeCount,proto3" json:"min_node_count,omitempty"` - // Maximum number of nodes in the NodePool. Must be >= min_node_count. There - // has to enough quota to scale up the cluster. - MaxNodeCount int32 `protobuf:"varint,3,opt,name=max_node_count,json=maxNodeCount,proto3" json:"max_node_count,omitempty"` - // Can this node pool be deleted automatically. - Autoprovisioned bool `protobuf:"varint,4,opt,name=autoprovisioned,proto3" json:"autoprovisioned,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NodePoolAutoscaling) Reset() { *m = NodePoolAutoscaling{} } -func (m *NodePoolAutoscaling) String() string { return proto.CompactTextString(m) } -func (*NodePoolAutoscaling) ProtoMessage() {} -func (*NodePoolAutoscaling) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{60} -} - -func (m *NodePoolAutoscaling) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NodePoolAutoscaling.Unmarshal(m, b) -} -func (m *NodePoolAutoscaling) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NodePoolAutoscaling.Marshal(b, m, deterministic) -} -func (m *NodePoolAutoscaling) XXX_Merge(src proto.Message) { - xxx_messageInfo_NodePoolAutoscaling.Merge(m, src) -} -func (m *NodePoolAutoscaling) XXX_Size() int { - return xxx_messageInfo_NodePoolAutoscaling.Size(m) -} -func (m *NodePoolAutoscaling) XXX_DiscardUnknown() { - xxx_messageInfo_NodePoolAutoscaling.DiscardUnknown(m) -} - -var xxx_messageInfo_NodePoolAutoscaling proto.InternalMessageInfo - -func (m *NodePoolAutoscaling) GetEnabled() bool { - if m != nil { - return m.Enabled - } - return false -} - -func (m *NodePoolAutoscaling) GetMinNodeCount() int32 { - if m != nil { - return m.MinNodeCount - } - return 0 -} - -func (m *NodePoolAutoscaling) GetMaxNodeCount() int32 { - if m != nil { - return m.MaxNodeCount - } - return 0 -} - -func (m *NodePoolAutoscaling) GetAutoprovisioned() bool { - if m != nil { - return m.Autoprovisioned - } - return false -} - -// SetLabelsRequest sets the Google Cloud Platform labels on a Google Container -// Engine cluster, which will in turn set them for Google Compute Engine -// resources used by that cluster -type SetLabelsRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://developers.google.com/console/help/new/#projectnumber). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Required. The labels to set for that cluster. - ResourceLabels map[string]string `protobuf:"bytes,4,rep,name=resource_labels,json=resourceLabels,proto3" json:"resource_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Required. The fingerprint of the previous set of labels for this resource, - // used to detect conflicts. The fingerprint is initially generated by - // Kubernetes Engine and changes after every request to modify or update - // labels. You must always provide an up-to-date fingerprint hash when - // updating or changing labels. Make a get() request to the - // resource to get the latest fingerprint. - LabelFingerprint string `protobuf:"bytes,5,opt,name=label_fingerprint,json=labelFingerprint,proto3" json:"label_fingerprint,omitempty"` - // The name (project, location, cluster id) of the cluster to set labels. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetLabelsRequest) Reset() { *m = SetLabelsRequest{} } -func (m *SetLabelsRequest) String() string { return proto.CompactTextString(m) } -func (*SetLabelsRequest) ProtoMessage() {} -func (*SetLabelsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{61} -} - -func (m *SetLabelsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetLabelsRequest.Unmarshal(m, b) -} -func (m *SetLabelsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetLabelsRequest.Marshal(b, m, deterministic) -} -func (m *SetLabelsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetLabelsRequest.Merge(m, src) -} -func (m *SetLabelsRequest) XXX_Size() int { - return xxx_messageInfo_SetLabelsRequest.Size(m) -} -func (m *SetLabelsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetLabelsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetLabelsRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *SetLabelsRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetLabelsRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *SetLabelsRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *SetLabelsRequest) GetResourceLabels() map[string]string { - if m != nil { - return m.ResourceLabels - } - return nil -} - -func (m *SetLabelsRequest) GetLabelFingerprint() string { - if m != nil { - return m.LabelFingerprint - } - return "" -} - -func (m *SetLabelsRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// SetLegacyAbacRequest enables or disables the ABAC authorization mechanism for -// a cluster. -type SetLegacyAbacRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster to update. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Required. Whether ABAC authorization will be enabled in the cluster. - Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` - // The name (project, location, cluster id) of the cluster to set legacy abac. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetLegacyAbacRequest) Reset() { *m = SetLegacyAbacRequest{} } -func (m *SetLegacyAbacRequest) String() string { return proto.CompactTextString(m) } -func (*SetLegacyAbacRequest) ProtoMessage() {} -func (*SetLegacyAbacRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{62} -} - -func (m *SetLegacyAbacRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetLegacyAbacRequest.Unmarshal(m, b) -} -func (m *SetLegacyAbacRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetLegacyAbacRequest.Marshal(b, m, deterministic) -} -func (m *SetLegacyAbacRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetLegacyAbacRequest.Merge(m, src) -} -func (m *SetLegacyAbacRequest) XXX_Size() int { - return xxx_messageInfo_SetLegacyAbacRequest.Size(m) -} -func (m *SetLegacyAbacRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetLegacyAbacRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetLegacyAbacRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *SetLegacyAbacRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetLegacyAbacRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *SetLegacyAbacRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *SetLegacyAbacRequest) GetEnabled() bool { - if m != nil { - return m.Enabled - } - return false -} - -func (m *SetLegacyAbacRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// StartIPRotationRequest creates a new IP for the cluster and then performs -// a node upgrade on each node pool to point to the new IP. -type StartIPRotationRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://developers.google.com/console/help/new/#projectnumber). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // The name (project, location, cluster id) of the cluster to start IP - // rotation. Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - // Whether to rotate credentials during IP rotation. - RotateCredentials bool `protobuf:"varint,7,opt,name=rotate_credentials,json=rotateCredentials,proto3" json:"rotate_credentials,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StartIPRotationRequest) Reset() { *m = StartIPRotationRequest{} } -func (m *StartIPRotationRequest) String() string { return proto.CompactTextString(m) } -func (*StartIPRotationRequest) ProtoMessage() {} -func (*StartIPRotationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{63} -} - -func (m *StartIPRotationRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StartIPRotationRequest.Unmarshal(m, b) -} -func (m *StartIPRotationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StartIPRotationRequest.Marshal(b, m, deterministic) -} -func (m *StartIPRotationRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StartIPRotationRequest.Merge(m, src) -} -func (m *StartIPRotationRequest) XXX_Size() int { - return xxx_messageInfo_StartIPRotationRequest.Size(m) -} -func (m *StartIPRotationRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StartIPRotationRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_StartIPRotationRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *StartIPRotationRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *StartIPRotationRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *StartIPRotationRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *StartIPRotationRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *StartIPRotationRequest) GetRotateCredentials() bool { - if m != nil { - return m.RotateCredentials - } - return false -} - -// CompleteIPRotationRequest moves the cluster master back into single-IP mode. -type CompleteIPRotationRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://developers.google.com/console/help/new/#projectnumber). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // The name (project, location, cluster id) of the cluster to complete IP - // rotation. Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CompleteIPRotationRequest) Reset() { *m = CompleteIPRotationRequest{} } -func (m *CompleteIPRotationRequest) String() string { return proto.CompactTextString(m) } -func (*CompleteIPRotationRequest) ProtoMessage() {} -func (*CompleteIPRotationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{64} -} - -func (m *CompleteIPRotationRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CompleteIPRotationRequest.Unmarshal(m, b) -} -func (m *CompleteIPRotationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CompleteIPRotationRequest.Marshal(b, m, deterministic) -} -func (m *CompleteIPRotationRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CompleteIPRotationRequest.Merge(m, src) -} -func (m *CompleteIPRotationRequest) XXX_Size() int { - return xxx_messageInfo_CompleteIPRotationRequest.Size(m) -} -func (m *CompleteIPRotationRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CompleteIPRotationRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CompleteIPRotationRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *CompleteIPRotationRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *CompleteIPRotationRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *CompleteIPRotationRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *CompleteIPRotationRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// AcceleratorConfig represents a Hardware Accelerator request. -type AcceleratorConfig struct { - // The number of the accelerator cards exposed to an instance. - AcceleratorCount int64 `protobuf:"varint,1,opt,name=accelerator_count,json=acceleratorCount,proto3" json:"accelerator_count,omitempty"` - // The accelerator type resource name. List of supported accelerators - // [here](/compute/docs/gpus) - AcceleratorType string `protobuf:"bytes,2,opt,name=accelerator_type,json=acceleratorType,proto3" json:"accelerator_type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AcceleratorConfig) Reset() { *m = AcceleratorConfig{} } -func (m *AcceleratorConfig) String() string { return proto.CompactTextString(m) } -func (*AcceleratorConfig) ProtoMessage() {} -func (*AcceleratorConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{65} -} - -func (m *AcceleratorConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AcceleratorConfig.Unmarshal(m, b) -} -func (m *AcceleratorConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AcceleratorConfig.Marshal(b, m, deterministic) -} -func (m *AcceleratorConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_AcceleratorConfig.Merge(m, src) -} -func (m *AcceleratorConfig) XXX_Size() int { - return xxx_messageInfo_AcceleratorConfig.Size(m) -} -func (m *AcceleratorConfig) XXX_DiscardUnknown() { - xxx_messageInfo_AcceleratorConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_AcceleratorConfig proto.InternalMessageInfo - -func (m *AcceleratorConfig) GetAcceleratorCount() int64 { - if m != nil { - return m.AcceleratorCount - } - return 0 -} - -func (m *AcceleratorConfig) GetAcceleratorType() string { - if m != nil { - return m.AcceleratorType - } - return "" -} - -// SetNetworkPolicyRequest enables/disables network policy for a cluster. -type SetNetworkPolicyRequest struct { - // Deprecated. The Google Developers Console [project ID or project - // number](https://developers.google.com/console/help/new/#projectnumber). - // This field has been deprecated and replaced by the name field. - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - // This field has been deprecated and replaced by the name field. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` // Deprecated: Do not use. - // Deprecated. The name of the cluster. - // This field has been deprecated and replaced by the name field. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` // Deprecated: Do not use. - // Required. Configuration options for the NetworkPolicy feature. - NetworkPolicy *NetworkPolicy `protobuf:"bytes,4,opt,name=network_policy,json=networkPolicy,proto3" json:"network_policy,omitempty"` - // The name (project, location, cluster id) of the cluster to set networking - // policy. Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetNetworkPolicyRequest) Reset() { *m = SetNetworkPolicyRequest{} } -func (m *SetNetworkPolicyRequest) String() string { return proto.CompactTextString(m) } -func (*SetNetworkPolicyRequest) ProtoMessage() {} -func (*SetNetworkPolicyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{66} -} - -func (m *SetNetworkPolicyRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetNetworkPolicyRequest.Unmarshal(m, b) -} -func (m *SetNetworkPolicyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetNetworkPolicyRequest.Marshal(b, m, deterministic) -} -func (m *SetNetworkPolicyRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetNetworkPolicyRequest.Merge(m, src) -} -func (m *SetNetworkPolicyRequest) XXX_Size() int { - return xxx_messageInfo_SetNetworkPolicyRequest.Size(m) -} -func (m *SetNetworkPolicyRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetNetworkPolicyRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetNetworkPolicyRequest proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *SetNetworkPolicyRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -// Deprecated: Do not use. -func (m *SetNetworkPolicyRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -// Deprecated: Do not use. -func (m *SetNetworkPolicyRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *SetNetworkPolicyRequest) GetNetworkPolicy() *NetworkPolicy { - if m != nil { - return m.NetworkPolicy - } - return nil -} - -func (m *SetNetworkPolicyRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// SetMaintenancePolicyRequest sets the maintenance policy for a cluster. -type SetMaintenancePolicyRequest struct { - // Required. The Google Developers Console [project ID or project - // number](https://support.google.com/cloud/answer/6158840). - ProjectId string `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"` - // Required. The name of the Google Compute Engine - // [zone](/compute/docs/zones#available) in which the cluster - // resides. - Zone string `protobuf:"bytes,2,opt,name=zone,proto3" json:"zone,omitempty"` - // Required. The name of the cluster to update. - ClusterId string `protobuf:"bytes,3,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` - // Required. The maintenance policy to be set for the cluster. An empty field - // clears the existing maintenance policy. - MaintenancePolicy *MaintenancePolicy `protobuf:"bytes,4,opt,name=maintenance_policy,json=maintenancePolicy,proto3" json:"maintenance_policy,omitempty"` - // The name (project, location, cluster id) of the cluster to set maintenance - // policy. - // Specified in the format 'projects/*/locations/*/clusters/*'. - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SetMaintenancePolicyRequest) Reset() { *m = SetMaintenancePolicyRequest{} } -func (m *SetMaintenancePolicyRequest) String() string { return proto.CompactTextString(m) } -func (*SetMaintenancePolicyRequest) ProtoMessage() {} -func (*SetMaintenancePolicyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{67} -} - -func (m *SetMaintenancePolicyRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SetMaintenancePolicyRequest.Unmarshal(m, b) -} -func (m *SetMaintenancePolicyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SetMaintenancePolicyRequest.Marshal(b, m, deterministic) -} -func (m *SetMaintenancePolicyRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetMaintenancePolicyRequest.Merge(m, src) -} -func (m *SetMaintenancePolicyRequest) XXX_Size() int { - return xxx_messageInfo_SetMaintenancePolicyRequest.Size(m) -} -func (m *SetMaintenancePolicyRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetMaintenancePolicyRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetMaintenancePolicyRequest proto.InternalMessageInfo - -func (m *SetMaintenancePolicyRequest) GetProjectId() string { - if m != nil { - return m.ProjectId - } - return "" -} - -func (m *SetMaintenancePolicyRequest) GetZone() string { - if m != nil { - return m.Zone - } - return "" -} - -func (m *SetMaintenancePolicyRequest) GetClusterId() string { - if m != nil { - return m.ClusterId - } - return "" -} - -func (m *SetMaintenancePolicyRequest) GetMaintenancePolicy() *MaintenancePolicy { - if m != nil { - return m.MaintenancePolicy - } - return nil -} - -func (m *SetMaintenancePolicyRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// StatusCondition describes why a cluster or a node pool has a certain status -// (e.g., ERROR or DEGRADED). -type StatusCondition struct { - // Machine-friendly representation of the condition - Code StatusCondition_Code `protobuf:"varint,1,opt,name=code,proto3,enum=google.container.v1.StatusCondition_Code" json:"code,omitempty"` - // Human-friendly representation of the condition - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StatusCondition) Reset() { *m = StatusCondition{} } -func (m *StatusCondition) String() string { return proto.CompactTextString(m) } -func (*StatusCondition) ProtoMessage() {} -func (*StatusCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{68} -} - -func (m *StatusCondition) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StatusCondition.Unmarshal(m, b) -} -func (m *StatusCondition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StatusCondition.Marshal(b, m, deterministic) -} -func (m *StatusCondition) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusCondition.Merge(m, src) -} -func (m *StatusCondition) XXX_Size() int { - return xxx_messageInfo_StatusCondition.Size(m) -} -func (m *StatusCondition) XXX_DiscardUnknown() { - xxx_messageInfo_StatusCondition.DiscardUnknown(m) -} - -var xxx_messageInfo_StatusCondition proto.InternalMessageInfo - -func (m *StatusCondition) GetCode() StatusCondition_Code { - if m != nil { - return m.Code - } - return StatusCondition_UNKNOWN -} - -func (m *StatusCondition) GetMessage() string { - if m != nil { - return m.Message - } - return "" -} - -// NetworkConfig reports the relative names of network & subnetwork. -type NetworkConfig struct { - // Output only. The relative name of the Google Compute Engine - // [network][google.container.v1.NetworkConfig.network](/compute/docs/networks-and-firewalls#networks) to which - // the cluster is connected. - // Example: projects/my-project/global/networks/my-network - Network string `protobuf:"bytes,1,opt,name=network,proto3" json:"network,omitempty"` - // Output only. The relative name of the Google Compute Engine - // [subnetwork](/compute/docs/vpc) to which the cluster is connected. - // Example: projects/my-project/regions/us-central1/subnetworks/my-subnet - Subnetwork string `protobuf:"bytes,2,opt,name=subnetwork,proto3" json:"subnetwork,omitempty"` - // Whether Intra-node visibility is enabled for this cluster. - // This makes same node pod to pod traffic visible for VPC network. - EnableIntraNodeVisibility bool `protobuf:"varint,5,opt,name=enable_intra_node_visibility,json=enableIntraNodeVisibility,proto3" json:"enable_intra_node_visibility,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NetworkConfig) Reset() { *m = NetworkConfig{} } -func (m *NetworkConfig) String() string { return proto.CompactTextString(m) } -func (*NetworkConfig) ProtoMessage() {} -func (*NetworkConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{69} -} - -func (m *NetworkConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NetworkConfig.Unmarshal(m, b) -} -func (m *NetworkConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NetworkConfig.Marshal(b, m, deterministic) -} -func (m *NetworkConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_NetworkConfig.Merge(m, src) -} -func (m *NetworkConfig) XXX_Size() int { - return xxx_messageInfo_NetworkConfig.Size(m) -} -func (m *NetworkConfig) XXX_DiscardUnknown() { - xxx_messageInfo_NetworkConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_NetworkConfig proto.InternalMessageInfo - -func (m *NetworkConfig) GetNetwork() string { - if m != nil { - return m.Network - } - return "" -} - -func (m *NetworkConfig) GetSubnetwork() string { - if m != nil { - return m.Subnetwork - } - return "" -} - -func (m *NetworkConfig) GetEnableIntraNodeVisibility() bool { - if m != nil { - return m.EnableIntraNodeVisibility - } - return false -} - -// IntraNodeVisibilityConfig contains the desired config of the intra-node -// visibility on this cluster. -type IntraNodeVisibilityConfig struct { - // Enables intra node visibility for this cluster. - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *IntraNodeVisibilityConfig) Reset() { *m = IntraNodeVisibilityConfig{} } -func (m *IntraNodeVisibilityConfig) String() string { return proto.CompactTextString(m) } -func (*IntraNodeVisibilityConfig) ProtoMessage() {} -func (*IntraNodeVisibilityConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{70} -} - -func (m *IntraNodeVisibilityConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_IntraNodeVisibilityConfig.Unmarshal(m, b) -} -func (m *IntraNodeVisibilityConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_IntraNodeVisibilityConfig.Marshal(b, m, deterministic) -} -func (m *IntraNodeVisibilityConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_IntraNodeVisibilityConfig.Merge(m, src) -} -func (m *IntraNodeVisibilityConfig) XXX_Size() int { - return xxx_messageInfo_IntraNodeVisibilityConfig.Size(m) -} -func (m *IntraNodeVisibilityConfig) XXX_DiscardUnknown() { - xxx_messageInfo_IntraNodeVisibilityConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_IntraNodeVisibilityConfig proto.InternalMessageInfo - -func (m *IntraNodeVisibilityConfig) GetEnabled() bool { - if m != nil { - return m.Enabled - } - return false -} - -// Constraints applied to pods. -type MaxPodsConstraint struct { - // Constraint enforced on the max num of pods per node. - MaxPodsPerNode int64 `protobuf:"varint,1,opt,name=max_pods_per_node,json=maxPodsPerNode,proto3" json:"max_pods_per_node,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MaxPodsConstraint) Reset() { *m = MaxPodsConstraint{} } -func (m *MaxPodsConstraint) String() string { return proto.CompactTextString(m) } -func (*MaxPodsConstraint) ProtoMessage() {} -func (*MaxPodsConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{71} -} - -func (m *MaxPodsConstraint) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MaxPodsConstraint.Unmarshal(m, b) -} -func (m *MaxPodsConstraint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MaxPodsConstraint.Marshal(b, m, deterministic) -} -func (m *MaxPodsConstraint) XXX_Merge(src proto.Message) { - xxx_messageInfo_MaxPodsConstraint.Merge(m, src) -} -func (m *MaxPodsConstraint) XXX_Size() int { - return xxx_messageInfo_MaxPodsConstraint.Size(m) -} -func (m *MaxPodsConstraint) XXX_DiscardUnknown() { - xxx_messageInfo_MaxPodsConstraint.DiscardUnknown(m) -} - -var xxx_messageInfo_MaxPodsConstraint proto.InternalMessageInfo - -func (m *MaxPodsConstraint) GetMaxPodsPerNode() int64 { - if m != nil { - return m.MaxPodsPerNode - } - return 0 -} - -// Configuration of etcd encryption. -type DatabaseEncryption struct { - // Denotes the state of etcd encryption. - State DatabaseEncryption_State `protobuf:"varint,2,opt,name=state,proto3,enum=google.container.v1.DatabaseEncryption_State" json:"state,omitempty"` - // Name of CloudKMS key to use for the encryption of secrets in etcd. - // Ex. projects/my-project/locations/global/keyRings/my-ring/cryptoKeys/my-key - KeyName string `protobuf:"bytes,1,opt,name=key_name,json=keyName,proto3" json:"key_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DatabaseEncryption) Reset() { *m = DatabaseEncryption{} } -func (m *DatabaseEncryption) String() string { return proto.CompactTextString(m) } -func (*DatabaseEncryption) ProtoMessage() {} -func (*DatabaseEncryption) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{72} -} - -func (m *DatabaseEncryption) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DatabaseEncryption.Unmarshal(m, b) -} -func (m *DatabaseEncryption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DatabaseEncryption.Marshal(b, m, deterministic) -} -func (m *DatabaseEncryption) XXX_Merge(src proto.Message) { - xxx_messageInfo_DatabaseEncryption.Merge(m, src) -} -func (m *DatabaseEncryption) XXX_Size() int { - return xxx_messageInfo_DatabaseEncryption.Size(m) -} -func (m *DatabaseEncryption) XXX_DiscardUnknown() { - xxx_messageInfo_DatabaseEncryption.DiscardUnknown(m) -} - -var xxx_messageInfo_DatabaseEncryption proto.InternalMessageInfo - -func (m *DatabaseEncryption) GetState() DatabaseEncryption_State { - if m != nil { - return m.State - } - return DatabaseEncryption_UNKNOWN -} - -func (m *DatabaseEncryption) GetKeyName() string { - if m != nil { - return m.KeyName - } - return "" -} - -// ListUsableSubnetworksRequest requests the list of usable subnetworks -// available to a user for creating clusters. -type ListUsableSubnetworksRequest struct { - // The parent project where subnetworks are usable. - // Specified in the format 'projects/*'. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Filtering currently only supports equality on the networkProjectId and must - // be in the form: "networkProjectId=[PROJECTID]", where `networkProjectId` - // is the project which owns the listed subnetworks. This defaults to the - // parent project ID. - Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` - // The max number of results per page that should be returned. If the number - // of available results is larger than `page_size`, a `next_page_token` is - // returned which can be used to get the next page of results in subsequent - // requests. Acceptable values are 0 to 500, inclusive. (Default: 500) - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // Specifies a page token to use. Set this to the nextPageToken returned by - // previous list requests to get the next page of results. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListUsableSubnetworksRequest) Reset() { *m = ListUsableSubnetworksRequest{} } -func (m *ListUsableSubnetworksRequest) String() string { return proto.CompactTextString(m) } -func (*ListUsableSubnetworksRequest) ProtoMessage() {} -func (*ListUsableSubnetworksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{73} -} - -func (m *ListUsableSubnetworksRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListUsableSubnetworksRequest.Unmarshal(m, b) -} -func (m *ListUsableSubnetworksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListUsableSubnetworksRequest.Marshal(b, m, deterministic) -} -func (m *ListUsableSubnetworksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListUsableSubnetworksRequest.Merge(m, src) -} -func (m *ListUsableSubnetworksRequest) XXX_Size() int { - return xxx_messageInfo_ListUsableSubnetworksRequest.Size(m) -} -func (m *ListUsableSubnetworksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListUsableSubnetworksRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListUsableSubnetworksRequest proto.InternalMessageInfo - -func (m *ListUsableSubnetworksRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -func (m *ListUsableSubnetworksRequest) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *ListUsableSubnetworksRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListUsableSubnetworksRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -// ListUsableSubnetworksResponse is the response of -// ListUsableSubnetworksRequest. -type ListUsableSubnetworksResponse struct { - // A list of usable subnetworks in the specified network project. - Subnetworks []*UsableSubnetwork `protobuf:"bytes,1,rep,name=subnetworks,proto3" json:"subnetworks,omitempty"` - // This token allows you to get the next page of results for list requests. - // If the number of results is larger than `page_size`, use the - // `next_page_token` as a value for the query parameter `page_token` in the - // next request. The value will become empty when there are no more pages. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListUsableSubnetworksResponse) Reset() { *m = ListUsableSubnetworksResponse{} } -func (m *ListUsableSubnetworksResponse) String() string { return proto.CompactTextString(m) } -func (*ListUsableSubnetworksResponse) ProtoMessage() {} -func (*ListUsableSubnetworksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{74} -} - -func (m *ListUsableSubnetworksResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListUsableSubnetworksResponse.Unmarshal(m, b) -} -func (m *ListUsableSubnetworksResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListUsableSubnetworksResponse.Marshal(b, m, deterministic) -} -func (m *ListUsableSubnetworksResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListUsableSubnetworksResponse.Merge(m, src) -} -func (m *ListUsableSubnetworksResponse) XXX_Size() int { - return xxx_messageInfo_ListUsableSubnetworksResponse.Size(m) -} -func (m *ListUsableSubnetworksResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListUsableSubnetworksResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListUsableSubnetworksResponse proto.InternalMessageInfo - -func (m *ListUsableSubnetworksResponse) GetSubnetworks() []*UsableSubnetwork { - if m != nil { - return m.Subnetworks - } - return nil -} - -func (m *ListUsableSubnetworksResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -// Secondary IP range of a usable subnetwork. -type UsableSubnetworkSecondaryRange struct { - // The name associated with this subnetwork secondary range, used when adding - // an alias IP range to a VM instance. - RangeName string `protobuf:"bytes,1,opt,name=range_name,json=rangeName,proto3" json:"range_name,omitempty"` - // The range of IP addresses belonging to this subnetwork secondary range. - IpCidrRange string `protobuf:"bytes,2,opt,name=ip_cidr_range,json=ipCidrRange,proto3" json:"ip_cidr_range,omitempty"` - // This field is to determine the status of the secondary range programmably. - Status UsableSubnetworkSecondaryRange_Status `protobuf:"varint,3,opt,name=status,proto3,enum=google.container.v1.UsableSubnetworkSecondaryRange_Status" json:"status,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UsableSubnetworkSecondaryRange) Reset() { *m = UsableSubnetworkSecondaryRange{} } -func (m *UsableSubnetworkSecondaryRange) String() string { return proto.CompactTextString(m) } -func (*UsableSubnetworkSecondaryRange) ProtoMessage() {} -func (*UsableSubnetworkSecondaryRange) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{75} -} - -func (m *UsableSubnetworkSecondaryRange) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UsableSubnetworkSecondaryRange.Unmarshal(m, b) -} -func (m *UsableSubnetworkSecondaryRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UsableSubnetworkSecondaryRange.Marshal(b, m, deterministic) -} -func (m *UsableSubnetworkSecondaryRange) XXX_Merge(src proto.Message) { - xxx_messageInfo_UsableSubnetworkSecondaryRange.Merge(m, src) -} -func (m *UsableSubnetworkSecondaryRange) XXX_Size() int { - return xxx_messageInfo_UsableSubnetworkSecondaryRange.Size(m) -} -func (m *UsableSubnetworkSecondaryRange) XXX_DiscardUnknown() { - xxx_messageInfo_UsableSubnetworkSecondaryRange.DiscardUnknown(m) -} - -var xxx_messageInfo_UsableSubnetworkSecondaryRange proto.InternalMessageInfo - -func (m *UsableSubnetworkSecondaryRange) GetRangeName() string { - if m != nil { - return m.RangeName - } - return "" -} - -func (m *UsableSubnetworkSecondaryRange) GetIpCidrRange() string { - if m != nil { - return m.IpCidrRange - } - return "" -} - -func (m *UsableSubnetworkSecondaryRange) GetStatus() UsableSubnetworkSecondaryRange_Status { - if m != nil { - return m.Status - } - return UsableSubnetworkSecondaryRange_UNKNOWN -} - -// UsableSubnetwork resource returns the subnetwork name, its associated network -// and the primary CIDR range. -type UsableSubnetwork struct { - // Subnetwork Name. - // Example: projects/my-project/regions/us-central1/subnetworks/my-subnet - Subnetwork string `protobuf:"bytes,1,opt,name=subnetwork,proto3" json:"subnetwork,omitempty"` - // Network Name. - // Example: projects/my-project/global/networks/my-network - Network string `protobuf:"bytes,2,opt,name=network,proto3" json:"network,omitempty"` - // The range of internal addresses that are owned by this subnetwork. - IpCidrRange string `protobuf:"bytes,3,opt,name=ip_cidr_range,json=ipCidrRange,proto3" json:"ip_cidr_range,omitempty"` - // Secondary IP ranges. - SecondaryIpRanges []*UsableSubnetworkSecondaryRange `protobuf:"bytes,4,rep,name=secondary_ip_ranges,json=secondaryIpRanges,proto3" json:"secondary_ip_ranges,omitempty"` - // A human readable status message representing the reasons for cases where - // the caller cannot use the secondary ranges under the subnet. For example if - // the secondary_ip_ranges is empty due to a permission issue, an insufficient - // permission message will be given by status_message. - StatusMessage string `protobuf:"bytes,5,opt,name=status_message,json=statusMessage,proto3" json:"status_message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UsableSubnetwork) Reset() { *m = UsableSubnetwork{} } -func (m *UsableSubnetwork) String() string { return proto.CompactTextString(m) } -func (*UsableSubnetwork) ProtoMessage() {} -func (*UsableSubnetwork) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{76} -} - -func (m *UsableSubnetwork) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UsableSubnetwork.Unmarshal(m, b) -} -func (m *UsableSubnetwork) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UsableSubnetwork.Marshal(b, m, deterministic) -} -func (m *UsableSubnetwork) XXX_Merge(src proto.Message) { - xxx_messageInfo_UsableSubnetwork.Merge(m, src) -} -func (m *UsableSubnetwork) XXX_Size() int { - return xxx_messageInfo_UsableSubnetwork.Size(m) -} -func (m *UsableSubnetwork) XXX_DiscardUnknown() { - xxx_messageInfo_UsableSubnetwork.DiscardUnknown(m) -} - -var xxx_messageInfo_UsableSubnetwork proto.InternalMessageInfo - -func (m *UsableSubnetwork) GetSubnetwork() string { - if m != nil { - return m.Subnetwork - } - return "" -} - -func (m *UsableSubnetwork) GetNetwork() string { - if m != nil { - return m.Network - } - return "" -} - -func (m *UsableSubnetwork) GetIpCidrRange() string { - if m != nil { - return m.IpCidrRange - } - return "" -} - -func (m *UsableSubnetwork) GetSecondaryIpRanges() []*UsableSubnetworkSecondaryRange { - if m != nil { - return m.SecondaryIpRanges - } - return nil -} - -func (m *UsableSubnetwork) GetStatusMessage() string { - if m != nil { - return m.StatusMessage - } - return "" -} - -// Configuration for exporting cluster resource usages. -type ResourceUsageExportConfig struct { - // Configuration to use BigQuery as usage export destination. - BigqueryDestination *ResourceUsageExportConfig_BigQueryDestination `protobuf:"bytes,1,opt,name=bigquery_destination,json=bigqueryDestination,proto3" json:"bigquery_destination,omitempty"` - // Whether to enable network egress metering for this cluster. If enabled, a - // daemonset will be created in the cluster to meter network egress traffic. - EnableNetworkEgressMetering bool `protobuf:"varint,2,opt,name=enable_network_egress_metering,json=enableNetworkEgressMetering,proto3" json:"enable_network_egress_metering,omitempty"` - // Configuration to enable resource consumption metering. - ConsumptionMeteringConfig *ResourceUsageExportConfig_ConsumptionMeteringConfig `protobuf:"bytes,3,opt,name=consumption_metering_config,json=consumptionMeteringConfig,proto3" json:"consumption_metering_config,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ResourceUsageExportConfig) Reset() { *m = ResourceUsageExportConfig{} } -func (m *ResourceUsageExportConfig) String() string { return proto.CompactTextString(m) } -func (*ResourceUsageExportConfig) ProtoMessage() {} -func (*ResourceUsageExportConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{77} -} - -func (m *ResourceUsageExportConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ResourceUsageExportConfig.Unmarshal(m, b) -} -func (m *ResourceUsageExportConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ResourceUsageExportConfig.Marshal(b, m, deterministic) -} -func (m *ResourceUsageExportConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceUsageExportConfig.Merge(m, src) -} -func (m *ResourceUsageExportConfig) XXX_Size() int { - return xxx_messageInfo_ResourceUsageExportConfig.Size(m) -} -func (m *ResourceUsageExportConfig) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceUsageExportConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceUsageExportConfig proto.InternalMessageInfo - -func (m *ResourceUsageExportConfig) GetBigqueryDestination() *ResourceUsageExportConfig_BigQueryDestination { - if m != nil { - return m.BigqueryDestination - } - return nil -} - -func (m *ResourceUsageExportConfig) GetEnableNetworkEgressMetering() bool { - if m != nil { - return m.EnableNetworkEgressMetering - } - return false -} - -func (m *ResourceUsageExportConfig) GetConsumptionMeteringConfig() *ResourceUsageExportConfig_ConsumptionMeteringConfig { - if m != nil { - return m.ConsumptionMeteringConfig - } - return nil -} - -// Parameters for using BigQuery as the destination of resource usage export. -type ResourceUsageExportConfig_BigQueryDestination struct { - // The ID of a BigQuery Dataset. - DatasetId string `protobuf:"bytes,1,opt,name=dataset_id,json=datasetId,proto3" json:"dataset_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ResourceUsageExportConfig_BigQueryDestination) Reset() { - *m = ResourceUsageExportConfig_BigQueryDestination{} -} -func (m *ResourceUsageExportConfig_BigQueryDestination) String() string { - return proto.CompactTextString(m) -} -func (*ResourceUsageExportConfig_BigQueryDestination) ProtoMessage() {} -func (*ResourceUsageExportConfig_BigQueryDestination) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{77, 0} -} - -func (m *ResourceUsageExportConfig_BigQueryDestination) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ResourceUsageExportConfig_BigQueryDestination.Unmarshal(m, b) -} -func (m *ResourceUsageExportConfig_BigQueryDestination) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ResourceUsageExportConfig_BigQueryDestination.Marshal(b, m, deterministic) -} -func (m *ResourceUsageExportConfig_BigQueryDestination) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceUsageExportConfig_BigQueryDestination.Merge(m, src) -} -func (m *ResourceUsageExportConfig_BigQueryDestination) XXX_Size() int { - return xxx_messageInfo_ResourceUsageExportConfig_BigQueryDestination.Size(m) -} -func (m *ResourceUsageExportConfig_BigQueryDestination) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceUsageExportConfig_BigQueryDestination.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceUsageExportConfig_BigQueryDestination proto.InternalMessageInfo - -func (m *ResourceUsageExportConfig_BigQueryDestination) GetDatasetId() string { - if m != nil { - return m.DatasetId - } - return "" -} - -// Parameters for controlling consumption metering. -type ResourceUsageExportConfig_ConsumptionMeteringConfig struct { - // Whether to enable consumption metering for this cluster. If enabled, a - // second BigQuery table will be created to hold resource consumption - // records. - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ResourceUsageExportConfig_ConsumptionMeteringConfig) Reset() { - *m = ResourceUsageExportConfig_ConsumptionMeteringConfig{} -} -func (m *ResourceUsageExportConfig_ConsumptionMeteringConfig) String() string { - return proto.CompactTextString(m) -} -func (*ResourceUsageExportConfig_ConsumptionMeteringConfig) ProtoMessage() {} -func (*ResourceUsageExportConfig_ConsumptionMeteringConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{77, 1} -} - -func (m *ResourceUsageExportConfig_ConsumptionMeteringConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ResourceUsageExportConfig_ConsumptionMeteringConfig.Unmarshal(m, b) -} -func (m *ResourceUsageExportConfig_ConsumptionMeteringConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ResourceUsageExportConfig_ConsumptionMeteringConfig.Marshal(b, m, deterministic) -} -func (m *ResourceUsageExportConfig_ConsumptionMeteringConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResourceUsageExportConfig_ConsumptionMeteringConfig.Merge(m, src) -} -func (m *ResourceUsageExportConfig_ConsumptionMeteringConfig) XXX_Size() int { - return xxx_messageInfo_ResourceUsageExportConfig_ConsumptionMeteringConfig.Size(m) -} -func (m *ResourceUsageExportConfig_ConsumptionMeteringConfig) XXX_DiscardUnknown() { - xxx_messageInfo_ResourceUsageExportConfig_ConsumptionMeteringConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_ResourceUsageExportConfig_ConsumptionMeteringConfig proto.InternalMessageInfo - -func (m *ResourceUsageExportConfig_ConsumptionMeteringConfig) GetEnabled() bool { - if m != nil { - return m.Enabled - } - return false -} - -// VerticalPodAutoscaling contains global, per-cluster information -// required by Vertical Pod Autoscaler to automatically adjust -// the resources of pods controlled by it. -type VerticalPodAutoscaling struct { - // Enables vertical pod autoscaling. - Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *VerticalPodAutoscaling) Reset() { *m = VerticalPodAutoscaling{} } -func (m *VerticalPodAutoscaling) String() string { return proto.CompactTextString(m) } -func (*VerticalPodAutoscaling) ProtoMessage() {} -func (*VerticalPodAutoscaling) Descriptor() ([]byte, []int) { - return fileDescriptor_1c7f18b1699f357a, []int{78} -} - -func (m *VerticalPodAutoscaling) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_VerticalPodAutoscaling.Unmarshal(m, b) -} -func (m *VerticalPodAutoscaling) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_VerticalPodAutoscaling.Marshal(b, m, deterministic) -} -func (m *VerticalPodAutoscaling) XXX_Merge(src proto.Message) { - xxx_messageInfo_VerticalPodAutoscaling.Merge(m, src) -} -func (m *VerticalPodAutoscaling) XXX_Size() int { - return xxx_messageInfo_VerticalPodAutoscaling.Size(m) -} -func (m *VerticalPodAutoscaling) XXX_DiscardUnknown() { - xxx_messageInfo_VerticalPodAutoscaling.DiscardUnknown(m) -} - -var xxx_messageInfo_VerticalPodAutoscaling proto.InternalMessageInfo - -func (m *VerticalPodAutoscaling) GetEnabled() bool { - if m != nil { - return m.Enabled - } - return false -} - -func init() { - proto.RegisterEnum("google.container.v1.NodeTaint_Effect", NodeTaint_Effect_name, NodeTaint_Effect_value) - proto.RegisterEnum("google.container.v1.NetworkPolicy_Provider", NetworkPolicy_Provider_name, NetworkPolicy_Provider_value) - proto.RegisterEnum("google.container.v1.Cluster_Status", Cluster_Status_name, Cluster_Status_value) - proto.RegisterEnum("google.container.v1.Operation_Status", Operation_Status_name, Operation_Status_value) - proto.RegisterEnum("google.container.v1.Operation_Type", Operation_Type_name, Operation_Type_value) - proto.RegisterEnum("google.container.v1.SetMasterAuthRequest_Action", SetMasterAuthRequest_Action_name, SetMasterAuthRequest_Action_value) - proto.RegisterEnum("google.container.v1.NodePool_Status", NodePool_Status_name, NodePool_Status_value) - proto.RegisterEnum("google.container.v1.StatusCondition_Code", StatusCondition_Code_name, StatusCondition_Code_value) - proto.RegisterEnum("google.container.v1.DatabaseEncryption_State", DatabaseEncryption_State_name, DatabaseEncryption_State_value) - proto.RegisterEnum("google.container.v1.UsableSubnetworkSecondaryRange_Status", UsableSubnetworkSecondaryRange_Status_name, UsableSubnetworkSecondaryRange_Status_value) - proto.RegisterType((*NodeConfig)(nil), "google.container.v1.NodeConfig") - proto.RegisterMapType((map[string]string)(nil), "google.container.v1.NodeConfig.LabelsEntry") - proto.RegisterMapType((map[string]string)(nil), "google.container.v1.NodeConfig.MetadataEntry") - proto.RegisterType((*ShieldedInstanceConfig)(nil), "google.container.v1.ShieldedInstanceConfig") - proto.RegisterType((*NodeTaint)(nil), "google.container.v1.NodeTaint") - proto.RegisterType((*MasterAuth)(nil), "google.container.v1.MasterAuth") - proto.RegisterType((*ClientCertificateConfig)(nil), "google.container.v1.ClientCertificateConfig") - proto.RegisterType((*AddonsConfig)(nil), "google.container.v1.AddonsConfig") - proto.RegisterType((*HttpLoadBalancing)(nil), "google.container.v1.HttpLoadBalancing") - proto.RegisterType((*HorizontalPodAutoscaling)(nil), "google.container.v1.HorizontalPodAutoscaling") - proto.RegisterType((*KubernetesDashboard)(nil), "google.container.v1.KubernetesDashboard") - proto.RegisterType((*NetworkPolicyConfig)(nil), "google.container.v1.NetworkPolicyConfig") - proto.RegisterType((*PrivateClusterConfig)(nil), "google.container.v1.PrivateClusterConfig") - proto.RegisterType((*AuthenticatorGroupsConfig)(nil), "google.container.v1.AuthenticatorGroupsConfig") - proto.RegisterType((*CloudRunConfig)(nil), "google.container.v1.CloudRunConfig") - proto.RegisterType((*MasterAuthorizedNetworksConfig)(nil), "google.container.v1.MasterAuthorizedNetworksConfig") - proto.RegisterType((*MasterAuthorizedNetworksConfig_CidrBlock)(nil), "google.container.v1.MasterAuthorizedNetworksConfig.CidrBlock") - proto.RegisterType((*LegacyAbac)(nil), "google.container.v1.LegacyAbac") - proto.RegisterType((*NetworkPolicy)(nil), "google.container.v1.NetworkPolicy") - proto.RegisterType((*BinaryAuthorization)(nil), "google.container.v1.BinaryAuthorization") - proto.RegisterType((*IPAllocationPolicy)(nil), "google.container.v1.IPAllocationPolicy") - proto.RegisterType((*Cluster)(nil), "google.container.v1.Cluster") - proto.RegisterMapType((map[string]string)(nil), "google.container.v1.Cluster.ResourceLabelsEntry") - proto.RegisterType((*ClusterUpdate)(nil), "google.container.v1.ClusterUpdate") - proto.RegisterType((*Operation)(nil), "google.container.v1.Operation") - proto.RegisterType((*CreateClusterRequest)(nil), "google.container.v1.CreateClusterRequest") - proto.RegisterType((*GetClusterRequest)(nil), "google.container.v1.GetClusterRequest") - proto.RegisterType((*UpdateClusterRequest)(nil), "google.container.v1.UpdateClusterRequest") - proto.RegisterType((*UpdateNodePoolRequest)(nil), "google.container.v1.UpdateNodePoolRequest") - proto.RegisterType((*SetNodePoolAutoscalingRequest)(nil), "google.container.v1.SetNodePoolAutoscalingRequest") - proto.RegisterType((*SetLoggingServiceRequest)(nil), "google.container.v1.SetLoggingServiceRequest") - proto.RegisterType((*SetMonitoringServiceRequest)(nil), "google.container.v1.SetMonitoringServiceRequest") - proto.RegisterType((*SetAddonsConfigRequest)(nil), "google.container.v1.SetAddonsConfigRequest") - proto.RegisterType((*SetLocationsRequest)(nil), "google.container.v1.SetLocationsRequest") - proto.RegisterType((*UpdateMasterRequest)(nil), "google.container.v1.UpdateMasterRequest") - proto.RegisterType((*SetMasterAuthRequest)(nil), "google.container.v1.SetMasterAuthRequest") - proto.RegisterType((*DeleteClusterRequest)(nil), "google.container.v1.DeleteClusterRequest") - proto.RegisterType((*ListClustersRequest)(nil), "google.container.v1.ListClustersRequest") - proto.RegisterType((*ListClustersResponse)(nil), "google.container.v1.ListClustersResponse") - proto.RegisterType((*GetOperationRequest)(nil), "google.container.v1.GetOperationRequest") - proto.RegisterType((*ListOperationsRequest)(nil), "google.container.v1.ListOperationsRequest") - proto.RegisterType((*CancelOperationRequest)(nil), "google.container.v1.CancelOperationRequest") - proto.RegisterType((*ListOperationsResponse)(nil), "google.container.v1.ListOperationsResponse") - proto.RegisterType((*GetServerConfigRequest)(nil), "google.container.v1.GetServerConfigRequest") - proto.RegisterType((*ServerConfig)(nil), "google.container.v1.ServerConfig") - proto.RegisterType((*CreateNodePoolRequest)(nil), "google.container.v1.CreateNodePoolRequest") - proto.RegisterType((*DeleteNodePoolRequest)(nil), "google.container.v1.DeleteNodePoolRequest") - proto.RegisterType((*ListNodePoolsRequest)(nil), "google.container.v1.ListNodePoolsRequest") - proto.RegisterType((*GetNodePoolRequest)(nil), "google.container.v1.GetNodePoolRequest") - proto.RegisterType((*NodePool)(nil), "google.container.v1.NodePool") - proto.RegisterType((*NodeManagement)(nil), "google.container.v1.NodeManagement") - proto.RegisterType((*AutoUpgradeOptions)(nil), "google.container.v1.AutoUpgradeOptions") - proto.RegisterType((*MaintenancePolicy)(nil), "google.container.v1.MaintenancePolicy") - proto.RegisterType((*MaintenanceWindow)(nil), "google.container.v1.MaintenanceWindow") - proto.RegisterMapType((map[string]*TimeWindow)(nil), "google.container.v1.MaintenanceWindow.MaintenanceExclusionsEntry") - proto.RegisterType((*TimeWindow)(nil), "google.container.v1.TimeWindow") - proto.RegisterType((*RecurringTimeWindow)(nil), "google.container.v1.RecurringTimeWindow") - proto.RegisterType((*DailyMaintenanceWindow)(nil), "google.container.v1.DailyMaintenanceWindow") - proto.RegisterType((*SetNodePoolManagementRequest)(nil), "google.container.v1.SetNodePoolManagementRequest") - proto.RegisterType((*SetNodePoolSizeRequest)(nil), "google.container.v1.SetNodePoolSizeRequest") - proto.RegisterType((*RollbackNodePoolUpgradeRequest)(nil), "google.container.v1.RollbackNodePoolUpgradeRequest") - proto.RegisterType((*ListNodePoolsResponse)(nil), "google.container.v1.ListNodePoolsResponse") - proto.RegisterType((*ClusterAutoscaling)(nil), "google.container.v1.ClusterAutoscaling") - proto.RegisterType((*AutoprovisioningNodePoolDefaults)(nil), "google.container.v1.AutoprovisioningNodePoolDefaults") - proto.RegisterType((*ResourceLimit)(nil), "google.container.v1.ResourceLimit") - proto.RegisterType((*NodePoolAutoscaling)(nil), "google.container.v1.NodePoolAutoscaling") - proto.RegisterType((*SetLabelsRequest)(nil), "google.container.v1.SetLabelsRequest") - proto.RegisterMapType((map[string]string)(nil), "google.container.v1.SetLabelsRequest.ResourceLabelsEntry") - proto.RegisterType((*SetLegacyAbacRequest)(nil), "google.container.v1.SetLegacyAbacRequest") - proto.RegisterType((*StartIPRotationRequest)(nil), "google.container.v1.StartIPRotationRequest") - proto.RegisterType((*CompleteIPRotationRequest)(nil), "google.container.v1.CompleteIPRotationRequest") - proto.RegisterType((*AcceleratorConfig)(nil), "google.container.v1.AcceleratorConfig") - proto.RegisterType((*SetNetworkPolicyRequest)(nil), "google.container.v1.SetNetworkPolicyRequest") - proto.RegisterType((*SetMaintenancePolicyRequest)(nil), "google.container.v1.SetMaintenancePolicyRequest") - proto.RegisterType((*StatusCondition)(nil), "google.container.v1.StatusCondition") - proto.RegisterType((*NetworkConfig)(nil), "google.container.v1.NetworkConfig") - proto.RegisterType((*IntraNodeVisibilityConfig)(nil), "google.container.v1.IntraNodeVisibilityConfig") - proto.RegisterType((*MaxPodsConstraint)(nil), "google.container.v1.MaxPodsConstraint") - proto.RegisterType((*DatabaseEncryption)(nil), "google.container.v1.DatabaseEncryption") - proto.RegisterType((*ListUsableSubnetworksRequest)(nil), "google.container.v1.ListUsableSubnetworksRequest") - proto.RegisterType((*ListUsableSubnetworksResponse)(nil), "google.container.v1.ListUsableSubnetworksResponse") - proto.RegisterType((*UsableSubnetworkSecondaryRange)(nil), "google.container.v1.UsableSubnetworkSecondaryRange") - proto.RegisterType((*UsableSubnetwork)(nil), "google.container.v1.UsableSubnetwork") - proto.RegisterType((*ResourceUsageExportConfig)(nil), "google.container.v1.ResourceUsageExportConfig") - proto.RegisterType((*ResourceUsageExportConfig_BigQueryDestination)(nil), "google.container.v1.ResourceUsageExportConfig.BigQueryDestination") - proto.RegisterType((*ResourceUsageExportConfig_ConsumptionMeteringConfig)(nil), "google.container.v1.ResourceUsageExportConfig.ConsumptionMeteringConfig") - proto.RegisterType((*VerticalPodAutoscaling)(nil), "google.container.v1.VerticalPodAutoscaling") -} - -func init() { - proto.RegisterFile("google/container/v1/cluster_service.proto", fileDescriptor_1c7f18b1699f357a) -} - -var fileDescriptor_1c7f18b1699f357a = []byte{ - // 7438 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x59, 0x6c, 0x1c, 0xc9, - 0x95, 0xa0, 0xb3, 0x78, 0x3f, 0x92, 0xc5, 0x62, 0x90, 0xa2, 0x4a, 0xa5, 0xa3, 0xa5, 0xec, 0x4b, - 0x52, 0xab, 0xc9, 0x96, 0xba, 0xd5, 0xee, 0x43, 0x7d, 0x24, 0x8b, 0x25, 0x8a, 0x2d, 0x1e, 0xd5, - 0x59, 0xa4, 0xda, 0xd2, 0xf6, 0x3a, 0x91, 0xac, 0x0a, 0x15, 0xb3, 0x59, 0x95, 0x59, 0xce, 0xcc, - 0x92, 0xc4, 0x6e, 0xa8, 0xb1, 0x36, 0x6c, 0x6f, 0xfb, 0x84, 0x17, 0x5e, 0xef, 0x61, 0x2c, 0x16, - 0x06, 0x76, 0x6d, 0xaf, 0xbd, 0xbd, 0xd8, 0xf1, 0xcc, 0x18, 0x73, 0x19, 0x18, 0xc0, 0x83, 0x01, - 0xc6, 0xf6, 0x1c, 0x18, 0x8f, 0x81, 0x01, 0x38, 0xc0, 0xdc, 0xc0, 0xd8, 0x03, 0xcc, 0x05, 0x78, - 0x3e, 0x06, 0x33, 0x03, 0x0c, 0xe2, 0xca, 0x8c, 0xac, 0xca, 0xac, 0x62, 0x91, 0x6a, 0xb9, 0xbf, - 0xa4, 0x7c, 0xf1, 0x5e, 0x44, 0xbc, 0x17, 0x2f, 0x5e, 0xbc, 0xf7, 0xe2, 0x45, 0x11, 0xce, 0x54, - 0x1d, 0xa7, 0x5a, 0xc3, 0x73, 0x65, 0xc7, 0xf6, 0x4d, 0xcb, 0xc6, 0xee, 0xdc, 0xad, 0xf3, 0x73, - 0xe5, 0x5a, 0xd3, 0xf3, 0xb1, 0x6b, 0x78, 0xd8, 0xbd, 0x65, 0x95, 0xf1, 0x6c, 0xc3, 0x75, 0x7c, - 0x07, 0x4d, 0x31, 0xd4, 0xd9, 0x00, 0x75, 0xf6, 0xd6, 0xf9, 0xdc, 0x31, 0x4e, 0x6f, 0x36, 0xac, - 0x39, 0xd3, 0xb6, 0x1d, 0xdf, 0xf4, 0x2d, 0xc7, 0xf6, 0x18, 0x49, 0xee, 0xb0, 0xd4, 0x5a, 0xae, - 0x59, 0xd8, 0xf6, 0x79, 0xc3, 0x03, 0x52, 0xc3, 0x4d, 0x0b, 0xd7, 0x2a, 0xc6, 0x26, 0xde, 0x32, - 0x6f, 0x59, 0x8e, 0xcb, 0x11, 0x8e, 0x72, 0x04, 0xfa, 0xb5, 0xd9, 0xbc, 0x39, 0x87, 0xeb, 0x0d, - 0x7f, 0xa7, 0x85, 0x3a, 0x68, 0xf4, 0xad, 0x3a, 0xf6, 0x7c, 0xb3, 0xde, 0x60, 0x08, 0xea, 0x8f, - 0x06, 0x01, 0x56, 0x9d, 0x0a, 0xce, 0x3b, 0xf6, 0x4d, 0xab, 0x8a, 0x4e, 0xc1, 0x58, 0xdd, 0x2c, - 0x6f, 0x59, 0x36, 0x36, 0xfc, 0x9d, 0x06, 0xce, 0x2a, 0x27, 0x95, 0xd3, 0x23, 0xfa, 0x28, 0x87, - 0xad, 0xef, 0x34, 0x30, 0x3a, 0x09, 0x63, 0x15, 0xcb, 0xdb, 0x36, 0x3c, 0xeb, 0x4d, 0x6c, 0x54, - 0x37, 0xb3, 0xa9, 0x93, 0xca, 0xe9, 0x01, 0x1d, 0x08, 0xac, 0x64, 0xbd, 0x89, 0x17, 0x37, 0x49, - 0x27, 0x8e, 0xd9, 0xf4, 0xb7, 0x0c, 0xaf, 0xec, 0x34, 0xb0, 0x97, 0xed, 0x3b, 0xd9, 0x47, 0x3a, - 0xa1, 0xb0, 0x12, 0x05, 0xa1, 0x47, 0x61, 0x82, 0x8b, 0xcc, 0x30, 0xcb, 0x65, 0xa7, 0x69, 0xfb, - 0xd9, 0x11, 0x3a, 0x54, 0x9a, 0x83, 0x35, 0x06, 0x45, 0x4b, 0x30, 0x5c, 0xc7, 0xbe, 0x59, 0x31, - 0x7d, 0x33, 0xdb, 0x7f, 0xb2, 0xef, 0xf4, 0xe8, 0x85, 0xc7, 0x67, 0x63, 0xa4, 0x3b, 0x1b, 0xf2, - 0x30, 0xbb, 0xc2, 0xf1, 0x0b, 0xb6, 0xef, 0xee, 0xe8, 0x01, 0x39, 0x3a, 0x0e, 0x60, 0xd5, 0xcd, - 0x2a, 0xe7, 0x6c, 0x80, 0x0e, 0x37, 0x42, 0x21, 0x94, 0xaf, 0x3c, 0x0c, 0xd6, 0xcc, 0x4d, 0x5c, - 0xf3, 0xb2, 0x83, 0x74, 0x9c, 0xc7, 0xba, 0x8d, 0xb3, 0x4c, 0xb1, 0xd9, 0x28, 0x9c, 0x14, 0x3d, - 0x02, 0x13, 0x35, 0xa7, 0x6c, 0xd6, 0x0c, 0xcf, 0xab, 0x18, 0x8c, 0xaf, 0x21, 0x2a, 0x9f, 0x71, - 0x0a, 0x2e, 0x79, 0x95, 0x3c, 0x65, 0x0b, 0x41, 0xbf, 0x6f, 0x56, 0xbd, 0xec, 0x30, 0x15, 0x0d, - 0xfd, 0x3f, 0x3a, 0x09, 0xa3, 0x0d, 0x17, 0x93, 0xd5, 0xb3, 0x36, 0x6b, 0x38, 0x0b, 0x27, 0x95, - 0xd3, 0xc3, 0xba, 0x0c, 0x42, 0xaf, 0xc0, 0x98, 0x59, 0x2e, 0xe3, 0x1a, 0x76, 0x4d, 0xdf, 0x71, - 0xbd, 0xec, 0x28, 0x9d, 0xe8, 0x23, 0xb1, 0x13, 0xd5, 0x42, 0x44, 0x36, 0x5f, 0x3d, 0x42, 0x8b, - 0x8e, 0xc2, 0x08, 0x5d, 0x46, 0x2a, 0x8c, 0x31, 0x2a, 0x8c, 0x61, 0x02, 0xa0, 0xb2, 0x38, 0x0d, - 0x99, 0xba, 0x65, 0x1b, 0xe5, 0x46, 0xd3, 0x68, 0xd4, 0x4c, 0xff, 0xa6, 0xe3, 0xd6, 0xb3, 0xe3, - 0x6c, 0x7d, 0xea, 0x96, 0x9d, 0x6f, 0x34, 0x8b, 0x1c, 0x8a, 0x9e, 0x86, 0x41, 0x32, 0xa6, 0xef, - 0x65, 0x27, 0xe8, 0x64, 0x4e, 0x24, 0x4a, 0x6d, 0x9d, 0xa0, 0xe9, 0x1c, 0x1b, 0x61, 0xc8, 0x7a, - 0x5b, 0x44, 0x9d, 0x71, 0xc5, 0xb0, 0x6c, 0xcf, 0x37, 0xed, 0x32, 0x36, 0xca, 0x74, 0xa2, 0xd9, - 0xe9, 0x93, 0x4a, 0xa2, 0xfc, 0x4b, 0x9c, 0x68, 0x89, 0xd3, 0x70, 0xde, 0x66, 0xbc, 0x58, 0x78, - 0xee, 0x79, 0x18, 0x8f, 0xa8, 0x03, 0xca, 0x40, 0xdf, 0x36, 0xde, 0xe1, 0x7a, 0x4d, 0xfe, 0x8b, - 0xa6, 0x61, 0xe0, 0x96, 0x59, 0x6b, 0x62, 0xaa, 0xc8, 0x23, 0x3a, 0xfb, 0x78, 0x2e, 0xf5, 0x8c, - 0x92, 0x7b, 0x16, 0x46, 0xa5, 0x35, 0xee, 0x85, 0x54, 0xfd, 0xa4, 0x02, 0x33, 0xf1, 0x53, 0x45, - 0xe7, 0x00, 0x61, 0xdb, 0xdc, 0xac, 0x61, 0xc3, 0xc3, 0xe5, 0xa6, 0x8b, 0x8d, 0x4d, 0xc7, 0xf1, - 0x69, 0xaf, 0xc3, 0x7a, 0x86, 0xb5, 0x94, 0x68, 0xc3, 0xbc, 0xe3, 0xf8, 0xe8, 0x45, 0x38, 0xca, - 0xb1, 0x2d, 0xdb, 0xc7, 0x55, 0xd7, 0xf2, 0x77, 0x8c, 0xba, 0x63, 0x5b, 0xbe, 0xe3, 0x5a, 0x76, - 0x95, 0x0e, 0x3c, 0xac, 0x1f, 0x61, 0x28, 0x4b, 0x02, 0x63, 0x25, 0x40, 0x50, 0x7f, 0x47, 0x81, - 0x91, 0x40, 0xfa, 0x7b, 0x65, 0x01, 0xbd, 0x00, 0x83, 0xf8, 0xe6, 0x4d, 0x5c, 0xf6, 0xb3, 0x7d, - 0x27, 0x95, 0xd3, 0xe9, 0x0b, 0x0f, 0x77, 0x5e, 0xd5, 0xd9, 0x02, 0x45, 0xd6, 0x39, 0x91, 0x7a, - 0x1d, 0x06, 0x19, 0x04, 0xcd, 0x00, 0x2a, 0x5c, 0xbe, 0x5c, 0xc8, 0xaf, 0x1b, 0x1b, 0xab, 0xa5, - 0x62, 0x21, 0xbf, 0x74, 0x79, 0xa9, 0xb0, 0x90, 0xf9, 0x00, 0x9a, 0x80, 0xd1, 0xd5, 0x35, 0xa3, - 0x94, 0xbf, 0x52, 0x58, 0xd8, 0x58, 0x2e, 0x64, 0x14, 0x82, 0x58, 0xd4, 0x0b, 0x97, 0x0b, 0xba, - 0x21, 0xc3, 0x53, 0x28, 0x0d, 0xb0, 0xba, 0x66, 0x14, 0x3e, 0x54, 0xc8, 0x6f, 0xac, 0x17, 0x32, - 0x7d, 0xea, 0xcf, 0xa7, 0x00, 0x56, 0x4c, 0x62, 0x73, 0xb5, 0xa6, 0xbf, 0x85, 0x72, 0x30, 0xdc, - 0xf4, 0xb0, 0x6b, 0x9b, 0x75, 0x61, 0xab, 0x82, 0x6f, 0xd2, 0xd6, 0x30, 0x3d, 0xef, 0xb6, 0xe3, - 0x56, 0x38, 0x77, 0xc1, 0x37, 0xda, 0x82, 0x23, 0xcc, 0xca, 0x1a, 0x65, 0xec, 0xfa, 0xd6, 0x4d, - 0xab, 0x6c, 0xfa, 0x81, 0xfe, 0xf5, 0x51, 0xfd, 0x3b, 0x17, 0xcb, 0x73, 0x9e, 0x52, 0xe5, 0x43, - 0x22, 0xae, 0x80, 0x87, 0xcb, 0xf1, 0x0d, 0xe8, 0x29, 0x98, 0x11, 0x87, 0x44, 0xd9, 0x94, 0x47, - 0xcb, 0x56, 0xe8, 0x9c, 0xa6, 0x79, 0x6b, 0xde, 0x94, 0x68, 0xd1, 0xe3, 0x80, 0xda, 0xe7, 0x97, - 0xc5, 0x94, 0x62, 0xb2, 0x6d, 0x28, 0x62, 0xda, 0x38, 0x3a, 0x59, 0xde, 0x9b, 0xcc, 0xb4, 0x31, - 0xc8, 0x55, 0xbc, 0xa3, 0x96, 0xe0, 0x70, 0xc2, 0xbc, 0xd1, 0x33, 0x90, 0xb5, 0x3c, 0xaf, 0x89, - 0x8d, 0x98, 0xe1, 0x98, 0x4e, 0xce, 0xd0, 0xf6, 0x36, 0x7a, 0xf5, 0xcf, 0xfa, 0x60, 0x4c, 0xab, - 0x54, 0x1c, 0xdb, 0xe3, 0x5d, 0x5d, 0x83, 0xa9, 0x2d, 0xdf, 0x6f, 0x18, 0x35, 0xc7, 0xac, 0x18, - 0x9b, 0x66, 0xcd, 0xb4, 0xcb, 0x44, 0x45, 0x15, 0x2a, 0xcd, 0x78, 0x23, 0x75, 0xc5, 0xf7, 0x1b, - 0xcb, 0x8e, 0x59, 0x99, 0x17, 0xd8, 0xfa, 0xe4, 0x56, 0x2b, 0x08, 0x6d, 0x43, 0x6e, 0xcb, 0x71, - 0xad, 0x37, 0x09, 0x61, 0xcd, 0x68, 0x38, 0x15, 0xc3, 0x6c, 0xfa, 0x8e, 0x57, 0x36, 0x6b, 0x62, - 0x07, 0x24, 0x1d, 0x0a, 0x57, 0x02, 0xb2, 0xa2, 0x53, 0xd1, 0x42, 0x22, 0x3d, 0xbb, 0x95, 0xd0, - 0x82, 0x0c, 0x98, 0xde, 0x6e, 0x6e, 0x62, 0xd7, 0xc6, 0x3e, 0xf6, 0x8c, 0x8a, 0xe9, 0x6d, 0x6d, - 0x3a, 0xa6, 0x5b, 0xe1, 0x3a, 0x71, 0x3a, 0x76, 0x98, 0xab, 0x01, 0xc1, 0x82, 0xc0, 0x9f, 0x4f, - 0x65, 0x15, 0x7d, 0x6a, 0xbb, 0xbd, 0x01, 0xbd, 0x0e, 0x87, 0x6c, 0xec, 0xdf, 0x76, 0xdc, 0x6d, - 0xa3, 0xe1, 0xd4, 0xac, 0xf2, 0x8e, 0xd0, 0xba, 0xfe, 0x0e, 0x23, 0xac, 0x32, 0x8a, 0x22, 0x25, - 0xe0, 0x1a, 0x37, 0x65, 0xb7, 0x03, 0xd1, 0x0a, 0x64, 0xca, 0x35, 0xa7, 0x59, 0x31, 0xdc, 0xa6, - 0x2d, 0x3a, 0x1e, 0xa2, 0x1d, 0x3f, 0x98, 0xa0, 0xce, 0x4e, 0xb3, 0xa2, 0x37, 0x6d, 0xde, 0x67, - 0xba, 0x1c, 0xf9, 0x56, 0xe7, 0x60, 0xb2, 0x6d, 0x89, 0xc8, 0xbe, 0xaa, 0x58, 0x1e, 0x31, 0x38, - 0x15, 0xae, 0x22, 0xc1, 0xb7, 0xfa, 0x34, 0x64, 0x93, 0x84, 0xde, 0x91, 0xee, 0x3c, 0x4c, 0xc5, - 0x48, 0xb1, 0x1b, 0x49, 0x8c, 0x58, 0x3a, 0x92, 0x7c, 0x2a, 0x05, 0xd3, 0x45, 0xd7, 0xba, 0x45, - 0xd4, 0x9f, 0xef, 0x3a, 0x46, 0xf4, 0x04, 0x4c, 0x73, 0x2b, 0xdb, 0x60, 0xcd, 0x86, 0xed, 0x54, - 0xb0, 0xc7, 0x3b, 0xe0, 0xf6, 0x9a, 0x53, 0x12, 0xab, 0xe7, 0xa1, 0xa7, 0xe1, 0x70, 0x0b, 0x05, - 0xb6, 0x2b, 0x0d, 0xc7, 0xb2, 0x7d, 0x6e, 0x93, 0x0f, 0x45, 0x88, 0x0a, 0xbc, 0x11, 0x3d, 0x09, - 0x33, 0x75, 0x6a, 0xbe, 0x0c, 0xab, 0x71, 0xeb, 0x29, 0xa3, 0x6c, 0x55, 0x5c, 0x63, 0xb3, 0xe6, - 0x94, 0xb7, 0xa9, 0x86, 0x8d, 0xe8, 0x53, 0xac, 0x75, 0xa9, 0x71, 0xeb, 0xa9, 0xbc, 0x55, 0x71, - 0xe7, 0x49, 0x13, 0x3a, 0x03, 0x99, 0xb6, 0x51, 0xfa, 0x29, 0xfa, 0x44, 0xa3, 0xa5, 0xff, 0x47, - 0x61, 0xa2, 0xd1, 0xdc, 0xac, 0x59, 0xe5, 0x10, 0x93, 0x79, 0x3a, 0x69, 0x06, 0x16, 0x88, 0xea, - 0xeb, 0x70, 0x84, 0x58, 0x50, 0x6c, 0xfb, 0x64, 0x3b, 0x3b, 0xee, 0xa2, 0xeb, 0x34, 0x1b, 0x62, - 0x2b, 0x67, 0x61, 0x88, 0x4d, 0x5f, 0xc8, 0x50, 0x7c, 0xa2, 0x87, 0x21, 0x4d, 0x8f, 0x2d, 0x72, - 0x0e, 0x55, 0x09, 0x09, 0x37, 0xad, 0xe3, 0x02, 0x4a, 0xfb, 0x51, 0xcf, 0x41, 0x3a, 0xaa, 0x5a, - 0x1d, 0xd7, 0xe5, 0x27, 0x0a, 0x9c, 0x08, 0x8d, 0x3a, 0xd1, 0x1f, 0x5c, 0xe1, 0x6b, 0xdb, 0x7d, - 0x46, 0x1f, 0x86, 0xd1, 0x50, 0x8a, 0x5e, 0x36, 0x45, 0xdd, 0x90, 0x17, 0x62, 0xb5, 0xbd, 0xf3, - 0x18, 0xb3, 0x81, 0xc0, 0x75, 0x28, 0x8b, 0xff, 0x7a, 0xb9, 0x15, 0x18, 0x09, 0x57, 0xe2, 0x14, - 0x75, 0x7e, 0x1b, 0x35, 0x73, 0xc7, 0x90, 0xce, 0x9c, 0x51, 0x0e, 0x5b, 0x25, 0xc7, 0x0e, 0xb1, - 0xc5, 0xe1, 0xaa, 0xa6, 0xb8, 0x2d, 0x16, 0x3d, 0xa8, 0x8f, 0x00, 0x2c, 0xe3, 0xaa, 0x59, 0xde, - 0xd1, 0x36, 0xcd, 0x72, 0x32, 0x5b, 0xea, 0xff, 0x56, 0x60, 0x3c, 0xa2, 0xdf, 0x68, 0x11, 0x86, - 0x1b, 0xae, 0x73, 0xcb, 0xaa, 0x60, 0x97, 0x22, 0xa7, 0x93, 0x5c, 0x54, 0x99, 0x6a, 0xb6, 0xc8, - 0x49, 0xf4, 0x80, 0x58, 0x1e, 0x34, 0x15, 0x1d, 0xf4, 0x09, 0x18, 0x2e, 0x86, 0x58, 0xd3, 0x45, - 0x7d, 0xed, 0xda, 0xd2, 0x42, 0x41, 0x6f, 0x39, 0xbc, 0x01, 0x06, 0xf3, 0xda, 0xf2, 0x52, 0x7e, - 0x2d, 0xa3, 0xa8, 0x73, 0x30, 0x35, 0x6f, 0xd9, 0xa6, 0xbb, 0x23, 0xa4, 0x4a, 0xa3, 0x9a, 0x0e, - 0x7c, 0xfd, 0x7d, 0x3f, 0xa0, 0xa5, 0xa2, 0x56, 0x23, 0xfe, 0x30, 0x41, 0xe5, 0xcc, 0x3d, 0x04, - 0xe9, 0xa6, 0x87, 0x0d, 0xab, 0x61, 0x98, 0x35, 0xcb, 0xf4, 0x82, 0xbd, 0x37, 0xd6, 0xf4, 0xf0, - 0x52, 0x43, 0x63, 0x30, 0xf4, 0x18, 0x4c, 0x96, 0x5d, 0x4c, 0xf6, 0x81, 0xd7, 0xdc, 0xe4, 0xf6, - 0x8f, 0xf3, 0x90, 0x61, 0x0d, 0xa5, 0x00, 0x4e, 0x63, 0x8c, 0xe0, 0x8b, 0x2d, 0x57, 0x1f, 0x8f, - 0x31, 0x02, 0x30, 0x5d, 0xb1, 0x59, 0x98, 0x14, 0x47, 0x74, 0xb0, 0x29, 0xd9, 0xfe, 0xa2, 0x66, - 0x7c, 0x82, 0x37, 0x8a, 0x3d, 0x89, 0x4e, 0x43, 0x9a, 0x98, 0x07, 0x09, 0x79, 0x20, 0x40, 0x1e, - 0x23, 0x2d, 0x01, 0xe6, 0x13, 0x80, 0x78, 0x3c, 0xe3, 0x49, 0xd8, 0x83, 0x01, 0x76, 0x46, 0xb4, - 0x06, 0x14, 0x2f, 0xc1, 0xb1, 0x30, 0xa6, 0x2c, 0x3b, 0x76, 0xc5, 0x74, 0x77, 0x0c, 0xd7, 0xb4, - 0xab, 0x98, 0x71, 0x30, 0x44, 0x39, 0x38, 0xc2, 0x71, 0x4a, 0x02, 0x45, 0x27, 0x18, 0x94, 0x19, - 0x0d, 0x8e, 0x07, 0x43, 0xc6, 0xf6, 0x30, 0x4c, 0x7b, 0xc8, 0x09, 0xa4, 0x98, 0x2e, 0x2e, 0xc2, - 0xe1, 0x36, 0x79, 0x70, 0x75, 0x1e, 0x89, 0xf8, 0x2c, 0x51, 0x2b, 0x35, 0x07, 0xd3, 0x51, 0xb1, - 0x70, 0x1a, 0x60, 0x5e, 0x8b, 0x2c, 0x18, 0x46, 0xf0, 0x41, 0xc8, 0xb6, 0x4b, 0x87, 0x13, 0x8d, - 0x52, 0xa2, 0x43, 0xad, 0xf2, 0x61, 0x84, 0x8f, 0xc3, 0x94, 0xdf, 0x68, 0xb6, 0xd1, 0xb0, 0x08, - 0x25, 0xe3, 0x37, 0x9a, 0x11, 0x74, 0xf5, 0xa3, 0x59, 0x18, 0xe2, 0xf6, 0x9e, 0x04, 0x5e, 0xd2, - 0xc6, 0xa5, 0xff, 0x27, 0x81, 0x57, 0x05, 0x7b, 0x65, 0xd7, 0x6a, 0x10, 0x85, 0xe4, 0x5b, 0x56, - 0x06, 0x91, 0x75, 0xb4, 0x6c, 0xcb, 0xb7, 0xcc, 0x1a, 0x3d, 0x18, 0x78, 0x64, 0x47, 0xb4, 0x69, - 0x80, 0xad, 0x23, 0x6f, 0x65, 0xd1, 0x21, 0x09, 0xf0, 0x16, 0x60, 0x94, 0x63, 0x4a, 0x87, 0xfb, - 0x03, 0x5d, 0x42, 0x4a, 0xda, 0x17, 0xd8, 0x61, 0x38, 0xfe, 0x32, 0x8c, 0xf2, 0xd3, 0x82, 0xc4, - 0xce, 0x54, 0xcd, 0x92, 0x7a, 0x09, 0x6d, 0x9b, 0x0e, 0xf5, 0xd0, 0x41, 0x7e, 0x94, 0x04, 0xa4, - 0xd5, 0xaa, 0x65, 0x57, 0x45, 0x8e, 0x82, 0xa9, 0x9f, 0x9e, 0xe6, 0xe0, 0x12, 0x83, 0x12, 0x8f, - 0x33, 0x8c, 0x2b, 0x02, 0x5c, 0xa6, 0x6e, 0x93, 0x61, 0x8b, 0x40, 0xcf, 0xc2, 0x90, 0xd8, 0x7f, - 0x4c, 0xa1, 0xc4, 0x27, 0x3a, 0x1b, 0xb7, 0x9b, 0x98, 0xde, 0xb4, 0xed, 0xa4, 0xcb, 0x30, 0x6e, - 0x52, 0x17, 0x52, 0xc8, 0x09, 0x28, 0x87, 0xa7, 0xe2, 0x23, 0x5a, 0xc9, 0xd9, 0xd4, 0xc7, 0x4c, - 0xd9, 0xf5, 0x3c, 0x01, 0x20, 0x19, 0x04, 0xa6, 0x3b, 0x12, 0x04, 0x5d, 0x02, 0x2a, 0x55, 0xa3, - 0xe1, 0x38, 0x35, 0x2f, 0x3b, 0x46, 0x8f, 0x88, 0xe3, 0x89, 0x8b, 0x51, 0x74, 0x9c, 0x9a, 0x3e, - 0x62, 0xf3, 0xff, 0x79, 0xe8, 0x18, 0x8c, 0x08, 0x6b, 0xe5, 0x65, 0xc7, 0x69, 0xc4, 0x1e, 0x02, - 0x24, 0x4f, 0x40, 0x72, 0x1c, 0xcd, 0x5a, 0x63, 0xcb, 0xcc, 0xa6, 0x65, 0x4f, 0x20, 0xf4, 0x6f, - 0x34, 0xd2, 0x88, 0xae, 0xc3, 0x84, 0x8b, 0x3d, 0xa7, 0xe9, 0x96, 0xb1, 0xc1, 0x13, 0x0f, 0x2c, - 0x84, 0x7e, 0x22, 0xc1, 0x53, 0xa3, 0xa2, 0x9b, 0xd5, 0x39, 0x8d, 0x9c, 0x7d, 0x48, 0xbb, 0x11, - 0x20, 0x31, 0x93, 0xb4, 0x47, 0xe3, 0xa6, 0x65, 0x57, 0xb1, 0xdb, 0x70, 0x89, 0x1b, 0x90, 0x61, - 0xbb, 0x83, 0x36, 0x5c, 0x0e, 0xe1, 0x44, 0xc7, 0x6a, 0xf4, 0x40, 0x32, 0xcc, 0x4d, 0xb3, 0x9c, - 0x45, 0x1d, 0x74, 0x2c, 0x3c, 0xb8, 0x74, 0xa8, 0x85, 0x87, 0xd8, 0x12, 0xa4, 0xa3, 0x2e, 0x6d, - 0x76, 0x8a, 0x76, 0xa2, 0x76, 0x3f, 0x9e, 0xf4, 0xf1, 0x88, 0x17, 0x8b, 0xae, 0xc3, 0x34, 0x3d, - 0x02, 0x84, 0x78, 0x45, 0x87, 0x2c, 0x25, 0xf0, 0x68, 0x6c, 0x87, 0xed, 0xa7, 0x89, 0x8e, 0xac, - 0x46, 0xdb, 0x09, 0xf3, 0x36, 0x9c, 0x92, 0xf6, 0x12, 0x73, 0x00, 0x0c, 0x3e, 0x7a, 0xa0, 0x7f, - 0x33, 0x74, 0x9c, 0x27, 0xf7, 0xe1, 0x3d, 0xe8, 0x27, 0xea, 0x9d, 0x3d, 0x98, 0x0d, 0x40, 0x75, - 0x12, 0x2c, 0x63, 0x9b, 0xe6, 0x3a, 0x38, 0x63, 0x87, 0x3b, 0x44, 0x47, 0x2b, 0x21, 0x3a, 0xe7, - 0x6b, 0xb2, 0xde, 0x0a, 0x42, 0xff, 0x0e, 0xa6, 0x37, 0xe9, 0x01, 0x1c, 0xb0, 0x45, 0x99, 0xce, - 0x66, 0x3b, 0x84, 0x13, 0x31, 0x27, 0xb6, 0x3e, 0xb5, 0x19, 0x73, 0x8c, 0x2f, 0xc1, 0xa8, 0x1c, - 0x6b, 0xe5, 0x3a, 0xac, 0x02, 0xd7, 0x4f, 0x39, 0xca, 0x92, 0x69, 0x65, 0x25, 0xe1, 0xb2, 0x3e, - 0xda, 0x5d, 0x49, 0xb8, 0x68, 0x85, 0x92, 0x70, 0x49, 0x62, 0x38, 0x5a, 0xc1, 0x37, 0xcd, 0x66, - 0xcd, 0x37, 0xea, 0xe6, 0x1d, 0x12, 0x11, 0xd2, 0xf5, 0xf3, 0x7c, 0x97, 0x48, 0x27, 0x7b, 0xa2, - 0xa3, 0x48, 0xef, 0x14, 0x9d, 0x0a, 0x59, 0x12, 0x8e, 0xad, 0x67, 0x79, 0x57, 0x6d, 0x2d, 0xc8, - 0x81, 0x63, 0xc1, 0x06, 0x6d, 0x7a, 0x66, 0x15, 0x1b, 0xf8, 0x4e, 0xc3, 0x71, 0x7d, 0x31, 0xff, - 0x53, 0x74, 0x9c, 0xd9, 0xd8, 0x71, 0xc4, 0x2e, 0xdd, 0x20, 0x74, 0x05, 0x4a, 0xc6, 0x79, 0x39, - 0xe2, 0x26, 0x35, 0x21, 0x1b, 0x8e, 0x9a, 0xb2, 0x4b, 0xce, 0x1c, 0xec, 0x40, 0x37, 0xd5, 0x0e, - 0xe3, 0x25, 0xba, 0xf2, 0xfa, 0x11, 0x33, 0xd1, 0xcb, 0x37, 0x60, 0x46, 0x84, 0x15, 0x41, 0x8a, - 0x82, 0x0d, 0xf5, 0x30, 0x1d, 0xea, 0x4c, 0xec, 0x50, 0x71, 0x01, 0x94, 0x3e, 0xdd, 0x88, 0x0b, - 0xab, 0x3e, 0x04, 0x53, 0x15, 0xd3, 0x37, 0x37, 0x4d, 0x8f, 0x04, 0x2e, 0x65, 0x77, 0x87, 0x1d, - 0xb0, 0x8f, 0x74, 0x50, 0xa3, 0x05, 0x8e, 0x5f, 0x08, 0xd0, 0x75, 0x54, 0x69, 0x83, 0x21, 0x0c, - 0xd9, 0x5b, 0xd8, 0x25, 0x4c, 0xb5, 0x67, 0x04, 0x1e, 0xed, 0x90, 0x3e, 0xbc, 0xc6, 0x89, 0x5a, - 0xf2, 0x01, 0x33, 0xb7, 0x62, 0xe1, 0xe8, 0x28, 0x8c, 0x78, 0xb8, 0x76, 0xd3, 0xa8, 0x59, 0xf6, - 0x36, 0xcf, 0xd7, 0x0c, 0x13, 0xc0, 0xb2, 0x65, 0x6f, 0xa3, 0x19, 0xe8, 0x7f, 0xd3, 0xb1, 0x79, - 0x56, 0x86, 0x1e, 0xdd, 0xf4, 0x9b, 0x44, 0x3a, 0x41, 0xec, 0xc5, 0x52, 0x31, 0xc1, 0x37, 0x39, - 0x2c, 0x84, 0x23, 0x21, 0x44, 0x7e, 0x0b, 0xbb, 0x1e, 0x91, 0x4a, 0x95, 0x79, 0x3c, 0xbc, 0x99, - 0x0b, 0xf2, 0x1a, 0x6b, 0xa4, 0x59, 0xa4, 0xa6, 0xeb, 0x62, 0x9b, 0xa8, 0x7c, 0x84, 0x6c, 0x8b, - 0x7b, 0x64, 0xac, 0x95, 0xd9, 0xa8, 0x90, 0x4a, 0xc0, 0x99, 0xdb, 0x22, 0x68, 0xac, 0x60, 0xc6, - 0x88, 0xb7, 0x93, 0x63, 0x4f, 0x50, 0x3d, 0x00, 0xa3, 0xdc, 0xc9, 0xf6, 0xad, 0x3a, 0xce, 0xbe, - 0xc1, 0x4e, 0x53, 0x06, 0x5a, 0xb7, 0xea, 0x18, 0x3d, 0x0f, 0x83, 0x9e, 0x6f, 0xfa, 0x4d, 0x2f, - 0xbb, 0x4d, 0xc3, 0x90, 0x07, 0x3b, 0x1e, 0x58, 0x25, 0x8a, 0xaa, 0x73, 0x12, 0x1a, 0x40, 0xd2, - 0xff, 0x19, 0x75, 0xec, 0x91, 0x2d, 0x90, 0xad, 0xf1, 0x00, 0x92, 0x42, 0x57, 0x18, 0x90, 0xb8, - 0x78, 0x2d, 0xce, 0xa4, 0x67, 0xbd, 0x89, 0xb3, 0x75, 0x9a, 0x4c, 0xcf, 0xc8, 0xbe, 0x64, 0xc9, - 0x7a, 0x13, 0xa3, 0x73, 0xb1, 0x8e, 0xb6, 0xcd, 0x8e, 0xbc, 0x36, 0x27, 0xfb, 0x02, 0x4c, 0x05, - 0x39, 0x67, 0xba, 0xc7, 0x8c, 0xa6, 0x5b, 0xf3, 0xb2, 0x0e, 0x39, 0xda, 0xa9, 0x58, 0x26, 0x45, - 0x33, 0xdd, 0x2f, 0x1b, 0x6e, 0xcd, 0x23, 0x2e, 0x60, 0x44, 0x96, 0xcc, 0x05, 0x6c, 0x84, 0x2e, - 0xa0, 0x24, 0x49, 0xe6, 0x02, 0x3e, 0x00, 0xa3, 0xf8, 0x4e, 0xc3, 0x72, 0xb9, 0x1c, 0x3f, 0xc2, - 0xe4, 0xc8, 0x40, 0x54, 0x8e, 0x39, 0x18, 0x16, 0x67, 0x54, 0xd6, 0x65, 0x8a, 0x22, 0xbe, 0x49, - 0x14, 0xc9, 0xbd, 0x0a, 0xbf, 0xd1, 0xcc, 0x7a, 0xd4, 0x91, 0x18, 0x61, 0x90, 0xf5, 0x46, 0x33, - 0xc9, 0x03, 0xf6, 0xe3, 0x3d, 0x60, 0xb4, 0x00, 0x40, 0xbc, 0x7c, 0x8b, 0xb9, 0x30, 0xb7, 0xa8, - 0x9b, 0xf1, 0x50, 0x7c, 0x7e, 0x9d, 0xae, 0x42, 0x5e, 0x20, 0xeb, 0x12, 0x5d, 0x4e, 0x83, 0xa9, - 0x18, 0xef, 0xa3, 0xa7, 0xbc, 0xf8, 0x6d, 0x18, 0x64, 0x23, 0xa0, 0x19, 0x40, 0xa5, 0x75, 0x6d, - 0x7d, 0xa3, 0xd4, 0x12, 0x5c, 0x66, 0x60, 0x8c, 0x86, 0x9d, 0xa5, 0xa5, 0xb5, 0xd5, 0xa5, 0xd5, - 0xc5, 0x8c, 0x82, 0x46, 0x61, 0x48, 0xdf, 0x58, 0xa5, 0x1f, 0x29, 0x34, 0x01, 0xa3, 0x7a, 0x21, - 0xbf, 0xb6, 0x9a, 0x5f, 0x5a, 0x26, 0x80, 0x3e, 0x34, 0x06, 0xc3, 0xa5, 0xf5, 0xb5, 0x62, 0x91, - 0x7c, 0xf5, 0xa3, 0x11, 0x18, 0x28, 0xe8, 0xfa, 0x9a, 0x9e, 0x19, 0x20, 0x0d, 0x0b, 0x85, 0x45, - 0x5d, 0x5b, 0x28, 0x2c, 0x64, 0x06, 0xd5, 0x8f, 0x8e, 0xc2, 0x38, 0xd7, 0xc8, 0x8d, 0x46, 0xc5, - 0xf4, 0x31, 0x7a, 0x02, 0xa6, 0x2b, 0xd8, 0xb3, 0x5c, 0xe2, 0x05, 0xc8, 0x9b, 0x83, 0x25, 0x56, - 0x10, 0x6f, 0x93, 0x37, 0xc6, 0x25, 0xc8, 0x09, 0x8a, 0x18, 0x57, 0x99, 0xa5, 0x59, 0xb2, 0x1c, - 0x63, 0xa5, 0xcd, 0x63, 0xde, 0x80, 0x43, 0x82, 0x3a, 0xea, 0xf3, 0x0e, 0xee, 0xd5, 0xe7, 0x9d, - 0xe2, 0xf4, 0x91, 0xac, 0xeb, 0x5c, 0x0b, 0x1b, 0xc4, 0xc5, 0x35, 0xac, 0x8a, 0xf0, 0xdc, 0x25, - 0x36, 0x88, 0x33, 0xbb, 0x54, 0x21, 0x5b, 0x45, 0x10, 0x48, 0xd7, 0x61, 0xcc, 0x89, 0xcf, 0xf0, - 0x96, 0xa5, 0xe0, 0x56, 0xac, 0x4a, 0xce, 0x5a, 0x86, 0x1d, 0x67, 0xca, 0x67, 0x7b, 0x33, 0xe5, - 0x47, 0x78, 0x5f, 0xed, 0x4d, 0x68, 0x1b, 0x8e, 0xb7, 0xf3, 0x21, 0x9b, 0xf5, 0x91, 0x4e, 0xf9, - 0x51, 0xce, 0x9e, 0x6c, 0xd3, 0x73, 0x2d, 0xac, 0xcb, 0x76, 0xfd, 0x31, 0x10, 0x82, 0x31, 0x42, - 0xcf, 0x1e, 0xa8, 0x67, 0x2f, 0x44, 0xb0, 0x1c, 0x38, 0xf8, 0x9f, 0x53, 0xe0, 0x4c, 0xb0, 0xee, - 0x5d, 0x3d, 0xc8, 0xb1, 0xfd, 0x7b, 0x90, 0x0f, 0x0b, 0xdd, 0xe9, 0xec, 0x48, 0x4a, 0x4b, 0x22, - 0xce, 0x10, 0x59, 0x4e, 0x13, 0xbd, 0x39, 0x69, 0x62, 0x49, 0xda, 0x9b, 0xd0, 0x1b, 0x70, 0x4c, - 0x0c, 0x14, 0xeb, 0x62, 0x66, 0x7a, 0x74, 0x31, 0xc5, 0x8a, 0xc4, 0x25, 0x8c, 0x9e, 0x86, 0xc3, - 0xe1, 0x8a, 0x44, 0xe3, 0xd5, 0x29, 0x76, 0x30, 0x06, 0xeb, 0x12, 0x09, 0x5b, 0xdf, 0x86, 0x87, - 0x04, 0x5d, 0x47, 0x67, 0xed, 0xd0, 0xbe, 0x9c, 0xb5, 0x93, 0xbc, 0xef, 0x44, 0x0c, 0xe4, 0x83, - 0xc0, 0x31, 0x12, 0x1d, 0x92, 0x99, 0xde, 0x1d, 0x12, 0xb1, 0x17, 0xe2, 0x9b, 0x65, 0xae, 0x2d, - 0xdb, 0x77, 0x4d, 0x6e, 0xc1, 0x2c, 0xcf, 0xda, 0xb4, 0x6a, 0x96, 0x1f, 0xdc, 0x29, 0xe4, 0x3a, - 0x70, 0xbd, 0x44, 0x08, 0xa9, 0x79, 0x0b, 0xc8, 0x5a, 0xb8, 0x4e, 0xc4, 0x20, 0xee, 0x48, 0xcb, - 0x8e, 0x10, 0xd6, 0x93, 0x5f, 0x6a, 0x45, 0x34, 0x99, 0xdb, 0x4f, 0xf5, 0x4b, 0xc3, 0x30, 0xb2, - 0xd6, 0xc0, 0x2e, 0x5b, 0xf1, 0xb8, 0x4c, 0x8c, 0x70, 0xa9, 0x52, 0x2d, 0x2e, 0xd5, 0x2b, 0x90, - 0x76, 0x04, 0x21, 0xb3, 0x57, 0x7d, 0x1d, 0x3c, 0x8f, 0x60, 0x8c, 0x59, 0x62, 0xc2, 0xf4, 0xf1, - 0x80, 0x94, 0x5a, 0xb4, 0x17, 0x02, 0xef, 0xa5, 0xbf, 0xc3, 0xdd, 0x66, 0xd8, 0x47, 0x8b, 0xff, - 0x32, 0x03, 0x83, 0x15, 0xec, 0x9b, 0x56, 0x8d, 0x9b, 0x4c, 0xfe, 0x15, 0xe3, 0xd7, 0x0c, 0xc4, - 0xf9, 0x35, 0x11, 0x8f, 0x72, 0xb0, 0xc5, 0xa3, 0x7c, 0x00, 0x46, 0x7d, 0xd3, 0xad, 0x62, 0x9f, - 0x35, 0x33, 0x13, 0x0e, 0x0c, 0x44, 0x11, 0x64, 0x8f, 0x61, 0xa4, 0xdd, 0x63, 0xf0, 0x7c, 0xd3, - 0xf5, 0x99, 0xb7, 0xc1, 0x92, 0x6e, 0x23, 0x14, 0x42, 0x9d, 0x8d, 0x23, 0xd4, 0x2b, 0x65, 0x8d, - 0x2c, 0x41, 0x32, 0x84, 0xed, 0x0a, 0x6d, 0x2a, 0x01, 0x92, 0xfc, 0x7f, 0xe1, 0x25, 0x8c, 0xf7, - 0xe0, 0x25, 0x88, 0x8c, 0x4f, 0x00, 0xf1, 0xd0, 0x06, 0x73, 0xe0, 0xa8, 0x19, 0x97, 0x7a, 0x4d, - 0xf7, 0xd0, 0x2b, 0x12, 0x1d, 0x84, 0xdd, 0xaa, 0x7a, 0x57, 0x07, 0x62, 0x14, 0x86, 0x8a, 0x85, - 0xd5, 0x85, 0x18, 0xdf, 0x61, 0x18, 0xfa, 0x17, 0xd6, 0x56, 0x0b, 0xcc, 0x69, 0xd0, 0xe6, 0xd7, - 0xf4, 0x75, 0xea, 0x34, 0xa8, 0xff, 0x9a, 0x82, 0x7e, 0xaa, 0x1a, 0xd3, 0x90, 0x59, 0xbf, 0x5e, - 0x2c, 0xb4, 0x74, 0x88, 0x20, 0x9d, 0xd7, 0x0b, 0xda, 0x7a, 0xc1, 0xc8, 0x2f, 0x6f, 0x94, 0xd6, - 0x0b, 0x7a, 0x46, 0x21, 0xb0, 0x85, 0xc2, 0x72, 0x41, 0x82, 0xa5, 0x08, 0x6c, 0xa3, 0x48, 0x1d, - 0x0e, 0x63, 0x45, 0xa3, 0xb0, 0x3e, 0x34, 0x09, 0xe3, 0x02, 0xb6, 0xba, 0xb6, 0x50, 0x28, 0x65, - 0xfa, 0x09, 0x9a, 0x5e, 0x28, 0x6a, 0x4b, 0x7a, 0x40, 0x3a, 0xc0, 0x48, 0x17, 0xe4, 0x21, 0x06, - 0xc9, 0x64, 0xf8, 0xb0, 0x84, 0xd2, 0x28, 0xae, 0xad, 0x2d, 0x67, 0x86, 0x08, 0x94, 0x0f, 0x1c, - 0x42, 0x87, 0xd1, 0x31, 0xc8, 0x96, 0x0a, 0xeb, 0x21, 0xc8, 0x58, 0xd1, 0x56, 0xb5, 0xc5, 0xc2, - 0x4a, 0x61, 0x75, 0x3d, 0x33, 0x82, 0x0e, 0xc1, 0xa4, 0xb6, 0xb1, 0xbe, 0x66, 0xf0, 0x61, 0xd9, - 0x44, 0x80, 0x08, 0x90, 0x82, 0xa3, 0x13, 0x1c, 0x45, 0x69, 0x00, 0xd2, 0xd9, 0xb2, 0x36, 0x5f, - 0x58, 0x2e, 0x65, 0xc6, 0xd0, 0x14, 0x4c, 0x90, 0x6f, 0xc6, 0x93, 0xa1, 0x6d, 0xac, 0x5f, 0xc9, - 0x8c, 0x53, 0xe9, 0x47, 0x46, 0x2c, 0x2d, 0xdd, 0x28, 0x64, 0xd2, 0x01, 0xbc, 0xb0, 0xfe, 0xda, - 0x9a, 0x7e, 0xd5, 0x28, 0xae, 0x2d, 0x2f, 0xe5, 0xaf, 0x67, 0x26, 0x50, 0x0e, 0x66, 0x58, 0x27, - 0x4b, 0xab, 0xeb, 0x85, 0x55, 0x6d, 0x35, 0x5f, 0x10, 0x6d, 0x19, 0xf5, 0x6b, 0x0a, 0x4c, 0xe7, - 0x69, 0x78, 0xc1, 0x0f, 0x21, 0x1d, 0x7f, 0xa4, 0x89, 0x3d, 0x1f, 0x9d, 0x02, 0x68, 0xb8, 0xce, - 0x1b, 0xb8, 0xec, 0x13, 0x8f, 0x46, 0x09, 0x8c, 0xc2, 0x08, 0x87, 0x2e, 0x55, 0x12, 0x2d, 0xc6, - 0xf3, 0x30, 0xc4, 0x75, 0x92, 0x5f, 0xdd, 0x1e, 0xeb, 0x74, 0x20, 0xce, 0xf7, 0xfd, 0xa9, 0x96, - 0xd2, 0x05, 0x05, 0xd9, 0xe3, 0x0d, 0x93, 0x38, 0xf3, 0x7c, 0x0f, 0xf3, 0x2f, 0xf5, 0x13, 0x0a, - 0x4c, 0x2e, 0x62, 0xff, 0xde, 0xcd, 0xf2, 0x14, 0x40, 0x90, 0x2b, 0x65, 0x77, 0xcc, 0x9c, 0x54, - 0x24, 0x4a, 0x2b, 0x81, 0x99, 0x1c, 0x08, 0xcd, 0xa4, 0xfa, 0x3d, 0x05, 0xa6, 0x99, 0x17, 0x7b, - 0x5f, 0xa7, 0xf2, 0x12, 0x0c, 0x36, 0xe9, 0xa8, 0x3c, 0x9d, 0xad, 0x76, 0x12, 0x29, 0x9b, 0x1f, - 0x13, 0x2c, 0x27, 0x8b, 0xe5, 0xe5, 0x9f, 0x15, 0x38, 0xc4, 0x70, 0x83, 0xd4, 0xeb, 0x7d, 0x61, - 0xe6, 0x21, 0x18, 0x8b, 0xf8, 0xcb, 0xe1, 0x7d, 0x0f, 0xd8, 0xa1, 0xb3, 0xfc, 0x08, 0xc7, 0x12, - 0xc7, 0x1b, 0xbb, 0xe8, 0xa1, 0x4c, 0xd1, 0xfc, 0xbe, 0x08, 0x0d, 0xd4, 0x48, 0x6d, 0xd9, 0x60, - 0x88, 0x25, 0x15, 0x98, 0x09, 0xee, 0x87, 0x25, 0xee, 0xdf, 0x49, 0xc1, 0xf1, 0x12, 0xf6, 0xe3, - 0xfc, 0xd7, 0xf7, 0x91, 0x14, 0xd6, 0xa2, 0x69, 0xc0, 0x81, 0xde, 0x3c, 0x71, 0x2e, 0x2e, 0x39, - 0x19, 0x28, 0x44, 0x31, 0x28, 0x89, 0xe2, 0x57, 0x15, 0xc8, 0x96, 0xb0, 0x1f, 0xf5, 0xef, 0xee, - 0x8f, 0x14, 0xce, 0xb5, 0x5f, 0x92, 0xf4, 0x87, 0x4b, 0xd8, 0x7a, 0x53, 0x12, 0xa7, 0xc5, 0xbf, - 0xa1, 0xc0, 0xd1, 0x12, 0xf6, 0xdb, 0xa2, 0xbe, 0xfb, 0x33, 0xff, 0x0b, 0xb1, 0x77, 0x37, 0x12, - 0x0b, 0x31, 0x17, 0x38, 0x71, 0x4b, 0xf0, 0x87, 0x0a, 0xcc, 0x94, 0xb0, 0x1f, 0x09, 0x3a, 0xef, - 0x0b, 0x03, 0x57, 0x5b, 0xef, 0x81, 0xfa, 0xf7, 0x18, 0x13, 0x33, 0xf6, 0xa2, 0x97, 0x41, 0x71, - 0x9c, 0x7d, 0x53, 0x81, 0x29, 0xaa, 0x5c, 0x3c, 0xa8, 0xbb, 0x3f, 0x6c, 0x9d, 0x92, 0x2f, 0x8e, - 0xfa, 0x69, 0x76, 0x89, 0x19, 0x85, 0xf0, 0xf6, 0x28, 0x6e, 0xb2, 0xbf, 0xa0, 0xc0, 0x14, 0x33, - 0x89, 0xcc, 0x7f, 0xbe, 0x3f, 0x93, 0x3d, 0x0b, 0xe9, 0x16, 0x5f, 0x5e, 0x52, 0xa0, 0xf1, 0x7a, - 0x24, 0xb1, 0x28, 0x66, 0x3d, 0x24, 0xcd, 0xfa, 0xaf, 0x52, 0x30, 0x4d, 0xb6, 0x40, 0x78, 0x0f, - 0x79, 0x5f, 0xa6, 0xbd, 0x02, 0x83, 0x66, 0xd9, 0x17, 0xd3, 0x4d, 0x27, 0xdc, 0x9e, 0xc5, 0x4d, - 0x6c, 0x56, 0xa3, 0x74, 0xfc, 0x88, 0x62, 0x9d, 0xa0, 0x4b, 0xc1, 0x19, 0xb7, 0xb7, 0xcb, 0xd6, - 0xf8, 0x03, 0x4e, 0x96, 0x4b, 0x11, 0x06, 0xd9, 0x40, 0xc4, 0x19, 0xdd, 0x58, 0xbd, 0xba, 0xba, - 0xf6, 0xda, 0x2a, 0xcb, 0x73, 0x11, 0x87, 0xa8, 0xa8, 0x95, 0x4a, 0xaf, 0xad, 0xe9, 0x0b, 0x19, - 0x85, 0xb8, 0x69, 0x8b, 0x85, 0xd5, 0x82, 0x4e, 0x5c, 0xbe, 0x00, 0x9c, 0x12, 0x88, 0x1b, 0xa5, - 0x82, 0xbe, 0xaa, 0xad, 0x14, 0x32, 0x7d, 0xea, 0x3b, 0x0a, 0x4c, 0x2f, 0xe0, 0x1a, 0xbe, 0xcf, - 0xc7, 0xbf, 0x60, 0xae, 0x5f, 0x62, 0x6e, 0x0b, 0xa6, 0x96, 0x2d, 0x4f, 0x78, 0x44, 0xf7, 0x62, - 0x5b, 0x85, 0xbe, 0x57, 0x7f, 0xc4, 0xf7, 0x6a, 0xc2, 0x74, 0x74, 0x24, 0xaf, 0xe1, 0xd8, 0x1e, - 0x46, 0xcf, 0xc0, 0x30, 0x9f, 0xa2, 0x97, 0x55, 0x68, 0x70, 0xd1, 0xd1, 0xd3, 0xd3, 0x03, 0x6c, - 0xf4, 0x20, 0x8c, 0xd7, 0x2d, 0xcf, 0x23, 0x26, 0x93, 0x8c, 0xcc, 0x4a, 0x87, 0x46, 0xf4, 0x31, - 0x0e, 0xbc, 0x41, 0x60, 0xea, 0x67, 0x14, 0x98, 0x5a, 0xc4, 0x7e, 0x10, 0x0e, 0xde, 0x03, 0x0e, - 0x1f, 0x86, 0xb1, 0x30, 0x98, 0x8d, 0x08, 0x7b, 0x34, 0x80, 0x27, 0x38, 0x7e, 0x6f, 0xc0, 0x21, - 0x22, 0x84, 0x60, 0x36, 0xef, 0xa5, 0xc0, 0x3f, 0xaf, 0xc0, 0x4c, 0xde, 0xb4, 0xcb, 0xb8, 0xf6, - 0x33, 0x64, 0x5e, 0xd6, 0xb5, 0xbb, 0x30, 0xd3, 0xca, 0x3c, 0xd7, 0x81, 0x17, 0x01, 0x02, 0x62, - 0xa1, 0x05, 0x27, 0x3a, 0x87, 0xf5, 0xba, 0x44, 0xb1, 0x37, 0x4d, 0xa8, 0xc2, 0xcc, 0x22, 0xf6, - 0xc9, 0xf1, 0x19, 0xdc, 0x7a, 0x1d, 0x5c, 0x1c, 0x71, 0x7c, 0x7e, 0x3c, 0x05, 0x63, 0xf2, 0x30, - 0x2c, 0x37, 0xc6, 0xee, 0x3b, 0x5b, 0x2f, 0x8d, 0x14, 0x91, 0x1b, 0xa3, 0xcd, 0x2d, 0x97, 0x46, - 0xb3, 0x30, 0x75, 0xcb, 0xac, 0x59, 0xd1, 0xfc, 0xb6, 0x78, 0x8e, 0x31, 0x49, 0x9b, 0xa4, 0xf4, - 0xb6, 0xc7, 0x32, 0xc3, 0x6c, 0x1c, 0xc9, 0x99, 0xed, 0x17, 0x99, 0x61, 0xda, 0x12, 0x66, 0x86, - 0xcf, 0x02, 0xeb, 0x42, 0xc2, 0xf5, 0xb2, 0x03, 0xb4, 0xef, 0x09, 0xda, 0x10, 0xa0, 0x7a, 0xe8, - 0x02, 0x1c, 0x62, 0xb8, 0xd1, 0x13, 0x86, 0x3d, 0xb5, 0x18, 0xd1, 0xd9, 0x34, 0x23, 0xc9, 0x22, - 0x4f, 0xfd, 0x5d, 0x05, 0x0e, 0xb1, 0xa8, 0xf0, 0xfe, 0x06, 0x06, 0x2f, 0xc1, 0x48, 0xe0, 0x12, - 0x73, 0x3f, 0xa4, 0x73, 0xa9, 0x08, 0x3b, 0x02, 0x86, 0x85, 0xbf, 0x2c, 0x6d, 0xa8, 0xc1, 0xc8, - 0x86, 0xfa, 0xff, 0x0a, 0x1c, 0x62, 0x66, 0xfb, 0xfd, 0x18, 0xe9, 0xc4, 0x39, 0x22, 0x9f, 0x55, - 0x98, 0xd1, 0x15, 0xf3, 0xbd, 0x4f, 0x6e, 0x53, 0x52, 0xf8, 0xfd, 0xae, 0x02, 0x68, 0x31, 0x0c, - 0x96, 0xde, 0xef, 0xd2, 0xfb, 0xd6, 0x20, 0x0c, 0x8b, 0xb9, 0xc6, 0x66, 0x3b, 0x3f, 0x08, 0x83, - 0xdc, 0xdd, 0x4d, 0xed, 0xa9, 0x3c, 0x4c, 0xe7, 0xe8, 0x64, 0xa3, 0x26, 0x95, 0xa3, 0xc5, 0x94, - 0xa2, 0x75, 0xbc, 0xc4, 0xce, 0xc2, 0x90, 0xb0, 0x25, 0xec, 0x75, 0x81, 0xf8, 0x24, 0xd6, 0x23, - 0xee, 0x92, 0xf4, 0x26, 0xb3, 0x1e, 0xed, 0x17, 0xa4, 0x97, 0x82, 0xbc, 0x6a, 0x95, 0x3a, 0x62, - 0x0f, 0x75, 0xdc, 0x34, 0xdd, 0xaf, 0x85, 0xb7, 0xe2, 0xd2, 0xa7, 0xaf, 0x44, 0x23, 0xd1, 0xfe, - 0x1e, 0xef, 0x84, 0x22, 0x41, 0x68, 0x1e, 0xa0, 0x6e, 0xda, 0x66, 0x15, 0xd7, 0x85, 0xaa, 0x25, - 0x55, 0xc9, 0x93, 0xae, 0x56, 0x02, 0x54, 0x5d, 0x22, 0x43, 0xd7, 0x60, 0x2a, 0xae, 0x06, 0x65, - 0xb0, 0xa7, 0x1a, 0x94, 0xc9, 0x7a, 0x5b, 0xf1, 0x49, 0xf4, 0xc6, 0xd6, 0xda, 0xdf, 0x8d, 0x2d, - 0x7a, 0x0c, 0x50, 0xc3, 0xa9, 0xb4, 0x5e, 0xa2, 0xb3, 0x17, 0x69, 0x13, 0x0d, 0xa7, 0x22, 0xdf, - 0xa1, 0xab, 0x1f, 0x55, 0x0e, 0x7a, 0x39, 0x3b, 0x03, 0x88, 0x7f, 0x18, 0xaf, 0x2d, 0xad, 0x5f, - 0x31, 0xd8, 0x55, 0x6c, 0x5f, 0xeb, 0xa5, 0x6d, 0x7f, 0xe4, 0xd2, 0x76, 0x20, 0xbc, 0xb4, 0x1d, - 0x54, 0xbf, 0xa6, 0x40, 0x3a, 0x2a, 0x6d, 0x74, 0x0a, 0xc6, 0xc8, 0xaa, 0x19, 0xcd, 0x46, 0xd5, - 0x35, 0x2b, 0xe2, 0x55, 0x0a, 0x5d, 0xc9, 0x0d, 0x06, 0x42, 0x0f, 0x30, 0xad, 0x30, 0x5c, 0xdc, - 0x30, 0x2d, 0x97, 0x17, 0x04, 0x03, 0x01, 0xe9, 0x14, 0x82, 0x8a, 0x30, 0xc1, 0xc9, 0x0d, 0xa7, - 0x21, 0x6e, 0xfb, 0x92, 0xaf, 0xc9, 0xb4, 0xb0, 0xef, 0x35, 0x86, 0xae, 0xa7, 0x9b, 0x91, 0x6f, - 0xb5, 0x0e, 0xa8, 0x1d, 0x0b, 0x5d, 0x84, 0xc3, 0xf2, 0x5c, 0x0d, 0x29, 0x21, 0xcf, 0x36, 0xfe, - 0xb4, 0x34, 0xed, 0x52, 0x90, 0x9b, 0xef, 0x5a, 0x80, 0xaa, 0xbe, 0x0d, 0x93, 0x6d, 0xd5, 0x60, - 0xe8, 0x45, 0x18, 0xbc, 0x6d, 0xd9, 0x15, 0xe7, 0x76, 0xc7, 0x37, 0x36, 0x12, 0xdd, 0x6b, 0x14, - 0x5b, 0xe7, 0x54, 0xe8, 0x0c, 0x64, 0x82, 0x3b, 0x33, 0x61, 0x04, 0x58, 0x85, 0x74, 0x50, 0x99, - 0x28, 0xae, 0x6e, 0xbe, 0xdb, 0x17, 0x99, 0x00, 0xeb, 0x08, 0x55, 0x21, 0x5b, 0x31, 0xad, 0xda, - 0x8e, 0x21, 0x17, 0xb6, 0xf1, 0x29, 0xa5, 0x3a, 0x5c, 0x7a, 0x2d, 0x10, 0xa2, 0xb6, 0xee, 0xae, - 0x7c, 0x40, 0x9f, 0xa9, 0xc4, 0xb6, 0xa0, 0x0d, 0x32, 0xd3, 0x72, 0xd3, 0xa5, 0xf9, 0x0d, 0x3e, - 0x40, 0xa7, 0x17, 0x39, 0xba, 0x40, 0x26, 0xe2, 0x0d, 0x7a, 0x9f, 0x08, 0xfa, 0xe0, 0xdd, 0xde, - 0x81, 0x19, 0x79, 0xe6, 0xf8, 0x0e, 0x31, 0xfb, 0x41, 0xb0, 0x3e, 0x7a, 0x41, 0xdb, 0x9b, 0x40, - 0x65, 0x48, 0x21, 0xe8, 0x83, 0x95, 0x66, 0x1e, 0xaa, 0xc7, 0xb5, 0xe5, 0x2c, 0xc8, 0x25, 0x13, - 0xc5, 0x54, 0x54, 0x5c, 0x94, 0x2b, 0x2a, 0x92, 0x4e, 0x8a, 0x90, 0x59, 0xa9, 0xe4, 0x62, 0x7e, - 0x18, 0x06, 0x59, 0xad, 0xa1, 0xfa, 0x36, 0x40, 0x88, 0x82, 0x9e, 0x8d, 0xdc, 0x17, 0x31, 0x0d, - 0xca, 0x89, 0x7e, 0xc5, 0x7b, 0x61, 0xda, 0x27, 0x7d, 0x2f, 0x2c, 0xdf, 0x25, 0x5d, 0x94, 0xee, - 0x92, 0x52, 0x5d, 0x09, 0xc5, 0x3d, 0x93, 0x6a, 0xc3, 0x54, 0xcc, 0xc2, 0x90, 0x63, 0x30, 0xa2, - 0xc6, 0x5d, 0x99, 0x13, 0xfa, 0x7b, 0x02, 0x80, 0xad, 0x28, 0xb6, 0xcb, 0xa2, 0xd6, 0x44, 0x82, - 0xa8, 0x25, 0x98, 0x89, 0xd7, 0xb4, 0x96, 0xbb, 0xb2, 0x54, 0xeb, 0x5d, 0x59, 0x0e, 0x86, 0x2b, - 0x4d, 0x16, 0x1c, 0xf0, 0x0d, 0x11, 0x7c, 0xab, 0xff, 0x21, 0x05, 0xc7, 0xa4, 0x8c, 0xad, 0x74, - 0x2c, 0xbc, 0x8f, 0xdc, 0x91, 0x2b, 0xfb, 0x3c, 0xda, 0x98, 0x2b, 0x2b, 0x9f, 0x6f, 0x71, 0x19, - 0x8d, 0x1f, 0xb1, 0x34, 0xa1, 0x10, 0x01, 0x39, 0x3c, 0xde, 0x4f, 0xcc, 0xab, 0xbc, 0xd8, 0x9b, - 0x79, 0x45, 0x03, 0xb4, 0x42, 0x8b, 0xa5, 0xdd, 0xec, 0xc0, 0x27, 0x8a, 0x63, 0xeb, 0x97, 0x15, - 0x38, 0xa1, 0x3b, 0xb5, 0xda, 0xa6, 0x59, 0xde, 0x16, 0xbc, 0x71, 0x53, 0xfd, 0x7e, 0x77, 0x35, - 0x37, 0x58, 0x5e, 0x40, 0xf2, 0xd3, 0x79, 0x64, 0x1c, 0x2d, 0x7c, 0x57, 0x7a, 0x2b, 0x7c, 0x57, - 0x7f, 0x92, 0x02, 0x14, 0x53, 0x17, 0xf2, 0x32, 0x1c, 0xe3, 0xb5, 0x69, 0xb4, 0x6f, 0x72, 0xa4, - 0xd1, 0xb7, 0x45, 0xc4, 0x82, 0x89, 0x17, 0x9f, 0xc3, 0x7a, 0x8e, 0xe1, 0x90, 0x7e, 0xb5, 0x16, - 0x0c, 0x74, 0x55, 0xae, 0x7d, 0xb7, 0xea, 0x96, 0x2f, 0xde, 0x6d, 0xa9, 0x1d, 0x0b, 0x34, 0x96, - 0x09, 0xaa, 0x54, 0xed, 0x4e, 0x29, 0xd1, 0xc7, 0x15, 0x78, 0xb0, 0x75, 0x0e, 0x52, 0x0d, 0x11, - 0x0f, 0x5c, 0x3d, 0xee, 0x2c, 0x5e, 0x4c, 0x3c, 0xf1, 0x65, 0x7a, 0x21, 0x8d, 0x05, 0x4e, 0xac, - 0x9f, 0x34, 0xbb, 0x60, 0xa0, 0x17, 0x20, 0xd7, 0x36, 0x8b, 0x30, 0xfb, 0xcb, 0x02, 0xe3, 0x23, - 0xad, 0x18, 0x41, 0x42, 0x5a, 0xb5, 0xe1, 0x64, 0xb7, 0x49, 0xb4, 0xfd, 0xb0, 0x82, 0xb2, 0xa7, - 0x1f, 0x56, 0x48, 0xc5, 0xfd, 0xb0, 0x82, 0xba, 0x05, 0xe3, 0x11, 0xb1, 0xa2, 0x07, 0x61, 0x3c, - 0x58, 0x13, 0xe9, 0xb7, 0x1f, 0xc6, 0x04, 0x90, 0x06, 0xfd, 0x59, 0x18, 0xaa, 0x5b, 0xb6, 0x55, - 0x6f, 0xd6, 0x69, 0xb7, 0x7d, 0xba, 0xf8, 0xa4, 0x2d, 0xe6, 0x1d, 0xda, 0xd2, 0xc7, 0x5b, 0xd8, - 0xa7, 0xfa, 0x55, 0x05, 0xa6, 0xe2, 0x8a, 0xb0, 0x92, 0x9f, 0xf4, 0x3d, 0x04, 0xe9, 0xba, 0x65, - 0xcb, 0xb1, 0x0d, 0xfb, 0x91, 0x89, 0xb1, 0xba, 0x65, 0x87, 0x71, 0x0d, 0xc1, 0x32, 0xef, 0xb4, - 0x47, 0x40, 0x63, 0x75, 0xf3, 0x4e, 0x88, 0x75, 0x1a, 0x26, 0x22, 0x42, 0xc7, 0x6c, 0x5f, 0x0d, - 0xeb, 0xad, 0x60, 0xf5, 0xcf, 0x53, 0x90, 0x29, 0x61, 0x9f, 0x95, 0x36, 0xde, 0x9f, 0x1d, 0x5f, - 0x6d, 0x7f, 0x03, 0xc2, 0x3c, 0x8f, 0x67, 0x93, 0xb2, 0xd8, 0x91, 0xd9, 0xc5, 0x3d, 0x06, 0xe1, - 0x77, 0x56, 0x2d, 0x2f, 0x42, 0x9e, 0x88, 0x7b, 0x11, 0x22, 0x5d, 0x66, 0xb6, 0x3f, 0x0b, 0x89, - 0xb1, 0x90, 0xf7, 0xa2, 0x00, 0xf4, 0xeb, 0x0a, 0xbd, 0x25, 0x90, 0x5e, 0x92, 0xdc, 0x17, 0x41, - 0x1f, 0x0f, 0x75, 0x8d, 0xae, 0x3e, 0xbf, 0xf0, 0x17, 0x0a, 0x17, 0x67, 0x53, 0x7f, 0x85, 0x9c, - 0x72, 0xc4, 0x25, 0x58, 0x2a, 0xea, 0xfc, 0xc7, 0x5a, 0xee, 0x6f, 0x9e, 0x5d, 0x9a, 0x0c, 0x7a, - 0x1c, 0x90, 0x4b, 0x26, 0x81, 0x8d, 0xb2, 0x8b, 0x2b, 0xd8, 0x26, 0x11, 0xbe, 0x47, 0xd7, 0x66, - 0x58, 0x9f, 0x64, 0x2d, 0xf9, 0xb0, 0x41, 0xfd, 0x9c, 0x02, 0x47, 0xf2, 0x4e, 0xbd, 0x51, 0xc3, - 0x3e, 0xfe, 0x59, 0x4d, 0x5f, 0x3e, 0x5a, 0xb7, 0x61, 0xb2, 0xed, 0xf7, 0x48, 0xd0, 0x63, 0x30, - 0x29, 0xfd, 0x22, 0x09, 0xdf, 0xc2, 0x0a, 0xb5, 0x1d, 0x19, 0x53, 0xc6, 0x26, 0xdb, 0xf8, 0x0c, - 0xc8, 0x30, 0x66, 0xa0, 0x98, 0x72, 0x4d, 0x48, 0x70, 0x62, 0xa3, 0xd4, 0x3f, 0x52, 0xe0, 0x30, - 0x71, 0x4f, 0x22, 0xef, 0x8c, 0xee, 0x0b, 0xeb, 0xab, 0x6d, 0x0f, 0xa1, 0xfa, 0xf7, 0xfa, 0x10, - 0x8a, 0x5f, 0xb3, 0x45, 0x5f, 0x43, 0xc5, 0xa9, 0xe5, 0xdf, 0xf2, 0x9b, 0xe6, 0xb6, 0xb7, 0x41, - 0x9c, 0x43, 0x35, 0x86, 0x43, 0xe6, 0xfd, 0x84, 0x2c, 0x1e, 0x8e, 0xb0, 0x48, 0x5b, 0x19, 0x8f, - 0x6a, 0x0c, 0x8f, 0x8c, 0x38, 0x64, 0xf2, 0x46, 0xec, 0x3b, 0xa6, 0xfe, 0x5e, 0xde, 0x31, 0x89, - 0x4b, 0xe9, 0xb6, 0x88, 0x36, 0xee, 0xce, 0xe3, 0x9f, 0x14, 0x98, 0x68, 0xc9, 0x71, 0xa0, 0x17, - 0xa0, 0xbf, 0xec, 0xf0, 0x5c, 0x40, 0x3a, 0xe1, 0x9d, 0x4a, 0x0b, 0xcd, 0x6c, 0xde, 0xa9, 0x60, - 0x9d, 0x92, 0xd1, 0xb3, 0x8a, 0x67, 0x99, 0x98, 0x0e, 0x89, 0x4f, 0xf5, 0xb3, 0x0a, 0xf4, 0x13, - 0xc4, 0xb6, 0xbb, 0xba, 0xc5, 0x7c, 0xc1, 0x28, 0xad, 0xaf, 0xe5, 0xaf, 0xae, 0x6d, 0xac, 0x67, - 0x14, 0xf4, 0x00, 0x1c, 0x5d, 0xbc, 0x5a, 0x30, 0x4a, 0x05, 0xfd, 0xda, 0x52, 0xbe, 0x60, 0x68, - 0xf9, 0xfc, 0xda, 0xc6, 0xea, 0xba, 0xc1, 0x4a, 0xb3, 0x16, 0x58, 0x2a, 0x84, 0x90, 0xbc, 0xba, - 0xb1, 0xb6, 0xae, 0x19, 0x85, 0x0f, 0xe5, 0x0b, 0x85, 0x85, 0xc2, 0x42, 0xa6, 0x4f, 0x14, 0x53, - 0xcd, 0x5f, 0x37, 0xd6, 0x8a, 0x05, 0x5d, 0x5b, 0x5f, 0xd3, 0x33, 0xfd, 0xe8, 0x30, 0x4c, 0xe5, - 0x97, 0xd7, 0x36, 0x16, 0x8c, 0xab, 0x2b, 0x25, 0xe3, 0x6a, 0xe1, 0x3a, 0x4f, 0x9c, 0x0c, 0xa9, - 0x9f, 0x0e, 0x1f, 0x81, 0x87, 0xef, 0xe0, 0xc5, 0x33, 0x47, 0x25, 0xfa, 0xee, 0x32, 0xfa, 0x06, - 0x32, 0xd5, 0xf6, 0x06, 0xf2, 0xa5, 0xc0, 0x6b, 0x8b, 0x2d, 0x19, 0xa5, 0x32, 0x97, 0x7f, 0x4a, - 0xa6, 0xb5, 0xf4, 0x53, 0xbd, 0x08, 0x47, 0x92, 0x2b, 0x42, 0x93, 0x1f, 0x7c, 0xbf, 0x08, 0x93, - 0xed, 0x6f, 0xab, 0xce, 0xc0, 0x64, 0x90, 0x36, 0x6b, 0x60, 0x97, 0x4e, 0x86, 0xef, 0xfd, 0x34, - 0x4f, 0x86, 0x15, 0xb1, 0x4b, 0x46, 0x52, 0xff, 0x8f, 0x02, 0x28, 0xa6, 0x5e, 0x3c, 0x0f, 0x03, - 0x1e, 0x31, 0x7b, 0x94, 0xd3, 0x74, 0xc2, 0x0f, 0x80, 0xb4, 0xd3, 0x51, 0xb5, 0xc0, 0x3a, 0xa3, - 0x45, 0x47, 0x60, 0x78, 0x1b, 0x47, 0x9e, 0xf2, 0x0f, 0x6d, 0x63, 0xfa, 0x8c, 0x5f, 0xbd, 0x00, - 0x03, 0x14, 0x35, 0xaa, 0x09, 0xe3, 0x30, 0x52, 0x58, 0xcd, 0xeb, 0xd7, 0x8b, 0x64, 0x95, 0x15, - 0xf2, 0xb9, 0x50, 0x10, 0x9f, 0x29, 0xb2, 0x5c, 0xc7, 0x88, 0x1f, 0xbe, 0x41, 0x7f, 0xd7, 0x20, - 0x7c, 0x8a, 0x1e, 0x78, 0x13, 0x61, 0x66, 0x5b, 0x91, 0x33, 0xdb, 0x04, 0x7e, 0xd3, 0xaa, 0xf9, - 0xd8, 0xe5, 0xeb, 0xc6, 0xbf, 0xd0, 0x51, 0x18, 0x69, 0x98, 0x55, 0xcc, 0xd2, 0x76, 0xcc, 0xbb, - 0x19, 0x26, 0x00, 0xfa, 0xe6, 0xe5, 0x38, 0x00, 0x6d, 0xf4, 0x9d, 0x6d, 0x2c, 0x9e, 0x2d, 0x50, - 0xf4, 0x75, 0x02, 0x50, 0xbf, 0xa0, 0xc0, 0xf1, 0x84, 0xc9, 0xf0, 0xe0, 0x60, 0x11, 0x46, 0x43, - 0xfd, 0x10, 0xd1, 0x41, 0x7c, 0x39, 0x6c, 0x6b, 0x27, 0xba, 0x4c, 0x89, 0x1e, 0x81, 0x09, 0x1b, - 0xdf, 0xf1, 0x0d, 0x69, 0x3a, 0xfc, 0x57, 0x21, 0x08, 0xb8, 0x18, 0x4c, 0xe9, 0x2b, 0x29, 0x38, - 0xd1, 0xda, 0x53, 0xf4, 0xfd, 0x39, 0x61, 0x4a, 0x7a, 0xab, 0xce, 0xa4, 0x34, 0xe2, 0x06, 0x4f, - 0xd3, 0x55, 0x18, 0xb7, 0x1a, 0x2c, 0x95, 0x49, 0x81, 0x22, 0x57, 0x66, 0x35, 0xf2, 0x56, 0xc5, - 0x65, 0x5d, 0xe8, 0x41, 0x22, 0x9a, 0x15, 0x09, 0x3f, 0xb7, 0x27, 0x8e, 0xa2, 0xf3, 0x68, 0x49, - 0x4f, 0xab, 0xd5, 0x20, 0x35, 0x1a, 0x51, 0x07, 0x80, 0xc1, 0x8d, 0xd5, 0x8d, 0x12, 0xd5, 0x05, - 0x04, 0xe9, 0xa5, 0x55, 0x63, 0xa3, 0x14, 0x58, 0x85, 0x4c, 0x0a, 0x65, 0x61, 0x5a, 0xc0, 0xae, - 0x68, 0x7a, 0x41, 0x9b, 0x5f, 0x2e, 0x18, 0xc5, 0x35, 0x62, 0x07, 0x66, 0x00, 0xf1, 0x16, 0x56, - 0xaa, 0xb9, 0x40, 0xe1, 0xfd, 0xea, 0xbf, 0x28, 0x90, 0x69, 0x9d, 0x5a, 0xcb, 0xd6, 0x56, 0xda, - 0xb6, 0xb6, 0x64, 0x14, 0x52, 0x51, 0xa3, 0xd0, 0x26, 0xaf, 0xbe, 0x76, 0x79, 0x95, 0x61, 0x2a, - 0xfc, 0xa1, 0x00, 0xab, 0xc1, 0x10, 0x85, 0x23, 0xfa, 0xe4, 0x3e, 0x84, 0xa7, 0x4f, 0x06, 0xfd, - 0x2d, 0x35, 0x28, 0xc4, 0xdb, 0x63, 0x79, 0xb4, 0xfa, 0x7b, 0x7d, 0x70, 0x24, 0xb9, 0xd8, 0xbe, - 0x09, 0xd3, 0x9b, 0x56, 0xf5, 0x23, 0x4d, 0xec, 0xee, 0x18, 0x15, 0xec, 0xf9, 0x96, 0xcd, 0x72, - 0x34, 0x2c, 0x6f, 0x34, 0xdf, 0x5b, 0x71, 0xff, 0xec, 0xbc, 0x55, 0x7d, 0x95, 0x74, 0xb5, 0x10, - 0xf6, 0xa4, 0x4f, 0x89, 0xfe, 0x25, 0x20, 0xca, 0xc3, 0x09, 0x11, 0xef, 0xf2, 0xd3, 0x1d, 0x57, - 0x5d, 0xec, 0x11, 0x56, 0x7c, 0x2c, 0xfd, 0x0c, 0x17, 0xff, 0xa5, 0x2e, 0x6e, 0xb0, 0x0b, 0x14, - 0x67, 0x85, 0xa3, 0xa0, 0x77, 0x14, 0x38, 0x5a, 0x76, 0x6c, 0xaf, 0x59, 0xa7, 0x76, 0x28, 0xa0, - 0x8d, 0xfe, 0xe8, 0xd4, 0x95, 0x1e, 0x79, 0xc8, 0x87, 0x3d, 0x8a, 0x91, 0xc4, 0xbb, 0xcf, 0x72, - 0x52, 0x53, 0xee, 0x29, 0x98, 0x8a, 0xe1, 0x9d, 0x6c, 0xbd, 0x8a, 0xe9, 0x9b, 0x1e, 0x0e, 0x3d, - 0x07, 0x7d, 0x84, 0x43, 0x96, 0x2a, 0xb9, 0x8b, 0xc4, 0xa5, 0x4c, 0xe8, 0xb2, 0x83, 0xf9, 0xbf, - 0x00, 0x33, 0x09, 0x8f, 0x18, 0x12, 0x69, 0x2e, 0xfc, 0x70, 0x01, 0xd2, 0x3c, 0xef, 0xc0, 0x72, - 0x53, 0x2e, 0xfa, 0xb1, 0x02, 0x63, 0x72, 0xfd, 0x07, 0x8a, 0x4f, 0xfc, 0xc6, 0x14, 0xa3, 0xe4, - 0xce, 0xec, 0x01, 0x93, 0x59, 0x44, 0xf5, 0x63, 0xca, 0xae, 0x36, 0x11, 0xba, 0x4f, 0xe7, 0x88, - 0x53, 0xb4, 0xab, 0x71, 0x2b, 0xfd, 0xb1, 0x3f, 0xf8, 0xcb, 0x2f, 0xa6, 0x4c, 0x74, 0x6e, 0xee, - 0xd6, 0xf9, 0xb9, 0xb7, 0x18, 0xe8, 0x05, 0x8e, 0xeb, 0xcd, 0x9d, 0x9d, 0x0b, 0x62, 0xfd, 0xb9, - 0xb3, 0x77, 0xc5, 0xef, 0x42, 0x7a, 0x37, 0xce, 0xa3, 0x39, 0x82, 0x1f, 0xe0, 0xbd, 0x15, 0xf6, - 0x7e, 0x77, 0x8e, 0x16, 0x1b, 0xcc, 0xbd, 0x45, 0xfe, 0x09, 0x49, 0xd0, 0xdf, 0x28, 0x00, 0x61, - 0x95, 0x31, 0x8a, 0xf7, 0xa9, 0xda, 0xca, 0x90, 0x73, 0x1d, 0xcb, 0x5e, 0xd4, 0xff, 0xa6, 0xec, - 0x6a, 0xb9, 0x16, 0xce, 0xce, 0x85, 0xbe, 0xde, 0xae, 0x46, 0x9d, 0x2d, 0xca, 0xa2, 0xcd, 0x59, - 0x24, 0x80, 0x04, 0x06, 0x83, 0xc9, 0xce, 0x9d, 0xbd, 0x7b, 0xe3, 0x45, 0x74, 0xa9, 0x47, 0x16, - 0xe7, 0xde, 0x0a, 0x47, 0xbe, 0x8b, 0xfe, 0x51, 0x81, 0xf1, 0x48, 0xf9, 0x37, 0x8a, 0x5f, 0xb1, - 0xb8, 0x12, 0xf1, 0x5c, 0x97, 0x32, 0x0f, 0xca, 0xf7, 0xe1, 0x04, 0xbe, 0x77, 0xb5, 0x34, 0x5b, - 0x46, 0x01, 0xa0, 0xec, 0x57, 0xd5, 0x9e, 0x56, 0xf8, 0x39, 0xe5, 0xec, 0x8d, 0xa7, 0xd4, 0x5e, - 0x17, 0xf9, 0x39, 0xe5, 0x2c, 0xfa, 0x54, 0x0a, 0xc6, 0x23, 0x55, 0xdc, 0x09, 0x7c, 0xc7, 0x55, - 0x7a, 0x77, 0xe5, 0xfb, 0x5d, 0x65, 0x57, 0x3b, 0x95, 0xbc, 0xde, 0xe7, 0x58, 0xc1, 0xda, 0xae, - 0x36, 0x4a, 0x56, 0x99, 0x7f, 0x51, 0xf6, 0xfd, 0x5c, 0x4f, 0xab, 0x4f, 0xd8, 0xd7, 0x72, 0x07, - 0x52, 0x00, 0x22, 0x8b, 0x4f, 0xa6, 0x20, 0x1d, 0xad, 0x02, 0x47, 0x67, 0x3b, 0x08, 0xa3, 0xa5, - 0x04, 0xa0, 0xab, 0x34, 0xbe, 0xae, 0x50, 0xde, 0xbe, 0xa2, 0xe4, 0x9e, 0xe9, 0x81, 0xb9, 0xb9, - 0x20, 0x13, 0xca, 0x19, 0x35, 0xd5, 0xd7, 0x0f, 0xc2, 0xa8, 0xd4, 0xdf, 0x5b, 0x72, 0xa2, 0xf7, - 0xee, 0x1c, 0x93, 0x3f, 0x11, 0xc4, 0x37, 0x53, 0x91, 0xdc, 0xba, 0x6c, 0x2f, 0x2f, 0x24, 0xe5, - 0x84, 0x92, 0xab, 0xc7, 0xbb, 0x0a, 0xe6, 0xd7, 0x98, 0x60, 0x7e, 0x51, 0x51, 0x17, 0xf7, 0x2d, - 0x18, 0x0f, 0xfb, 0xd2, 0xc8, 0x44, 0x4e, 0x37, 0x55, 0xf3, 0xbd, 0x91, 0x93, 0x19, 0x19, 0x07, - 0xfd, 0x52, 0x0a, 0x26, 0xdb, 0x4a, 0xc6, 0xd1, 0xe3, 0x89, 0xb9, 0xb3, 0xb8, 0xd2, 0xf2, 0xae, - 0x22, 0xfa, 0xa1, 0xb2, 0xab, 0x9d, 0xed, 0xb0, 0x93, 0x5a, 0x2a, 0xc7, 0x77, 0xb5, 0x69, 0xba, - 0xa5, 0x5a, 0xc0, 0x54, 0xcc, 0xff, 0x51, 0x51, 0x3f, 0xd8, 0xd3, 0xe6, 0xf2, 0x82, 0x49, 0x13, - 0xb1, 0x2e, 0xa9, 0x0b, 0x07, 0x12, 0x6b, 0x2d, 0xe8, 0x0a, 0x7d, 0x8f, 0x17, 0xeb, 0xb6, 0x95, - 0x85, 0x27, 0x97, 0xcf, 0x26, 0x94, 0xb6, 0x77, 0x95, 0xdf, 0x1f, 0x2b, 0xbb, 0xda, 0xe3, 0x1d, - 0xe4, 0xd7, 0x5e, 0xb9, 0xbe, 0xab, 0x1d, 0xa6, 0x22, 0x6c, 0x6f, 0xa1, 0x52, 0xfc, 0x9c, 0xa2, - 0x3e, 0xd7, 0xab, 0x14, 0xc3, 0xd9, 0x13, 0x41, 0x2e, 0x33, 0x6d, 0xdf, 0xb7, 0x20, 0xeb, 0x72, - 0x6f, 0xe8, 0xff, 0xa5, 0x60, 0xa2, 0xa5, 0x6a, 0x1e, 0x3d, 0x96, 0x24, 0xc6, 0x98, 0xda, 0xfa, - 0xae, 0x12, 0xfc, 0x6d, 0x65, 0x57, 0x3b, 0xdd, 0x41, 0x82, 0x91, 0xd2, 0xf9, 0x5d, 0x0d, 0x51, - 0xe1, 0x45, 0x80, 0x54, 0x6e, 0x9f, 0x50, 0xd4, 0xa7, 0x7b, 0x95, 0x1b, 0x9b, 0x2e, 0x91, 0xd9, - 0x15, 0x35, 0x7f, 0x20, 0x99, 0x99, 0xa2, 0x27, 0xf4, 0x55, 0x5a, 0xdf, 0x18, 0xd6, 0xe2, 0x27, - 0xb8, 0x72, 0x31, 0xe5, 0xfa, 0x5d, 0x25, 0xf5, 0x7d, 0x65, 0x57, 0x7b, 0xa8, 0xe3, 0x5e, 0xe5, - 0x1d, 0xee, 0x6a, 0x69, 0xbe, 0x4b, 0x39, 0x80, 0x4a, 0xe8, 0x33, 0x8a, 0xfa, 0x6c, 0xef, 0xfb, - 0x93, 0x37, 0x11, 0x21, 0x5d, 0x55, 0x2f, 0x1f, 0x70, 0x87, 0x86, 0x9d, 0xa1, 0x77, 0x53, 0x30, - 0x26, 0x3f, 0x03, 0x48, 0x90, 0x53, 0xcc, 0x4b, 0x81, 0xae, 0x72, 0xfa, 0x7d, 0x65, 0x57, 0x3b, - 0xd3, 0x69, 0x4f, 0x46, 0xca, 0x34, 0x77, 0xb5, 0x29, 0xb6, 0x1f, 0x23, 0x50, 0x2a, 0xb1, 0x77, - 0x7a, 0x95, 0x58, 0x53, 0x9a, 0xed, 0xbd, 0x50, 0xab, 0xba, 0xe8, 0x09, 0xfd, 0x54, 0x81, 0xf1, - 0x48, 0x99, 0x7f, 0x82, 0x3b, 0x15, 0xf7, 0x14, 0xa0, 0xab, 0xc0, 0xfe, 0x2b, 0x3b, 0x27, 0xbf, - 0xb0, 0x1f, 0xd3, 0x13, 0x0c, 0x46, 0xf8, 0x5d, 0x53, 0x5f, 0x39, 0x90, 0xaf, 0xd4, 0xda, 0x21, - 0xf5, 0x9e, 0x23, 0x8f, 0x01, 0x12, 0xd8, 0x8e, 0x7b, 0x30, 0xb0, 0x27, 0xef, 0x79, 0xaf, 0x51, - 0xc3, 0xd9, 0x1e, 0xa3, 0x86, 0xb3, 0x07, 0x8b, 0x1a, 0x7e, 0xac, 0x40, 0x3a, 0x5a, 0x0e, 0x9e, - 0xe0, 0x31, 0xc6, 0x16, 0xcc, 0xe7, 0x1e, 0xdb, 0x13, 0x2e, 0x0f, 0x0b, 0xef, 0xb6, 0x47, 0x85, - 0x94, 0x67, 0x8c, 0x66, 0xf7, 0x12, 0x2a, 0x84, 0x95, 0xe6, 0x37, 0x9e, 0x44, 0xe7, 0xf7, 0xc8, - 0xb5, 0x54, 0x9e, 0xfe, 0x53, 0x05, 0xc6, 0xe4, 0x37, 0x08, 0x09, 0x86, 0x20, 0xe6, 0x99, 0x42, - 0xd7, 0x05, 0xfe, 0xef, 0xca, 0xae, 0x76, 0xac, 0x75, 0x81, 0xe5, 0x02, 0x7d, 0x16, 0x13, 0x70, - 0x3e, 0x3b, 0xad, 0x6d, 0x38, 0x5f, 0xb2, 0xba, 0xf3, 0xe8, 0xe5, 0x9e, 0xf9, 0x9c, 0x7b, 0x4b, - 0x1e, 0xf8, 0x2e, 0xfa, 0x7c, 0x0a, 0x26, 0x5a, 0x1e, 0x20, 0x24, 0x9c, 0xab, 0xf1, 0xcf, 0x14, - 0x72, 0x33, 0x6d, 0x45, 0x49, 0x85, 0x7a, 0xc3, 0xdf, 0x51, 0xbf, 0xdd, 0x8d, 0x69, 0x59, 0xaf, - 0xdf, 0x51, 0xd4, 0x8b, 0xbd, 0x31, 0xff, 0x5c, 0x99, 0x4e, 0xa7, 0x37, 0x47, 0x23, 0x51, 0x0c, - 0x61, 0x6f, 0xe8, 0xaf, 0x15, 0x98, 0x68, 0x79, 0x82, 0x90, 0x20, 0x90, 0xf8, 0x87, 0x0a, 0xb9, - 0x53, 0x09, 0x06, 0x31, 0xc4, 0x54, 0x3f, 0x19, 0x9b, 0x01, 0x09, 0xc5, 0x51, 0xed, 0xae, 0x0a, - 0x77, 0xe7, 0x3c, 0xa9, 0xc7, 0x1b, 0x17, 0xd1, 0x93, 0x7b, 0x94, 0x01, 0x23, 0xe3, 0x35, 0xce, - 0x5f, 0x4e, 0xc1, 0x78, 0xa4, 0xa6, 0x05, 0x25, 0xe7, 0x71, 0x5a, 0xeb, 0xd3, 0x73, 0x67, 0xf7, - 0x82, 0xca, 0x37, 0xf7, 0xb7, 0xba, 0xd9, 0x38, 0x39, 0xfd, 0xf3, 0x71, 0x05, 0x3d, 0xd3, 0x7d, - 0xcb, 0xcb, 0x86, 0x2e, 0x0c, 0x66, 0x6e, 0x5c, 0x41, 0x97, 0xef, 0x4d, 0x58, 0x84, 0xfe, 0x57, - 0x0a, 0x46, 0xa5, 0x4a, 0x78, 0xf4, 0x68, 0x92, 0x16, 0xb4, 0x06, 0xca, 0x9d, 0x6b, 0x7f, 0xd4, - 0x1f, 0x28, 0xbb, 0xda, 0xa3, 0x1d, 0xfc, 0x02, 0x39, 0x1a, 0x93, 0xb5, 0xe2, 0x8b, 0x42, 0x2c, - 0xfb, 0x88, 0x1f, 0x6f, 0xbc, 0x86, 0x36, 0xde, 0x93, 0x68, 0x91, 0xc4, 0xd2, 0xe9, 0xe8, 0x0b, - 0x92, 0x84, 0x23, 0x22, 0xf6, 0x99, 0x49, 0x57, 0xdb, 0xf9, 0x83, 0x2e, 0xce, 0x66, 0x30, 0x99, - 0x5d, 0x2d, 0xc3, 0xf3, 0x4c, 0x01, 0x88, 0x4a, 0xed, 0xd3, 0x8a, 0xba, 0x6f, 0x65, 0xba, 0x17, - 0xde, 0xa6, 0xdc, 0x19, 0x15, 0x56, 0xf4, 0x75, 0x4a, 0x82, 0xb0, 0x62, 0x9f, 0xb0, 0xec, 0x49, - 0x58, 0xfb, 0xd3, 0xac, 0xb3, 0x07, 0xd0, 0xac, 0xb3, 0xef, 0x91, 0x66, 0xfd, 0x28, 0x05, 0x87, - 0x13, 0x4a, 0x05, 0x51, 0xfc, 0x8d, 0x49, 0xe7, 0xc2, 0xc2, 0xae, 0xe2, 0xfb, 0x8b, 0x7d, 0x8a, - 0xef, 0xff, 0x2a, 0xaa, 0xb6, 0xef, 0xc4, 0x8e, 0xcb, 0xe7, 0x4c, 0x74, 0xad, 0xac, 0x7e, 0xf8, - 0x3d, 0x11, 0xa5, 0x3c, 0x08, 0xfa, 0x46, 0x0a, 0x0e, 0xc5, 0xd6, 0xd6, 0xa2, 0xf3, 0xdd, 0x72, - 0x5f, 0x6d, 0x75, 0xb8, 0x5d, 0x45, 0xfa, 0x1d, 0xe6, 0xd2, 0x7f, 0x5b, 0x61, 0xbb, 0x68, 0xbf, - 0xa9, 0xaf, 0x70, 0x60, 0x22, 0xa6, 0x2d, 0xb5, 0xfc, 0xde, 0x64, 0xbe, 0x5a, 0x47, 0x42, 0xff, - 0xa0, 0xc0, 0x48, 0x50, 0x0f, 0x86, 0x1e, 0xde, 0x53, 0xbd, 0x58, 0x57, 0x99, 0xfc, 0x0f, 0x26, - 0x93, 0x2f, 0x29, 0xea, 0x8b, 0xbd, 0x86, 0x39, 0xd1, 0xc2, 0x30, 0x22, 0x8b, 0xa2, 0x7a, 0xf5, - 0x40, 0xb2, 0x70, 0x5b, 0x7b, 0x44, 0x5f, 0x4d, 0xd1, 0x10, 0x4f, 0xfa, 0xfd, 0xfc, 0xc4, 0x10, - 0xaf, 0xad, 0xc0, 0xac, 0x2b, 0xef, 0xbf, 0xa5, 0xec, 0x6a, 0x6a, 0x87, 0x2d, 0xc6, 0x2f, 0xa7, - 0x76, 0xb5, 0x31, 0x1a, 0x0c, 0xf3, 0xcf, 0x7d, 0x67, 0xa4, 0xc2, 0x09, 0xde, 0x8b, 0x8c, 0x54, - 0x4d, 0xee, 0x0d, 0x7d, 0x25, 0x45, 0x4b, 0x66, 0xe4, 0xd2, 0xb5, 0xa4, 0x8c, 0x54, 0x6c, 0x81, - 0x5b, 0x57, 0x59, 0xfd, 0xfa, 0xde, 0xe3, 0xc2, 0xff, 0xac, 0xa8, 0x97, 0x7a, 0x93, 0x0d, 0x9d, - 0x52, 0x43, 0x4c, 0x89, 0x48, 0xe7, 0x55, 0x75, 0xf9, 0x60, 0x41, 0x73, 0x5b, 0x97, 0xe8, 0xdd, - 0x14, 0xa0, 0xf6, 0x0a, 0x39, 0x14, 0xff, 0x53, 0x69, 0x89, 0xa5, 0x74, 0x5d, 0x05, 0xf5, 0x9b, - 0x7b, 0x17, 0xd4, 0x97, 0x15, 0xf5, 0xa5, 0x9e, 0x04, 0x55, 0x16, 0xb3, 0x8a, 0xc8, 0x6a, 0x5d, - 0x5d, 0x3b, 0x90, 0xac, 0x62, 0x7b, 0x45, 0xff, 0x89, 0xe5, 0x38, 0xe5, 0x92, 0xff, 0xe4, 0x1c, - 0x67, 0xcc, 0xc3, 0x80, 0xae, 0x82, 0xfa, 0x39, 0x66, 0x79, 0xbe, 0xa1, 0xa8, 0x2f, 0x1f, 0xc4, - 0x1a, 0x93, 0x21, 0x89, 0x14, 0x36, 0xd5, 0x7f, 0xff, 0x9e, 0xd9, 0x61, 0x3e, 0x06, 0xfa, 0x2e, - 0xab, 0x17, 0x8e, 0xfe, 0x91, 0x8e, 0x73, 0x89, 0x42, 0x89, 0x29, 0x47, 0xec, 0x2a, 0x95, 0x3f, - 0xe9, 0x92, 0xa7, 0x8b, 0x56, 0x1b, 0x8a, 0x3c, 0x5d, 0x14, 0x4a, 0xe5, 0xfa, 0x5f, 0x14, 0xf5, - 0x85, 0x5e, 0x2d, 0x54, 0x64, 0xc6, 0x44, 0xa8, 0xba, 0xba, 0x72, 0xd0, 0xdc, 0x55, 0x6b, 0x9f, - 0x68, 0x57, 0xfc, 0x6a, 0x48, 0x6b, 0x29, 0x60, 0x87, 0xdf, 0xf1, 0x88, 0xaf, 0x7c, 0xec, 0x2a, - 0xcc, 0xbf, 0xeb, 0x76, 0x11, 0xd1, 0x56, 0xd5, 0x18, 0x5c, 0x44, 0xb4, 0xb5, 0x50, 0xa1, 0xfe, - 0xcf, 0xde, 0x9c, 0x2b, 0xee, 0x2e, 0xb4, 0xcc, 0x9e, 0x08, 0xf6, 0x9a, 0xfa, 0xea, 0xc1, 0x93, - 0x82, 0xed, 0xfd, 0xa2, 0xef, 0x28, 0xec, 0x5d, 0x48, 0x5b, 0x09, 0x58, 0x82, 0x3f, 0xd5, 0xa9, - 0x76, 0x2d, 0x77, 0xa1, 0x17, 0x12, 0x1e, 0x5b, 0x5f, 0xa2, 0x72, 0x7a, 0x1a, 0x3d, 0x15, 0x1f, - 0xe6, 0xdc, 0x9d, 0x33, 0xab, 0x55, 0x17, 0x57, 0x4d, 0x1f, 0x57, 0xe6, 0x9a, 0xad, 0xbd, 0xe4, - 0x96, 0xbf, 0xaf, 0x65, 0xc3, 0xc1, 0xd8, 0xe8, 0x66, 0xc3, 0xf2, 0x66, 0xcb, 0x4e, 0xfd, 0x87, - 0xda, 0xec, 0x96, 0xef, 0x37, 0xbc, 0xe7, 0xe6, 0xe6, 0x6e, 0xdf, 0xbe, 0xdd, 0xd2, 0x38, 0x67, - 0x36, 0xfd, 0xad, 0x39, 0xfa, 0xb7, 0xac, 0x1e, 0x17, 0x7f, 0xbf, 0x70, 0xfe, 0x6b, 0x0a, 0x1c, - 0x2e, 0x3b, 0xf5, 0x38, 0x2e, 0xe6, 0xa7, 0xf2, 0xe2, 0xef, 0xa9, 0xd0, 0x6b, 0xa6, 0xa2, 0xeb, - 0xf8, 0x4e, 0x51, 0xb9, 0x71, 0x89, 0xe3, 0x56, 0x9d, 0x9a, 0x69, 0x57, 0x67, 0x1d, 0xb7, 0x3a, - 0x57, 0xc5, 0x36, 0xcd, 0x26, 0xcd, 0x85, 0x23, 0x46, 0xfe, 0x22, 0xe8, 0xf3, 0xc1, 0xc7, 0x37, - 0x53, 0x47, 0x16, 0x19, 0x39, 0xfd, 0x4b, 0x48, 0xb3, 0xf9, 0x60, 0xc0, 0x6b, 0xe7, 0xbf, 0x2f, - 0xda, 0x5e, 0xa7, 0x6d, 0xaf, 0x07, 0x6d, 0xaf, 0x5f, 0x3b, 0xbf, 0x39, 0x48, 0x07, 0x78, 0xf2, - 0xdf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x3b, 0x0a, 0x58, 0xc2, 0x71, 0x74, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// ClusterManagerClient is the client API for ClusterManager service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ClusterManagerClient interface { - // Lists all clusters owned by a project in either the specified zone or all - // zones. - ListClusters(ctx context.Context, in *ListClustersRequest, opts ...grpc.CallOption) (*ListClustersResponse, error) - // Gets the details of a specific cluster. - GetCluster(ctx context.Context, in *GetClusterRequest, opts ...grpc.CallOption) (*Cluster, error) - // Creates a cluster, consisting of the specified number and type of Google - // Compute Engine instances. - // - // By default, the cluster is created in the project's - // [default network](/compute/docs/networks-and-firewalls#networks). - // - // One firewall is added for the cluster. After cluster creation, - // the Kubelet creates routes for each node to allow the containers - // on that node to communicate with all other instances in the - // cluster. - // - // Finally, an entry is added to the project's global metadata indicating - // which CIDR range the cluster is using. - CreateCluster(ctx context.Context, in *CreateClusterRequest, opts ...grpc.CallOption) (*Operation, error) - // Updates the settings of a specific cluster. - UpdateCluster(ctx context.Context, in *UpdateClusterRequest, opts ...grpc.CallOption) (*Operation, error) - // Updates the version and/or image type for the specified node pool. - UpdateNodePool(ctx context.Context, in *UpdateNodePoolRequest, opts ...grpc.CallOption) (*Operation, error) - // Sets the autoscaling settings for the specified node pool. - SetNodePoolAutoscaling(ctx context.Context, in *SetNodePoolAutoscalingRequest, opts ...grpc.CallOption) (*Operation, error) - // Sets the logging service for a specific cluster. - SetLoggingService(ctx context.Context, in *SetLoggingServiceRequest, opts ...grpc.CallOption) (*Operation, error) - // Sets the monitoring service for a specific cluster. - SetMonitoringService(ctx context.Context, in *SetMonitoringServiceRequest, opts ...grpc.CallOption) (*Operation, error) - // Sets the addons for a specific cluster. - SetAddonsConfig(ctx context.Context, in *SetAddonsConfigRequest, opts ...grpc.CallOption) (*Operation, error) - // Sets the locations for a specific cluster. - SetLocations(ctx context.Context, in *SetLocationsRequest, opts ...grpc.CallOption) (*Operation, error) - // Updates the master for a specific cluster. - UpdateMaster(ctx context.Context, in *UpdateMasterRequest, opts ...grpc.CallOption) (*Operation, error) - // Sets master auth materials. Currently supports changing the admin password - // or a specific cluster, either via password generation or explicitly setting - // the password. - SetMasterAuth(ctx context.Context, in *SetMasterAuthRequest, opts ...grpc.CallOption) (*Operation, error) - // Deletes the cluster, including the Kubernetes endpoint and all worker - // nodes. - // - // Firewalls and routes that were configured during cluster creation - // are also deleted. - // - // Other Google Compute Engine resources that might be in use by the cluster, - // such as load balancer resources, are not deleted if they weren't present - // when the cluster was initially created. - DeleteCluster(ctx context.Context, in *DeleteClusterRequest, opts ...grpc.CallOption) (*Operation, error) - // Lists all operations in a project in a specific zone or all zones. - ListOperations(ctx context.Context, in *ListOperationsRequest, opts ...grpc.CallOption) (*ListOperationsResponse, error) - // Gets the specified operation. - GetOperation(ctx context.Context, in *GetOperationRequest, opts ...grpc.CallOption) (*Operation, error) - // Cancels the specified operation. - CancelOperation(ctx context.Context, in *CancelOperationRequest, opts ...grpc.CallOption) (*empty.Empty, error) - // Returns configuration info about the Google Kubernetes Engine service. - GetServerConfig(ctx context.Context, in *GetServerConfigRequest, opts ...grpc.CallOption) (*ServerConfig, error) - // Lists the node pools for a cluster. - ListNodePools(ctx context.Context, in *ListNodePoolsRequest, opts ...grpc.CallOption) (*ListNodePoolsResponse, error) - // Retrieves the requested node pool. - GetNodePool(ctx context.Context, in *GetNodePoolRequest, opts ...grpc.CallOption) (*NodePool, error) - // Creates a node pool for a cluster. - CreateNodePool(ctx context.Context, in *CreateNodePoolRequest, opts ...grpc.CallOption) (*Operation, error) - // Deletes a node pool from a cluster. - DeleteNodePool(ctx context.Context, in *DeleteNodePoolRequest, opts ...grpc.CallOption) (*Operation, error) - // Rolls back a previously Aborted or Failed NodePool upgrade. - // This makes no changes if the last upgrade successfully completed. - RollbackNodePoolUpgrade(ctx context.Context, in *RollbackNodePoolUpgradeRequest, opts ...grpc.CallOption) (*Operation, error) - // Sets the NodeManagement options for a node pool. - SetNodePoolManagement(ctx context.Context, in *SetNodePoolManagementRequest, opts ...grpc.CallOption) (*Operation, error) - // Sets labels on a cluster. - SetLabels(ctx context.Context, in *SetLabelsRequest, opts ...grpc.CallOption) (*Operation, error) - // Enables or disables the ABAC authorization mechanism on a cluster. - SetLegacyAbac(ctx context.Context, in *SetLegacyAbacRequest, opts ...grpc.CallOption) (*Operation, error) - // Starts master IP rotation. - StartIPRotation(ctx context.Context, in *StartIPRotationRequest, opts ...grpc.CallOption) (*Operation, error) - // Completes master IP rotation. - CompleteIPRotation(ctx context.Context, in *CompleteIPRotationRequest, opts ...grpc.CallOption) (*Operation, error) - // Sets the size for a specific node pool. - SetNodePoolSize(ctx context.Context, in *SetNodePoolSizeRequest, opts ...grpc.CallOption) (*Operation, error) - // Enables or disables Network Policy for a cluster. - SetNetworkPolicy(ctx context.Context, in *SetNetworkPolicyRequest, opts ...grpc.CallOption) (*Operation, error) - // Sets the maintenance policy for a cluster. - SetMaintenancePolicy(ctx context.Context, in *SetMaintenancePolicyRequest, opts ...grpc.CallOption) (*Operation, error) - // Lists subnetworks that are usable for creating clusters in a project. - ListUsableSubnetworks(ctx context.Context, in *ListUsableSubnetworksRequest, opts ...grpc.CallOption) (*ListUsableSubnetworksResponse, error) -} - -type clusterManagerClient struct { - cc grpc.ClientConnInterface -} - -func NewClusterManagerClient(cc grpc.ClientConnInterface) ClusterManagerClient { - return &clusterManagerClient{cc} -} - -func (c *clusterManagerClient) ListClusters(ctx context.Context, in *ListClustersRequest, opts ...grpc.CallOption) (*ListClustersResponse, error) { - out := new(ListClustersResponse) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/ListClusters", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) GetCluster(ctx context.Context, in *GetClusterRequest, opts ...grpc.CallOption) (*Cluster, error) { - out := new(Cluster) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/GetCluster", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) CreateCluster(ctx context.Context, in *CreateClusterRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/CreateCluster", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) UpdateCluster(ctx context.Context, in *UpdateClusterRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/UpdateCluster", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) UpdateNodePool(ctx context.Context, in *UpdateNodePoolRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/UpdateNodePool", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetNodePoolAutoscaling(ctx context.Context, in *SetNodePoolAutoscalingRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetNodePoolAutoscaling", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetLoggingService(ctx context.Context, in *SetLoggingServiceRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetLoggingService", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetMonitoringService(ctx context.Context, in *SetMonitoringServiceRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetMonitoringService", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetAddonsConfig(ctx context.Context, in *SetAddonsConfigRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetAddonsConfig", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetLocations(ctx context.Context, in *SetLocationsRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetLocations", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) UpdateMaster(ctx context.Context, in *UpdateMasterRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/UpdateMaster", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetMasterAuth(ctx context.Context, in *SetMasterAuthRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetMasterAuth", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) DeleteCluster(ctx context.Context, in *DeleteClusterRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/DeleteCluster", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) ListOperations(ctx context.Context, in *ListOperationsRequest, opts ...grpc.CallOption) (*ListOperationsResponse, error) { - out := new(ListOperationsResponse) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/ListOperations", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) GetOperation(ctx context.Context, in *GetOperationRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/GetOperation", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) CancelOperation(ctx context.Context, in *CancelOperationRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/CancelOperation", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) GetServerConfig(ctx context.Context, in *GetServerConfigRequest, opts ...grpc.CallOption) (*ServerConfig, error) { - out := new(ServerConfig) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/GetServerConfig", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) ListNodePools(ctx context.Context, in *ListNodePoolsRequest, opts ...grpc.CallOption) (*ListNodePoolsResponse, error) { - out := new(ListNodePoolsResponse) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/ListNodePools", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) GetNodePool(ctx context.Context, in *GetNodePoolRequest, opts ...grpc.CallOption) (*NodePool, error) { - out := new(NodePool) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/GetNodePool", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) CreateNodePool(ctx context.Context, in *CreateNodePoolRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/CreateNodePool", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) DeleteNodePool(ctx context.Context, in *DeleteNodePoolRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/DeleteNodePool", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) RollbackNodePoolUpgrade(ctx context.Context, in *RollbackNodePoolUpgradeRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/RollbackNodePoolUpgrade", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetNodePoolManagement(ctx context.Context, in *SetNodePoolManagementRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetNodePoolManagement", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetLabels(ctx context.Context, in *SetLabelsRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetLabels", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetLegacyAbac(ctx context.Context, in *SetLegacyAbacRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetLegacyAbac", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) StartIPRotation(ctx context.Context, in *StartIPRotationRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/StartIPRotation", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) CompleteIPRotation(ctx context.Context, in *CompleteIPRotationRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/CompleteIPRotation", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetNodePoolSize(ctx context.Context, in *SetNodePoolSizeRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetNodePoolSize", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetNetworkPolicy(ctx context.Context, in *SetNetworkPolicyRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetNetworkPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) SetMaintenancePolicy(ctx context.Context, in *SetMaintenancePolicyRequest, opts ...grpc.CallOption) (*Operation, error) { - out := new(Operation) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/SetMaintenancePolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *clusterManagerClient) ListUsableSubnetworks(ctx context.Context, in *ListUsableSubnetworksRequest, opts ...grpc.CallOption) (*ListUsableSubnetworksResponse, error) { - out := new(ListUsableSubnetworksResponse) - err := c.cc.Invoke(ctx, "/google.container.v1.ClusterManager/ListUsableSubnetworks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ClusterManagerServer is the server API for ClusterManager service. -type ClusterManagerServer interface { - // Lists all clusters owned by a project in either the specified zone or all - // zones. - ListClusters(context.Context, *ListClustersRequest) (*ListClustersResponse, error) - // Gets the details of a specific cluster. - GetCluster(context.Context, *GetClusterRequest) (*Cluster, error) - // Creates a cluster, consisting of the specified number and type of Google - // Compute Engine instances. - // - // By default, the cluster is created in the project's - // [default network](/compute/docs/networks-and-firewalls#networks). - // - // One firewall is added for the cluster. After cluster creation, - // the Kubelet creates routes for each node to allow the containers - // on that node to communicate with all other instances in the - // cluster. - // - // Finally, an entry is added to the project's global metadata indicating - // which CIDR range the cluster is using. - CreateCluster(context.Context, *CreateClusterRequest) (*Operation, error) - // Updates the settings of a specific cluster. - UpdateCluster(context.Context, *UpdateClusterRequest) (*Operation, error) - // Updates the version and/or image type for the specified node pool. - UpdateNodePool(context.Context, *UpdateNodePoolRequest) (*Operation, error) - // Sets the autoscaling settings for the specified node pool. - SetNodePoolAutoscaling(context.Context, *SetNodePoolAutoscalingRequest) (*Operation, error) - // Sets the logging service for a specific cluster. - SetLoggingService(context.Context, *SetLoggingServiceRequest) (*Operation, error) - // Sets the monitoring service for a specific cluster. - SetMonitoringService(context.Context, *SetMonitoringServiceRequest) (*Operation, error) - // Sets the addons for a specific cluster. - SetAddonsConfig(context.Context, *SetAddonsConfigRequest) (*Operation, error) - // Sets the locations for a specific cluster. - SetLocations(context.Context, *SetLocationsRequest) (*Operation, error) - // Updates the master for a specific cluster. - UpdateMaster(context.Context, *UpdateMasterRequest) (*Operation, error) - // Sets master auth materials. Currently supports changing the admin password - // or a specific cluster, either via password generation or explicitly setting - // the password. - SetMasterAuth(context.Context, *SetMasterAuthRequest) (*Operation, error) - // Deletes the cluster, including the Kubernetes endpoint and all worker - // nodes. - // - // Firewalls and routes that were configured during cluster creation - // are also deleted. - // - // Other Google Compute Engine resources that might be in use by the cluster, - // such as load balancer resources, are not deleted if they weren't present - // when the cluster was initially created. - DeleteCluster(context.Context, *DeleteClusterRequest) (*Operation, error) - // Lists all operations in a project in a specific zone or all zones. - ListOperations(context.Context, *ListOperationsRequest) (*ListOperationsResponse, error) - // Gets the specified operation. - GetOperation(context.Context, *GetOperationRequest) (*Operation, error) - // Cancels the specified operation. - CancelOperation(context.Context, *CancelOperationRequest) (*empty.Empty, error) - // Returns configuration info about the Google Kubernetes Engine service. - GetServerConfig(context.Context, *GetServerConfigRequest) (*ServerConfig, error) - // Lists the node pools for a cluster. - ListNodePools(context.Context, *ListNodePoolsRequest) (*ListNodePoolsResponse, error) - // Retrieves the requested node pool. - GetNodePool(context.Context, *GetNodePoolRequest) (*NodePool, error) - // Creates a node pool for a cluster. - CreateNodePool(context.Context, *CreateNodePoolRequest) (*Operation, error) - // Deletes a node pool from a cluster. - DeleteNodePool(context.Context, *DeleteNodePoolRequest) (*Operation, error) - // Rolls back a previously Aborted or Failed NodePool upgrade. - // This makes no changes if the last upgrade successfully completed. - RollbackNodePoolUpgrade(context.Context, *RollbackNodePoolUpgradeRequest) (*Operation, error) - // Sets the NodeManagement options for a node pool. - SetNodePoolManagement(context.Context, *SetNodePoolManagementRequest) (*Operation, error) - // Sets labels on a cluster. - SetLabels(context.Context, *SetLabelsRequest) (*Operation, error) - // Enables or disables the ABAC authorization mechanism on a cluster. - SetLegacyAbac(context.Context, *SetLegacyAbacRequest) (*Operation, error) - // Starts master IP rotation. - StartIPRotation(context.Context, *StartIPRotationRequest) (*Operation, error) - // Completes master IP rotation. - CompleteIPRotation(context.Context, *CompleteIPRotationRequest) (*Operation, error) - // Sets the size for a specific node pool. - SetNodePoolSize(context.Context, *SetNodePoolSizeRequest) (*Operation, error) - // Enables or disables Network Policy for a cluster. - SetNetworkPolicy(context.Context, *SetNetworkPolicyRequest) (*Operation, error) - // Sets the maintenance policy for a cluster. - SetMaintenancePolicy(context.Context, *SetMaintenancePolicyRequest) (*Operation, error) - // Lists subnetworks that are usable for creating clusters in a project. - ListUsableSubnetworks(context.Context, *ListUsableSubnetworksRequest) (*ListUsableSubnetworksResponse, error) -} - -// UnimplementedClusterManagerServer can be embedded to have forward compatible implementations. -type UnimplementedClusterManagerServer struct { -} - -func (*UnimplementedClusterManagerServer) ListClusters(ctx context.Context, req *ListClustersRequest) (*ListClustersResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListClusters not implemented") -} -func (*UnimplementedClusterManagerServer) GetCluster(ctx context.Context, req *GetClusterRequest) (*Cluster, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetCluster not implemented") -} -func (*UnimplementedClusterManagerServer) CreateCluster(ctx context.Context, req *CreateClusterRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateCluster not implemented") -} -func (*UnimplementedClusterManagerServer) UpdateCluster(ctx context.Context, req *UpdateClusterRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateCluster not implemented") -} -func (*UnimplementedClusterManagerServer) UpdateNodePool(ctx context.Context, req *UpdateNodePoolRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateNodePool not implemented") -} -func (*UnimplementedClusterManagerServer) SetNodePoolAutoscaling(ctx context.Context, req *SetNodePoolAutoscalingRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetNodePoolAutoscaling not implemented") -} -func (*UnimplementedClusterManagerServer) SetLoggingService(ctx context.Context, req *SetLoggingServiceRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetLoggingService not implemented") -} -func (*UnimplementedClusterManagerServer) SetMonitoringService(ctx context.Context, req *SetMonitoringServiceRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetMonitoringService not implemented") -} -func (*UnimplementedClusterManagerServer) SetAddonsConfig(ctx context.Context, req *SetAddonsConfigRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetAddonsConfig not implemented") -} -func (*UnimplementedClusterManagerServer) SetLocations(ctx context.Context, req *SetLocationsRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetLocations not implemented") -} -func (*UnimplementedClusterManagerServer) UpdateMaster(ctx context.Context, req *UpdateMasterRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateMaster not implemented") -} -func (*UnimplementedClusterManagerServer) SetMasterAuth(ctx context.Context, req *SetMasterAuthRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetMasterAuth not implemented") -} -func (*UnimplementedClusterManagerServer) DeleteCluster(ctx context.Context, req *DeleteClusterRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteCluster not implemented") -} -func (*UnimplementedClusterManagerServer) ListOperations(ctx context.Context, req *ListOperationsRequest) (*ListOperationsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListOperations not implemented") -} -func (*UnimplementedClusterManagerServer) GetOperation(ctx context.Context, req *GetOperationRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetOperation not implemented") -} -func (*UnimplementedClusterManagerServer) CancelOperation(ctx context.Context, req *CancelOperationRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method CancelOperation not implemented") -} -func (*UnimplementedClusterManagerServer) GetServerConfig(ctx context.Context, req *GetServerConfigRequest) (*ServerConfig, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetServerConfig not implemented") -} -func (*UnimplementedClusterManagerServer) ListNodePools(ctx context.Context, req *ListNodePoolsRequest) (*ListNodePoolsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListNodePools not implemented") -} -func (*UnimplementedClusterManagerServer) GetNodePool(ctx context.Context, req *GetNodePoolRequest) (*NodePool, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetNodePool not implemented") -} -func (*UnimplementedClusterManagerServer) CreateNodePool(ctx context.Context, req *CreateNodePoolRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateNodePool not implemented") -} -func (*UnimplementedClusterManagerServer) DeleteNodePool(ctx context.Context, req *DeleteNodePoolRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteNodePool not implemented") -} -func (*UnimplementedClusterManagerServer) RollbackNodePoolUpgrade(ctx context.Context, req *RollbackNodePoolUpgradeRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method RollbackNodePoolUpgrade not implemented") -} -func (*UnimplementedClusterManagerServer) SetNodePoolManagement(ctx context.Context, req *SetNodePoolManagementRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetNodePoolManagement not implemented") -} -func (*UnimplementedClusterManagerServer) SetLabels(ctx context.Context, req *SetLabelsRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetLabels not implemented") -} -func (*UnimplementedClusterManagerServer) SetLegacyAbac(ctx context.Context, req *SetLegacyAbacRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetLegacyAbac not implemented") -} -func (*UnimplementedClusterManagerServer) StartIPRotation(ctx context.Context, req *StartIPRotationRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method StartIPRotation not implemented") -} -func (*UnimplementedClusterManagerServer) CompleteIPRotation(ctx context.Context, req *CompleteIPRotationRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method CompleteIPRotation not implemented") -} -func (*UnimplementedClusterManagerServer) SetNodePoolSize(ctx context.Context, req *SetNodePoolSizeRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetNodePoolSize not implemented") -} -func (*UnimplementedClusterManagerServer) SetNetworkPolicy(ctx context.Context, req *SetNetworkPolicyRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetNetworkPolicy not implemented") -} -func (*UnimplementedClusterManagerServer) SetMaintenancePolicy(ctx context.Context, req *SetMaintenancePolicyRequest) (*Operation, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetMaintenancePolicy not implemented") -} -func (*UnimplementedClusterManagerServer) ListUsableSubnetworks(ctx context.Context, req *ListUsableSubnetworksRequest) (*ListUsableSubnetworksResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListUsableSubnetworks not implemented") -} - -func RegisterClusterManagerServer(s *grpc.Server, srv ClusterManagerServer) { - s.RegisterService(&_ClusterManager_serviceDesc, srv) -} - -func _ClusterManager_ListClusters_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListClustersRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).ListClusters(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/ListClusters", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).ListClusters(ctx, req.(*ListClustersRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_GetCluster_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetClusterRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).GetCluster(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/GetCluster", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).GetCluster(ctx, req.(*GetClusterRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_CreateCluster_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateClusterRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).CreateCluster(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/CreateCluster", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).CreateCluster(ctx, req.(*CreateClusterRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_UpdateCluster_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateClusterRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).UpdateCluster(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/UpdateCluster", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).UpdateCluster(ctx, req.(*UpdateClusterRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_UpdateNodePool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateNodePoolRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).UpdateNodePool(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/UpdateNodePool", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).UpdateNodePool(ctx, req.(*UpdateNodePoolRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetNodePoolAutoscaling_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetNodePoolAutoscalingRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetNodePoolAutoscaling(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetNodePoolAutoscaling", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetNodePoolAutoscaling(ctx, req.(*SetNodePoolAutoscalingRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetLoggingService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetLoggingServiceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetLoggingService(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetLoggingService", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetLoggingService(ctx, req.(*SetLoggingServiceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetMonitoringService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetMonitoringServiceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetMonitoringService(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetMonitoringService", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetMonitoringService(ctx, req.(*SetMonitoringServiceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetAddonsConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetAddonsConfigRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetAddonsConfig(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetAddonsConfig", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetAddonsConfig(ctx, req.(*SetAddonsConfigRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetLocations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetLocationsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetLocations(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetLocations", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetLocations(ctx, req.(*SetLocationsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_UpdateMaster_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateMasterRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).UpdateMaster(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/UpdateMaster", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).UpdateMaster(ctx, req.(*UpdateMasterRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetMasterAuth_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetMasterAuthRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetMasterAuth(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetMasterAuth", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetMasterAuth(ctx, req.(*SetMasterAuthRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_DeleteCluster_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteClusterRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).DeleteCluster(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/DeleteCluster", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).DeleteCluster(ctx, req.(*DeleteClusterRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_ListOperations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListOperationsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).ListOperations(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/ListOperations", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).ListOperations(ctx, req.(*ListOperationsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_GetOperation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetOperationRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).GetOperation(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/GetOperation", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).GetOperation(ctx, req.(*GetOperationRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_CancelOperation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CancelOperationRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).CancelOperation(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/CancelOperation", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).CancelOperation(ctx, req.(*CancelOperationRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_GetServerConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetServerConfigRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).GetServerConfig(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/GetServerConfig", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).GetServerConfig(ctx, req.(*GetServerConfigRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_ListNodePools_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListNodePoolsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).ListNodePools(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/ListNodePools", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).ListNodePools(ctx, req.(*ListNodePoolsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_GetNodePool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetNodePoolRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).GetNodePool(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/GetNodePool", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).GetNodePool(ctx, req.(*GetNodePoolRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_CreateNodePool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateNodePoolRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).CreateNodePool(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/CreateNodePool", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).CreateNodePool(ctx, req.(*CreateNodePoolRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_DeleteNodePool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteNodePoolRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).DeleteNodePool(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/DeleteNodePool", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).DeleteNodePool(ctx, req.(*DeleteNodePoolRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_RollbackNodePoolUpgrade_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RollbackNodePoolUpgradeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).RollbackNodePoolUpgrade(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/RollbackNodePoolUpgrade", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).RollbackNodePoolUpgrade(ctx, req.(*RollbackNodePoolUpgradeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetNodePoolManagement_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetNodePoolManagementRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetNodePoolManagement(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetNodePoolManagement", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetNodePoolManagement(ctx, req.(*SetNodePoolManagementRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetLabels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetLabelsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetLabels(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetLabels", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetLabels(ctx, req.(*SetLabelsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetLegacyAbac_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetLegacyAbacRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetLegacyAbac(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetLegacyAbac", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetLegacyAbac(ctx, req.(*SetLegacyAbacRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_StartIPRotation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StartIPRotationRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).StartIPRotation(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/StartIPRotation", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).StartIPRotation(ctx, req.(*StartIPRotationRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_CompleteIPRotation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CompleteIPRotationRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).CompleteIPRotation(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/CompleteIPRotation", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).CompleteIPRotation(ctx, req.(*CompleteIPRotationRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetNodePoolSize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetNodePoolSizeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetNodePoolSize(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetNodePoolSize", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetNodePoolSize(ctx, req.(*SetNodePoolSizeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetNetworkPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetNetworkPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetNetworkPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetNetworkPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetNetworkPolicy(ctx, req.(*SetNetworkPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_SetMaintenancePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetMaintenancePolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).SetMaintenancePolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/SetMaintenancePolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).SetMaintenancePolicy(ctx, req.(*SetMaintenancePolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ClusterManager_ListUsableSubnetworks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListUsableSubnetworksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ClusterManagerServer).ListUsableSubnetworks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.container.v1.ClusterManager/ListUsableSubnetworks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterManagerServer).ListUsableSubnetworks(ctx, req.(*ListUsableSubnetworksRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _ClusterManager_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.container.v1.ClusterManager", - HandlerType: (*ClusterManagerServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListClusters", - Handler: _ClusterManager_ListClusters_Handler, - }, - { - MethodName: "GetCluster", - Handler: _ClusterManager_GetCluster_Handler, - }, - { - MethodName: "CreateCluster", - Handler: _ClusterManager_CreateCluster_Handler, - }, - { - MethodName: "UpdateCluster", - Handler: _ClusterManager_UpdateCluster_Handler, - }, - { - MethodName: "UpdateNodePool", - Handler: _ClusterManager_UpdateNodePool_Handler, - }, - { - MethodName: "SetNodePoolAutoscaling", - Handler: _ClusterManager_SetNodePoolAutoscaling_Handler, - }, - { - MethodName: "SetLoggingService", - Handler: _ClusterManager_SetLoggingService_Handler, - }, - { - MethodName: "SetMonitoringService", - Handler: _ClusterManager_SetMonitoringService_Handler, - }, - { - MethodName: "SetAddonsConfig", - Handler: _ClusterManager_SetAddonsConfig_Handler, - }, - { - MethodName: "SetLocations", - Handler: _ClusterManager_SetLocations_Handler, - }, - { - MethodName: "UpdateMaster", - Handler: _ClusterManager_UpdateMaster_Handler, - }, - { - MethodName: "SetMasterAuth", - Handler: _ClusterManager_SetMasterAuth_Handler, - }, - { - MethodName: "DeleteCluster", - Handler: _ClusterManager_DeleteCluster_Handler, - }, - { - MethodName: "ListOperations", - Handler: _ClusterManager_ListOperations_Handler, - }, - { - MethodName: "GetOperation", - Handler: _ClusterManager_GetOperation_Handler, - }, - { - MethodName: "CancelOperation", - Handler: _ClusterManager_CancelOperation_Handler, - }, - { - MethodName: "GetServerConfig", - Handler: _ClusterManager_GetServerConfig_Handler, - }, - { - MethodName: "ListNodePools", - Handler: _ClusterManager_ListNodePools_Handler, - }, - { - MethodName: "GetNodePool", - Handler: _ClusterManager_GetNodePool_Handler, - }, - { - MethodName: "CreateNodePool", - Handler: _ClusterManager_CreateNodePool_Handler, - }, - { - MethodName: "DeleteNodePool", - Handler: _ClusterManager_DeleteNodePool_Handler, - }, - { - MethodName: "RollbackNodePoolUpgrade", - Handler: _ClusterManager_RollbackNodePoolUpgrade_Handler, - }, - { - MethodName: "SetNodePoolManagement", - Handler: _ClusterManager_SetNodePoolManagement_Handler, - }, - { - MethodName: "SetLabels", - Handler: _ClusterManager_SetLabels_Handler, - }, - { - MethodName: "SetLegacyAbac", - Handler: _ClusterManager_SetLegacyAbac_Handler, - }, - { - MethodName: "StartIPRotation", - Handler: _ClusterManager_StartIPRotation_Handler, - }, - { - MethodName: "CompleteIPRotation", - Handler: _ClusterManager_CompleteIPRotation_Handler, - }, - { - MethodName: "SetNodePoolSize", - Handler: _ClusterManager_SetNodePoolSize_Handler, - }, - { - MethodName: "SetNetworkPolicy", - Handler: _ClusterManager_SetNetworkPolicy_Handler, - }, - { - MethodName: "SetMaintenancePolicy", - Handler: _ClusterManager_SetMaintenancePolicy_Handler, - }, - { - MethodName: "ListUsableSubnetworks", - Handler: _ClusterManager_ListUsableSubnetworks_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/container/v1/cluster_service.proto", -} diff --git a/vendor/google.golang.org/genproto/googleapis/devtools/cloudtrace/v2/trace.pb.go b/vendor/google.golang.org/genproto/googleapis/devtools/cloudtrace/v2/trace.pb.go deleted file mode 100644 index 646304e8b..000000000 --- a/vendor/google.golang.org/genproto/googleapis/devtools/cloudtrace/v2/trace.pb.go +++ /dev/null @@ -1,1274 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/devtools/cloudtrace/v2/trace.proto - -package cloudtrace - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - timestamp "github.com/golang/protobuf/ptypes/timestamp" - wrappers "github.com/golang/protobuf/ptypes/wrappers" - _ "google.golang.org/genproto/googleapis/api/annotations" - status "google.golang.org/genproto/googleapis/rpc/status" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// Indicates whether the message was sent or received. -type Span_TimeEvent_MessageEvent_Type int32 - -const ( - // Unknown event type. - Span_TimeEvent_MessageEvent_TYPE_UNSPECIFIED Span_TimeEvent_MessageEvent_Type = 0 - // Indicates a sent message. - Span_TimeEvent_MessageEvent_SENT Span_TimeEvent_MessageEvent_Type = 1 - // Indicates a received message. - Span_TimeEvent_MessageEvent_RECEIVED Span_TimeEvent_MessageEvent_Type = 2 -) - -var Span_TimeEvent_MessageEvent_Type_name = map[int32]string{ - 0: "TYPE_UNSPECIFIED", - 1: "SENT", - 2: "RECEIVED", -} - -var Span_TimeEvent_MessageEvent_Type_value = map[string]int32{ - "TYPE_UNSPECIFIED": 0, - "SENT": 1, - "RECEIVED": 2, -} - -func (x Span_TimeEvent_MessageEvent_Type) String() string { - return proto.EnumName(Span_TimeEvent_MessageEvent_Type_name, int32(x)) -} - -func (Span_TimeEvent_MessageEvent_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{0, 1, 1, 0} -} - -// The relationship of the current span relative to the linked span: child, -// parent, or unspecified. -type Span_Link_Type int32 - -const ( - // The relationship of the two spans is unknown. - Span_Link_TYPE_UNSPECIFIED Span_Link_Type = 0 - // The linked span is a child of the current span. - Span_Link_CHILD_LINKED_SPAN Span_Link_Type = 1 - // The linked span is a parent of the current span. - Span_Link_PARENT_LINKED_SPAN Span_Link_Type = 2 -) - -var Span_Link_Type_name = map[int32]string{ - 0: "TYPE_UNSPECIFIED", - 1: "CHILD_LINKED_SPAN", - 2: "PARENT_LINKED_SPAN", -} - -var Span_Link_Type_value = map[string]int32{ - "TYPE_UNSPECIFIED": 0, - "CHILD_LINKED_SPAN": 1, - "PARENT_LINKED_SPAN": 2, -} - -func (x Span_Link_Type) String() string { - return proto.EnumName(Span_Link_Type_name, int32(x)) -} - -func (Span_Link_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{0, 3, 0} -} - -// A span represents a single operation within a trace. Spans can be -// nested to form a trace tree. Often, a trace contains a root span -// that describes the end-to-end latency, and one or more subspans for -// its sub-operations. A trace can also contain multiple root spans, -// or none at all. Spans do not need to be contiguous—there may be -// gaps or overlaps between spans in a trace. -type Span struct { - // The resource name of the span in the following format: - // - // projects/[PROJECT_ID]/traces/[TRACE_ID]/spans/[SPAN_ID] - // - // [TRACE_ID] is a unique identifier for a trace within a project; - // it is a 32-character hexadecimal encoding of a 16-byte array. - // - // [SPAN_ID] is a unique identifier for a span within a trace; it - // is a 16-character hexadecimal encoding of an 8-byte array. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The [SPAN_ID] portion of the span's resource name. - SpanId string `protobuf:"bytes,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"` - // The [SPAN_ID] of this span's parent span. If this is a root span, - // then this field must be empty. - ParentSpanId string `protobuf:"bytes,3,opt,name=parent_span_id,json=parentSpanId,proto3" json:"parent_span_id,omitempty"` - // A description of the span's operation (up to 128 bytes). - // Stackdriver Trace displays the description in the - // Google Cloud Platform Console. - // For example, the display name can be a qualified method name or a file name - // and a line number where the operation is called. A best practice is to use - // the same display name within an application and at the same call point. - // This makes it easier to correlate spans in different traces. - DisplayName *TruncatableString `protobuf:"bytes,4,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // The start time of the span. On the client side, this is the time kept by - // the local machine where the span execution starts. On the server side, this - // is the time when the server's application handler starts running. - StartTime *timestamp.Timestamp `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - // The end time of the span. On the client side, this is the time kept by - // the local machine where the span execution ends. On the server side, this - // is the time when the server application handler stops running. - EndTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` - // A set of attributes on the span. You can have up to 32 attributes per - // span. - Attributes *Span_Attributes `protobuf:"bytes,7,opt,name=attributes,proto3" json:"attributes,omitempty"` - // Stack trace captured at the start of the span. - StackTrace *StackTrace `protobuf:"bytes,8,opt,name=stack_trace,json=stackTrace,proto3" json:"stack_trace,omitempty"` - // A set of time events. You can have up to 32 annotations and 128 message - // events per span. - TimeEvents *Span_TimeEvents `protobuf:"bytes,9,opt,name=time_events,json=timeEvents,proto3" json:"time_events,omitempty"` - // Links associated with the span. You can have up to 128 links per Span. - Links *Span_Links `protobuf:"bytes,10,opt,name=links,proto3" json:"links,omitempty"` - // Optional. The final status for this span. - Status *status.Status `protobuf:"bytes,11,opt,name=status,proto3" json:"status,omitempty"` - // Optional. Set this parameter to indicate whether this span is in - // the same process as its parent. If you do not set this parameter, - // Stackdriver Trace is unable to take advantage of this helpful - // information. - SameProcessAsParentSpan *wrappers.BoolValue `protobuf:"bytes,12,opt,name=same_process_as_parent_span,json=sameProcessAsParentSpan,proto3" json:"same_process_as_parent_span,omitempty"` - // Optional. The number of child spans that were generated while this span - // was active. If set, allows implementation to detect missing child spans. - ChildSpanCount *wrappers.Int32Value `protobuf:"bytes,13,opt,name=child_span_count,json=childSpanCount,proto3" json:"child_span_count,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Span) Reset() { *m = Span{} } -func (m *Span) String() string { return proto.CompactTextString(m) } -func (*Span) ProtoMessage() {} -func (*Span) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{0} -} - -func (m *Span) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Span.Unmarshal(m, b) -} -func (m *Span) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Span.Marshal(b, m, deterministic) -} -func (m *Span) XXX_Merge(src proto.Message) { - xxx_messageInfo_Span.Merge(m, src) -} -func (m *Span) XXX_Size() int { - return xxx_messageInfo_Span.Size(m) -} -func (m *Span) XXX_DiscardUnknown() { - xxx_messageInfo_Span.DiscardUnknown(m) -} - -var xxx_messageInfo_Span proto.InternalMessageInfo - -func (m *Span) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Span) GetSpanId() string { - if m != nil { - return m.SpanId - } - return "" -} - -func (m *Span) GetParentSpanId() string { - if m != nil { - return m.ParentSpanId - } - return "" -} - -func (m *Span) GetDisplayName() *TruncatableString { - if m != nil { - return m.DisplayName - } - return nil -} - -func (m *Span) GetStartTime() *timestamp.Timestamp { - if m != nil { - return m.StartTime - } - return nil -} - -func (m *Span) GetEndTime() *timestamp.Timestamp { - if m != nil { - return m.EndTime - } - return nil -} - -func (m *Span) GetAttributes() *Span_Attributes { - if m != nil { - return m.Attributes - } - return nil -} - -func (m *Span) GetStackTrace() *StackTrace { - if m != nil { - return m.StackTrace - } - return nil -} - -func (m *Span) GetTimeEvents() *Span_TimeEvents { - if m != nil { - return m.TimeEvents - } - return nil -} - -func (m *Span) GetLinks() *Span_Links { - if m != nil { - return m.Links - } - return nil -} - -func (m *Span) GetStatus() *status.Status { - if m != nil { - return m.Status - } - return nil -} - -func (m *Span) GetSameProcessAsParentSpan() *wrappers.BoolValue { - if m != nil { - return m.SameProcessAsParentSpan - } - return nil -} - -func (m *Span) GetChildSpanCount() *wrappers.Int32Value { - if m != nil { - return m.ChildSpanCount - } - return nil -} - -// A set of attributes, each in the format `[KEY]:[VALUE]`. -type Span_Attributes struct { - // The set of attributes. Each attribute's key can be up to 128 bytes - // long. The value can be a string up to 256 bytes, a signed 64-bit integer, - // or the Boolean values `true` and `false`. For example: - // - // "/instance_id": "my-instance" - // "/http/user_agent": "" - // "/http/request_bytes": 300 - // "abc.com/myattribute": true - AttributeMap map[string]*AttributeValue `protobuf:"bytes,1,rep,name=attribute_map,json=attributeMap,proto3" json:"attribute_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // The number of attributes that were discarded. Attributes can be discarded - // because their keys are too long or because there are too many attributes. - // If this value is 0 then all attributes are valid. - DroppedAttributesCount int32 `protobuf:"varint,2,opt,name=dropped_attributes_count,json=droppedAttributesCount,proto3" json:"dropped_attributes_count,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Span_Attributes) Reset() { *m = Span_Attributes{} } -func (m *Span_Attributes) String() string { return proto.CompactTextString(m) } -func (*Span_Attributes) ProtoMessage() {} -func (*Span_Attributes) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{0, 0} -} - -func (m *Span_Attributes) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Span_Attributes.Unmarshal(m, b) -} -func (m *Span_Attributes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Span_Attributes.Marshal(b, m, deterministic) -} -func (m *Span_Attributes) XXX_Merge(src proto.Message) { - xxx_messageInfo_Span_Attributes.Merge(m, src) -} -func (m *Span_Attributes) XXX_Size() int { - return xxx_messageInfo_Span_Attributes.Size(m) -} -func (m *Span_Attributes) XXX_DiscardUnknown() { - xxx_messageInfo_Span_Attributes.DiscardUnknown(m) -} - -var xxx_messageInfo_Span_Attributes proto.InternalMessageInfo - -func (m *Span_Attributes) GetAttributeMap() map[string]*AttributeValue { - if m != nil { - return m.AttributeMap - } - return nil -} - -func (m *Span_Attributes) GetDroppedAttributesCount() int32 { - if m != nil { - return m.DroppedAttributesCount - } - return 0 -} - -// A time-stamped annotation or message event in the Span. -type Span_TimeEvent struct { - // The timestamp indicating the time the event occurred. - Time *timestamp.Timestamp `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"` - // A `TimeEvent` can contain either an `Annotation` object or a - // `MessageEvent` object, but not both. - // - // Types that are valid to be assigned to Value: - // *Span_TimeEvent_Annotation_ - // *Span_TimeEvent_MessageEvent_ - Value isSpan_TimeEvent_Value `protobuf_oneof:"value"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Span_TimeEvent) Reset() { *m = Span_TimeEvent{} } -func (m *Span_TimeEvent) String() string { return proto.CompactTextString(m) } -func (*Span_TimeEvent) ProtoMessage() {} -func (*Span_TimeEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{0, 1} -} - -func (m *Span_TimeEvent) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Span_TimeEvent.Unmarshal(m, b) -} -func (m *Span_TimeEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Span_TimeEvent.Marshal(b, m, deterministic) -} -func (m *Span_TimeEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Span_TimeEvent.Merge(m, src) -} -func (m *Span_TimeEvent) XXX_Size() int { - return xxx_messageInfo_Span_TimeEvent.Size(m) -} -func (m *Span_TimeEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Span_TimeEvent.DiscardUnknown(m) -} - -var xxx_messageInfo_Span_TimeEvent proto.InternalMessageInfo - -func (m *Span_TimeEvent) GetTime() *timestamp.Timestamp { - if m != nil { - return m.Time - } - return nil -} - -type isSpan_TimeEvent_Value interface { - isSpan_TimeEvent_Value() -} - -type Span_TimeEvent_Annotation_ struct { - Annotation *Span_TimeEvent_Annotation `protobuf:"bytes,2,opt,name=annotation,proto3,oneof"` -} - -type Span_TimeEvent_MessageEvent_ struct { - MessageEvent *Span_TimeEvent_MessageEvent `protobuf:"bytes,3,opt,name=message_event,json=messageEvent,proto3,oneof"` -} - -func (*Span_TimeEvent_Annotation_) isSpan_TimeEvent_Value() {} - -func (*Span_TimeEvent_MessageEvent_) isSpan_TimeEvent_Value() {} - -func (m *Span_TimeEvent) GetValue() isSpan_TimeEvent_Value { - if m != nil { - return m.Value - } - return nil -} - -func (m *Span_TimeEvent) GetAnnotation() *Span_TimeEvent_Annotation { - if x, ok := m.GetValue().(*Span_TimeEvent_Annotation_); ok { - return x.Annotation - } - return nil -} - -func (m *Span_TimeEvent) GetMessageEvent() *Span_TimeEvent_MessageEvent { - if x, ok := m.GetValue().(*Span_TimeEvent_MessageEvent_); ok { - return x.MessageEvent - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Span_TimeEvent) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Span_TimeEvent_Annotation_)(nil), - (*Span_TimeEvent_MessageEvent_)(nil), - } -} - -// Text annotation with a set of attributes. -type Span_TimeEvent_Annotation struct { - // A user-supplied message describing the event. The maximum length for - // the description is 256 bytes. - Description *TruncatableString `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` - // A set of attributes on the annotation. You can have up to 4 attributes - // per Annotation. - Attributes *Span_Attributes `protobuf:"bytes,2,opt,name=attributes,proto3" json:"attributes,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Span_TimeEvent_Annotation) Reset() { *m = Span_TimeEvent_Annotation{} } -func (m *Span_TimeEvent_Annotation) String() string { return proto.CompactTextString(m) } -func (*Span_TimeEvent_Annotation) ProtoMessage() {} -func (*Span_TimeEvent_Annotation) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{0, 1, 0} -} - -func (m *Span_TimeEvent_Annotation) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Span_TimeEvent_Annotation.Unmarshal(m, b) -} -func (m *Span_TimeEvent_Annotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Span_TimeEvent_Annotation.Marshal(b, m, deterministic) -} -func (m *Span_TimeEvent_Annotation) XXX_Merge(src proto.Message) { - xxx_messageInfo_Span_TimeEvent_Annotation.Merge(m, src) -} -func (m *Span_TimeEvent_Annotation) XXX_Size() int { - return xxx_messageInfo_Span_TimeEvent_Annotation.Size(m) -} -func (m *Span_TimeEvent_Annotation) XXX_DiscardUnknown() { - xxx_messageInfo_Span_TimeEvent_Annotation.DiscardUnknown(m) -} - -var xxx_messageInfo_Span_TimeEvent_Annotation proto.InternalMessageInfo - -func (m *Span_TimeEvent_Annotation) GetDescription() *TruncatableString { - if m != nil { - return m.Description - } - return nil -} - -func (m *Span_TimeEvent_Annotation) GetAttributes() *Span_Attributes { - if m != nil { - return m.Attributes - } - return nil -} - -// An event describing a message sent/received between Spans. -type Span_TimeEvent_MessageEvent struct { - // Type of MessageEvent. Indicates whether the message was sent or - // received. - Type Span_TimeEvent_MessageEvent_Type `protobuf:"varint,1,opt,name=type,proto3,enum=google.devtools.cloudtrace.v2.Span_TimeEvent_MessageEvent_Type" json:"type,omitempty"` - // An identifier for the MessageEvent's message that can be used to match - // SENT and RECEIVED MessageEvents. It is recommended to be unique within - // a Span. - Id int64 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` - // The number of uncompressed bytes sent or received. - UncompressedSizeBytes int64 `protobuf:"varint,3,opt,name=uncompressed_size_bytes,json=uncompressedSizeBytes,proto3" json:"uncompressed_size_bytes,omitempty"` - // The number of compressed bytes sent or received. If missing assumed to - // be the same size as uncompressed. - CompressedSizeBytes int64 `protobuf:"varint,4,opt,name=compressed_size_bytes,json=compressedSizeBytes,proto3" json:"compressed_size_bytes,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Span_TimeEvent_MessageEvent) Reset() { *m = Span_TimeEvent_MessageEvent{} } -func (m *Span_TimeEvent_MessageEvent) String() string { return proto.CompactTextString(m) } -func (*Span_TimeEvent_MessageEvent) ProtoMessage() {} -func (*Span_TimeEvent_MessageEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{0, 1, 1} -} - -func (m *Span_TimeEvent_MessageEvent) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Span_TimeEvent_MessageEvent.Unmarshal(m, b) -} -func (m *Span_TimeEvent_MessageEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Span_TimeEvent_MessageEvent.Marshal(b, m, deterministic) -} -func (m *Span_TimeEvent_MessageEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Span_TimeEvent_MessageEvent.Merge(m, src) -} -func (m *Span_TimeEvent_MessageEvent) XXX_Size() int { - return xxx_messageInfo_Span_TimeEvent_MessageEvent.Size(m) -} -func (m *Span_TimeEvent_MessageEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Span_TimeEvent_MessageEvent.DiscardUnknown(m) -} - -var xxx_messageInfo_Span_TimeEvent_MessageEvent proto.InternalMessageInfo - -func (m *Span_TimeEvent_MessageEvent) GetType() Span_TimeEvent_MessageEvent_Type { - if m != nil { - return m.Type - } - return Span_TimeEvent_MessageEvent_TYPE_UNSPECIFIED -} - -func (m *Span_TimeEvent_MessageEvent) GetId() int64 { - if m != nil { - return m.Id - } - return 0 -} - -func (m *Span_TimeEvent_MessageEvent) GetUncompressedSizeBytes() int64 { - if m != nil { - return m.UncompressedSizeBytes - } - return 0 -} - -func (m *Span_TimeEvent_MessageEvent) GetCompressedSizeBytes() int64 { - if m != nil { - return m.CompressedSizeBytes - } - return 0 -} - -// A collection of `TimeEvent`s. A `TimeEvent` is a time-stamped annotation -// on the span, consisting of either user-supplied key:value pairs, or -// details of a message sent/received between Spans. -type Span_TimeEvents struct { - // A collection of `TimeEvent`s. - TimeEvent []*Span_TimeEvent `protobuf:"bytes,1,rep,name=time_event,json=timeEvent,proto3" json:"time_event,omitempty"` - // The number of dropped annotations in all the included time events. - // If the value is 0, then no annotations were dropped. - DroppedAnnotationsCount int32 `protobuf:"varint,2,opt,name=dropped_annotations_count,json=droppedAnnotationsCount,proto3" json:"dropped_annotations_count,omitempty"` - // The number of dropped message events in all the included time events. - // If the value is 0, then no message events were dropped. - DroppedMessageEventsCount int32 `protobuf:"varint,3,opt,name=dropped_message_events_count,json=droppedMessageEventsCount,proto3" json:"dropped_message_events_count,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Span_TimeEvents) Reset() { *m = Span_TimeEvents{} } -func (m *Span_TimeEvents) String() string { return proto.CompactTextString(m) } -func (*Span_TimeEvents) ProtoMessage() {} -func (*Span_TimeEvents) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{0, 2} -} - -func (m *Span_TimeEvents) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Span_TimeEvents.Unmarshal(m, b) -} -func (m *Span_TimeEvents) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Span_TimeEvents.Marshal(b, m, deterministic) -} -func (m *Span_TimeEvents) XXX_Merge(src proto.Message) { - xxx_messageInfo_Span_TimeEvents.Merge(m, src) -} -func (m *Span_TimeEvents) XXX_Size() int { - return xxx_messageInfo_Span_TimeEvents.Size(m) -} -func (m *Span_TimeEvents) XXX_DiscardUnknown() { - xxx_messageInfo_Span_TimeEvents.DiscardUnknown(m) -} - -var xxx_messageInfo_Span_TimeEvents proto.InternalMessageInfo - -func (m *Span_TimeEvents) GetTimeEvent() []*Span_TimeEvent { - if m != nil { - return m.TimeEvent - } - return nil -} - -func (m *Span_TimeEvents) GetDroppedAnnotationsCount() int32 { - if m != nil { - return m.DroppedAnnotationsCount - } - return 0 -} - -func (m *Span_TimeEvents) GetDroppedMessageEventsCount() int32 { - if m != nil { - return m.DroppedMessageEventsCount - } - return 0 -} - -// A pointer from the current span to another span in the same trace or in a -// different trace. For example, this can be used in batching operations, -// where a single batch handler processes multiple requests from different -// traces or when the handler receives a request from a different project. -type Span_Link struct { - // The [TRACE_ID] for a trace within a project. - TraceId string `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` - // The [SPAN_ID] for a span within a trace. - SpanId string `protobuf:"bytes,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"` - // The relationship of the current span relative to the linked span. - Type Span_Link_Type `protobuf:"varint,3,opt,name=type,proto3,enum=google.devtools.cloudtrace.v2.Span_Link_Type" json:"type,omitempty"` - // A set of attributes on the link. You have have up to 32 attributes per - // link. - Attributes *Span_Attributes `protobuf:"bytes,4,opt,name=attributes,proto3" json:"attributes,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Span_Link) Reset() { *m = Span_Link{} } -func (m *Span_Link) String() string { return proto.CompactTextString(m) } -func (*Span_Link) ProtoMessage() {} -func (*Span_Link) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{0, 3} -} - -func (m *Span_Link) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Span_Link.Unmarshal(m, b) -} -func (m *Span_Link) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Span_Link.Marshal(b, m, deterministic) -} -func (m *Span_Link) XXX_Merge(src proto.Message) { - xxx_messageInfo_Span_Link.Merge(m, src) -} -func (m *Span_Link) XXX_Size() int { - return xxx_messageInfo_Span_Link.Size(m) -} -func (m *Span_Link) XXX_DiscardUnknown() { - xxx_messageInfo_Span_Link.DiscardUnknown(m) -} - -var xxx_messageInfo_Span_Link proto.InternalMessageInfo - -func (m *Span_Link) GetTraceId() string { - if m != nil { - return m.TraceId - } - return "" -} - -func (m *Span_Link) GetSpanId() string { - if m != nil { - return m.SpanId - } - return "" -} - -func (m *Span_Link) GetType() Span_Link_Type { - if m != nil { - return m.Type - } - return Span_Link_TYPE_UNSPECIFIED -} - -func (m *Span_Link) GetAttributes() *Span_Attributes { - if m != nil { - return m.Attributes - } - return nil -} - -// A collection of links, which are references from this span to a span -// in the same or different trace. -type Span_Links struct { - // A collection of links. - Link []*Span_Link `protobuf:"bytes,1,rep,name=link,proto3" json:"link,omitempty"` - // The number of dropped links after the maximum size was enforced. If - // this value is 0, then no links were dropped. - DroppedLinksCount int32 `protobuf:"varint,2,opt,name=dropped_links_count,json=droppedLinksCount,proto3" json:"dropped_links_count,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Span_Links) Reset() { *m = Span_Links{} } -func (m *Span_Links) String() string { return proto.CompactTextString(m) } -func (*Span_Links) ProtoMessage() {} -func (*Span_Links) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{0, 4} -} - -func (m *Span_Links) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Span_Links.Unmarshal(m, b) -} -func (m *Span_Links) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Span_Links.Marshal(b, m, deterministic) -} -func (m *Span_Links) XXX_Merge(src proto.Message) { - xxx_messageInfo_Span_Links.Merge(m, src) -} -func (m *Span_Links) XXX_Size() int { - return xxx_messageInfo_Span_Links.Size(m) -} -func (m *Span_Links) XXX_DiscardUnknown() { - xxx_messageInfo_Span_Links.DiscardUnknown(m) -} - -var xxx_messageInfo_Span_Links proto.InternalMessageInfo - -func (m *Span_Links) GetLink() []*Span_Link { - if m != nil { - return m.Link - } - return nil -} - -func (m *Span_Links) GetDroppedLinksCount() int32 { - if m != nil { - return m.DroppedLinksCount - } - return 0 -} - -// The allowed types for [VALUE] in a `[KEY]:[VALUE]` attribute. -type AttributeValue struct { - // The type of the value. - // - // Types that are valid to be assigned to Value: - // *AttributeValue_StringValue - // *AttributeValue_IntValue - // *AttributeValue_BoolValue - Value isAttributeValue_Value `protobuf_oneof:"value"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AttributeValue) Reset() { *m = AttributeValue{} } -func (m *AttributeValue) String() string { return proto.CompactTextString(m) } -func (*AttributeValue) ProtoMessage() {} -func (*AttributeValue) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{1} -} - -func (m *AttributeValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AttributeValue.Unmarshal(m, b) -} -func (m *AttributeValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AttributeValue.Marshal(b, m, deterministic) -} -func (m *AttributeValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_AttributeValue.Merge(m, src) -} -func (m *AttributeValue) XXX_Size() int { - return xxx_messageInfo_AttributeValue.Size(m) -} -func (m *AttributeValue) XXX_DiscardUnknown() { - xxx_messageInfo_AttributeValue.DiscardUnknown(m) -} - -var xxx_messageInfo_AttributeValue proto.InternalMessageInfo - -type isAttributeValue_Value interface { - isAttributeValue_Value() -} - -type AttributeValue_StringValue struct { - StringValue *TruncatableString `protobuf:"bytes,1,opt,name=string_value,json=stringValue,proto3,oneof"` -} - -type AttributeValue_IntValue struct { - IntValue int64 `protobuf:"varint,2,opt,name=int_value,json=intValue,proto3,oneof"` -} - -type AttributeValue_BoolValue struct { - BoolValue bool `protobuf:"varint,3,opt,name=bool_value,json=boolValue,proto3,oneof"` -} - -func (*AttributeValue_StringValue) isAttributeValue_Value() {} - -func (*AttributeValue_IntValue) isAttributeValue_Value() {} - -func (*AttributeValue_BoolValue) isAttributeValue_Value() {} - -func (m *AttributeValue) GetValue() isAttributeValue_Value { - if m != nil { - return m.Value - } - return nil -} - -func (m *AttributeValue) GetStringValue() *TruncatableString { - if x, ok := m.GetValue().(*AttributeValue_StringValue); ok { - return x.StringValue - } - return nil -} - -func (m *AttributeValue) GetIntValue() int64 { - if x, ok := m.GetValue().(*AttributeValue_IntValue); ok { - return x.IntValue - } - return 0 -} - -func (m *AttributeValue) GetBoolValue() bool { - if x, ok := m.GetValue().(*AttributeValue_BoolValue); ok { - return x.BoolValue - } - return false -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*AttributeValue) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*AttributeValue_StringValue)(nil), - (*AttributeValue_IntValue)(nil), - (*AttributeValue_BoolValue)(nil), - } -} - -// A call stack appearing in a trace. -type StackTrace struct { - // Stack frames in this stack trace. A maximum of 128 frames are allowed. - StackFrames *StackTrace_StackFrames `protobuf:"bytes,1,opt,name=stack_frames,json=stackFrames,proto3" json:"stack_frames,omitempty"` - // The hash ID is used to conserve network bandwidth for duplicate - // stack traces within a single trace. - // - // Often multiple spans will have identical stack traces. - // The first occurrence of a stack trace should contain both the - // `stackFrame` content and a value in `stackTraceHashId`. - // - // Subsequent spans within the same request can refer - // to that stack trace by only setting `stackTraceHashId`. - StackTraceHashId int64 `protobuf:"varint,2,opt,name=stack_trace_hash_id,json=stackTraceHashId,proto3" json:"stack_trace_hash_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StackTrace) Reset() { *m = StackTrace{} } -func (m *StackTrace) String() string { return proto.CompactTextString(m) } -func (*StackTrace) ProtoMessage() {} -func (*StackTrace) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{2} -} - -func (m *StackTrace) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StackTrace.Unmarshal(m, b) -} -func (m *StackTrace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StackTrace.Marshal(b, m, deterministic) -} -func (m *StackTrace) XXX_Merge(src proto.Message) { - xxx_messageInfo_StackTrace.Merge(m, src) -} -func (m *StackTrace) XXX_Size() int { - return xxx_messageInfo_StackTrace.Size(m) -} -func (m *StackTrace) XXX_DiscardUnknown() { - xxx_messageInfo_StackTrace.DiscardUnknown(m) -} - -var xxx_messageInfo_StackTrace proto.InternalMessageInfo - -func (m *StackTrace) GetStackFrames() *StackTrace_StackFrames { - if m != nil { - return m.StackFrames - } - return nil -} - -func (m *StackTrace) GetStackTraceHashId() int64 { - if m != nil { - return m.StackTraceHashId - } - return 0 -} - -// Represents a single stack frame in a stack trace. -type StackTrace_StackFrame struct { - // The fully-qualified name that uniquely identifies the function or - // method that is active in this frame (up to 1024 bytes). - FunctionName *TruncatableString `protobuf:"bytes,1,opt,name=function_name,json=functionName,proto3" json:"function_name,omitempty"` - // An un-mangled function name, if `function_name` is - // [mangled](http://www.avabodh.com/cxxin/namemangling.html). The name can - // be fully-qualified (up to 1024 bytes). - OriginalFunctionName *TruncatableString `protobuf:"bytes,2,opt,name=original_function_name,json=originalFunctionName,proto3" json:"original_function_name,omitempty"` - // The name of the source file where the function call appears (up to 256 - // bytes). - FileName *TruncatableString `protobuf:"bytes,3,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"` - // The line number in `file_name` where the function call appears. - LineNumber int64 `protobuf:"varint,4,opt,name=line_number,json=lineNumber,proto3" json:"line_number,omitempty"` - // The column number where the function call appears, if available. - // This is important in JavaScript because of its anonymous functions. - ColumnNumber int64 `protobuf:"varint,5,opt,name=column_number,json=columnNumber,proto3" json:"column_number,omitempty"` - // The binary module from where the code was loaded. - LoadModule *Module `protobuf:"bytes,6,opt,name=load_module,json=loadModule,proto3" json:"load_module,omitempty"` - // The version of the deployed source code (up to 128 bytes). - SourceVersion *TruncatableString `protobuf:"bytes,7,opt,name=source_version,json=sourceVersion,proto3" json:"source_version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StackTrace_StackFrame) Reset() { *m = StackTrace_StackFrame{} } -func (m *StackTrace_StackFrame) String() string { return proto.CompactTextString(m) } -func (*StackTrace_StackFrame) ProtoMessage() {} -func (*StackTrace_StackFrame) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{2, 0} -} - -func (m *StackTrace_StackFrame) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StackTrace_StackFrame.Unmarshal(m, b) -} -func (m *StackTrace_StackFrame) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StackTrace_StackFrame.Marshal(b, m, deterministic) -} -func (m *StackTrace_StackFrame) XXX_Merge(src proto.Message) { - xxx_messageInfo_StackTrace_StackFrame.Merge(m, src) -} -func (m *StackTrace_StackFrame) XXX_Size() int { - return xxx_messageInfo_StackTrace_StackFrame.Size(m) -} -func (m *StackTrace_StackFrame) XXX_DiscardUnknown() { - xxx_messageInfo_StackTrace_StackFrame.DiscardUnknown(m) -} - -var xxx_messageInfo_StackTrace_StackFrame proto.InternalMessageInfo - -func (m *StackTrace_StackFrame) GetFunctionName() *TruncatableString { - if m != nil { - return m.FunctionName - } - return nil -} - -func (m *StackTrace_StackFrame) GetOriginalFunctionName() *TruncatableString { - if m != nil { - return m.OriginalFunctionName - } - return nil -} - -func (m *StackTrace_StackFrame) GetFileName() *TruncatableString { - if m != nil { - return m.FileName - } - return nil -} - -func (m *StackTrace_StackFrame) GetLineNumber() int64 { - if m != nil { - return m.LineNumber - } - return 0 -} - -func (m *StackTrace_StackFrame) GetColumnNumber() int64 { - if m != nil { - return m.ColumnNumber - } - return 0 -} - -func (m *StackTrace_StackFrame) GetLoadModule() *Module { - if m != nil { - return m.LoadModule - } - return nil -} - -func (m *StackTrace_StackFrame) GetSourceVersion() *TruncatableString { - if m != nil { - return m.SourceVersion - } - return nil -} - -// A collection of stack frames, which can be truncated. -type StackTrace_StackFrames struct { - // Stack frames in this call stack. - Frame []*StackTrace_StackFrame `protobuf:"bytes,1,rep,name=frame,proto3" json:"frame,omitempty"` - // The number of stack frames that were dropped because there - // were too many stack frames. - // If this value is 0, then no stack frames were dropped. - DroppedFramesCount int32 `protobuf:"varint,2,opt,name=dropped_frames_count,json=droppedFramesCount,proto3" json:"dropped_frames_count,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StackTrace_StackFrames) Reset() { *m = StackTrace_StackFrames{} } -func (m *StackTrace_StackFrames) String() string { return proto.CompactTextString(m) } -func (*StackTrace_StackFrames) ProtoMessage() {} -func (*StackTrace_StackFrames) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{2, 1} -} - -func (m *StackTrace_StackFrames) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StackTrace_StackFrames.Unmarshal(m, b) -} -func (m *StackTrace_StackFrames) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StackTrace_StackFrames.Marshal(b, m, deterministic) -} -func (m *StackTrace_StackFrames) XXX_Merge(src proto.Message) { - xxx_messageInfo_StackTrace_StackFrames.Merge(m, src) -} -func (m *StackTrace_StackFrames) XXX_Size() int { - return xxx_messageInfo_StackTrace_StackFrames.Size(m) -} -func (m *StackTrace_StackFrames) XXX_DiscardUnknown() { - xxx_messageInfo_StackTrace_StackFrames.DiscardUnknown(m) -} - -var xxx_messageInfo_StackTrace_StackFrames proto.InternalMessageInfo - -func (m *StackTrace_StackFrames) GetFrame() []*StackTrace_StackFrame { - if m != nil { - return m.Frame - } - return nil -} - -func (m *StackTrace_StackFrames) GetDroppedFramesCount() int32 { - if m != nil { - return m.DroppedFramesCount - } - return 0 -} - -// Binary module. -type Module struct { - // For example: main binary, kernel modules, and dynamic libraries - // such as libc.so, sharedlib.so (up to 256 bytes). - Module *TruncatableString `protobuf:"bytes,1,opt,name=module,proto3" json:"module,omitempty"` - // A unique identifier for the module, usually a hash of its - // contents (up to 128 bytes). - BuildId *TruncatableString `protobuf:"bytes,2,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Module) Reset() { *m = Module{} } -func (m *Module) String() string { return proto.CompactTextString(m) } -func (*Module) ProtoMessage() {} -func (*Module) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{3} -} - -func (m *Module) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Module.Unmarshal(m, b) -} -func (m *Module) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Module.Marshal(b, m, deterministic) -} -func (m *Module) XXX_Merge(src proto.Message) { - xxx_messageInfo_Module.Merge(m, src) -} -func (m *Module) XXX_Size() int { - return xxx_messageInfo_Module.Size(m) -} -func (m *Module) XXX_DiscardUnknown() { - xxx_messageInfo_Module.DiscardUnknown(m) -} - -var xxx_messageInfo_Module proto.InternalMessageInfo - -func (m *Module) GetModule() *TruncatableString { - if m != nil { - return m.Module - } - return nil -} - -func (m *Module) GetBuildId() *TruncatableString { - if m != nil { - return m.BuildId - } - return nil -} - -// Represents a string that might be shortened to a specified length. -type TruncatableString struct { - // The shortened string. For example, if the original string is 500 - // bytes long and the limit of the string is 128 bytes, then - // `value` contains the first 128 bytes of the 500-byte string. - // - // Truncation always happens on a UTF8 character boundary. If there - // are multi-byte characters in the string, then the length of the - // shortened string might be less than the size limit. - Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - // The number of bytes removed from the original string. If this - // value is 0, then the string was not shortened. - TruncatedByteCount int32 `protobuf:"varint,2,opt,name=truncated_byte_count,json=truncatedByteCount,proto3" json:"truncated_byte_count,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TruncatableString) Reset() { *m = TruncatableString{} } -func (m *TruncatableString) String() string { return proto.CompactTextString(m) } -func (*TruncatableString) ProtoMessage() {} -func (*TruncatableString) Descriptor() ([]byte, []int) { - return fileDescriptor_29869cc16dc8ce61, []int{4} -} - -func (m *TruncatableString) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_TruncatableString.Unmarshal(m, b) -} -func (m *TruncatableString) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_TruncatableString.Marshal(b, m, deterministic) -} -func (m *TruncatableString) XXX_Merge(src proto.Message) { - xxx_messageInfo_TruncatableString.Merge(m, src) -} -func (m *TruncatableString) XXX_Size() int { - return xxx_messageInfo_TruncatableString.Size(m) -} -func (m *TruncatableString) XXX_DiscardUnknown() { - xxx_messageInfo_TruncatableString.DiscardUnknown(m) -} - -var xxx_messageInfo_TruncatableString proto.InternalMessageInfo - -func (m *TruncatableString) GetValue() string { - if m != nil { - return m.Value - } - return "" -} - -func (m *TruncatableString) GetTruncatedByteCount() int32 { - if m != nil { - return m.TruncatedByteCount - } - return 0 -} - -func init() { - proto.RegisterEnum("google.devtools.cloudtrace.v2.Span_TimeEvent_MessageEvent_Type", Span_TimeEvent_MessageEvent_Type_name, Span_TimeEvent_MessageEvent_Type_value) - proto.RegisterEnum("google.devtools.cloudtrace.v2.Span_Link_Type", Span_Link_Type_name, Span_Link_Type_value) - proto.RegisterType((*Span)(nil), "google.devtools.cloudtrace.v2.Span") - proto.RegisterType((*Span_Attributes)(nil), "google.devtools.cloudtrace.v2.Span.Attributes") - proto.RegisterMapType((map[string]*AttributeValue)(nil), "google.devtools.cloudtrace.v2.Span.Attributes.AttributeMapEntry") - proto.RegisterType((*Span_TimeEvent)(nil), "google.devtools.cloudtrace.v2.Span.TimeEvent") - proto.RegisterType((*Span_TimeEvent_Annotation)(nil), "google.devtools.cloudtrace.v2.Span.TimeEvent.Annotation") - proto.RegisterType((*Span_TimeEvent_MessageEvent)(nil), "google.devtools.cloudtrace.v2.Span.TimeEvent.MessageEvent") - proto.RegisterType((*Span_TimeEvents)(nil), "google.devtools.cloudtrace.v2.Span.TimeEvents") - proto.RegisterType((*Span_Link)(nil), "google.devtools.cloudtrace.v2.Span.Link") - proto.RegisterType((*Span_Links)(nil), "google.devtools.cloudtrace.v2.Span.Links") - proto.RegisterType((*AttributeValue)(nil), "google.devtools.cloudtrace.v2.AttributeValue") - proto.RegisterType((*StackTrace)(nil), "google.devtools.cloudtrace.v2.StackTrace") - proto.RegisterType((*StackTrace_StackFrame)(nil), "google.devtools.cloudtrace.v2.StackTrace.StackFrame") - proto.RegisterType((*StackTrace_StackFrames)(nil), "google.devtools.cloudtrace.v2.StackTrace.StackFrames") - proto.RegisterType((*Module)(nil), "google.devtools.cloudtrace.v2.Module") - proto.RegisterType((*TruncatableString)(nil), "google.devtools.cloudtrace.v2.TruncatableString") -} - -func init() { - proto.RegisterFile("google/devtools/cloudtrace/v2/trace.proto", fileDescriptor_29869cc16dc8ce61) -} - -var fileDescriptor_29869cc16dc8ce61 = []byte{ - // 1521 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x4b, 0x6f, 0xdb, 0xc6, - 0x16, 0x36, 0xf5, 0xb0, 0xa5, 0x23, 0xd9, 0x90, 0xc7, 0x76, 0xac, 0x28, 0xcf, 0xeb, 0x7b, 0x2f, - 0xe0, 0x2c, 0x4c, 0x06, 0x4a, 0xee, 0x45, 0xe0, 0x7b, 0xd1, 0x54, 0xb6, 0xe5, 0x48, 0x89, 0xad, - 0x0a, 0x94, 0xe3, 0xb6, 0x69, 0x0a, 0x62, 0x44, 0x8e, 0x65, 0x36, 0x14, 0x49, 0x70, 0x48, 0x17, - 0x4e, 0x90, 0x45, 0xd7, 0x5d, 0x77, 0x53, 0xa0, 0xe8, 0xb2, 0x40, 0x56, 0xf9, 0x1d, 0x5d, 0x74, - 0xdb, 0x6d, 0xd7, 0xfd, 0x03, 0xdd, 0x16, 0xf3, 0xe0, 0x43, 0x79, 0xd9, 0x56, 0x56, 0xe2, 0x9c, - 0x73, 0xbe, 0x6f, 0xe6, 0xcc, 0x9c, 0x97, 0x0d, 0xb7, 0x46, 0x9e, 0x37, 0x72, 0x88, 0x66, 0x91, - 0x93, 0xd0, 0xf3, 0x1c, 0xaa, 0x99, 0x8e, 0x17, 0x59, 0x61, 0x80, 0x4d, 0xa2, 0x9d, 0x34, 0x35, - 0xfe, 0xa1, 0xfa, 0x81, 0x17, 0x7a, 0xe8, 0x9a, 0x30, 0x55, 0x63, 0x53, 0x35, 0x35, 0x55, 0x4f, - 0x9a, 0x8d, 0xab, 0x92, 0x09, 0xfb, 0xb6, 0x86, 0x5d, 0xd7, 0x0b, 0x71, 0x68, 0x7b, 0x2e, 0x15, - 0xe0, 0xc6, 0x8d, 0x8c, 0xf6, 0xc8, 0x26, 0x8e, 0x65, 0x0c, 0xc9, 0x31, 0x3e, 0xb1, 0xbd, 0x40, - 0x1a, 0x5c, 0xce, 0x18, 0x04, 0x84, 0x7a, 0x51, 0x10, 0x6f, 0x9c, 0x60, 0xf9, 0x6a, 0x18, 0x1d, - 0x69, 0xa1, 0x3d, 0x26, 0x34, 0xc4, 0x63, 0x5f, 0x1a, 0x5c, 0x7f, 0xd3, 0xe0, 0xdb, 0x00, 0xfb, - 0x3e, 0x09, 0xe2, 0xcd, 0x57, 0xa5, 0x3e, 0xf0, 0x4d, 0x8d, 0x86, 0x38, 0x8c, 0xa4, 0x62, 0xed, - 0xaf, 0x25, 0x28, 0x0c, 0x7c, 0xec, 0xa2, 0x55, 0x28, 0xb8, 0x78, 0x4c, 0xea, 0xca, 0x4d, 0x65, - 0xbd, 0xbc, 0x95, 0xff, 0xa3, 0x95, 0xd3, 0xb9, 0x00, 0x5d, 0x85, 0x39, 0xea, 0x63, 0xd7, 0xb0, - 0xad, 0x7a, 0x2e, 0xd5, 0xcd, 0x32, 0x59, 0xd7, 0x42, 0xff, 0x82, 0x05, 0x1f, 0x07, 0xc4, 0x0d, - 0x8d, 0xd8, 0x28, 0xcf, 0x8c, 0xf4, 0xaa, 0x90, 0x0e, 0x84, 0xd5, 0x17, 0x50, 0xb5, 0x6c, 0xea, - 0x3b, 0xf8, 0xd4, 0xe0, 0x9b, 0x14, 0x6e, 0x2a, 0xeb, 0x95, 0xe6, 0x6d, 0xf5, 0x83, 0xf7, 0xa9, - 0x1e, 0x04, 0x91, 0x6b, 0xe2, 0x10, 0x0f, 0x1d, 0x32, 0x08, 0x03, 0xdb, 0x1d, 0x89, 0xad, 0x2b, - 0x92, 0xaa, 0xc7, 0x4e, 0xf7, 0x09, 0x00, 0x0d, 0x71, 0x10, 0x1a, 0xec, 0x46, 0xea, 0x45, 0xce, - 0xdb, 0x88, 0x79, 0xe3, 0xdb, 0x50, 0x0f, 0xe2, 0xeb, 0x12, 0x0c, 0x65, 0x0e, 0x61, 0x42, 0xb4, - 0x09, 0x25, 0xe2, 0x5a, 0x02, 0x3d, 0x7b, 0x3e, 0xf4, 0x1c, 0x71, 0x2d, 0x8e, 0xed, 0x01, 0xe0, - 0x30, 0x0c, 0xec, 0x61, 0x14, 0x12, 0x5a, 0x9f, 0xe3, 0x68, 0xf5, 0x0c, 0x9f, 0xd8, 0x85, 0xa8, - 0xad, 0x04, 0xa5, 0x67, 0x18, 0xd0, 0x43, 0xa8, 0xd0, 0x10, 0x9b, 0xcf, 0x0c, 0x6e, 0x5d, 0x2f, - 0x71, 0xc2, 0x5b, 0x67, 0x11, 0x32, 0xc4, 0x01, 0x5b, 0xe9, 0x40, 0x93, 0x6f, 0xf4, 0x19, 0x54, - 0x98, 0x4f, 0x06, 0x39, 0x21, 0x6e, 0x48, 0xeb, 0xe5, 0xf3, 0x1f, 0x8e, 0xb9, 0xd6, 0xe6, 0x28, - 0x1d, 0xc2, 0xe4, 0x1b, 0xdd, 0x87, 0xa2, 0x63, 0xbb, 0xcf, 0x68, 0x1d, 0xce, 0x77, 0x2c, 0x46, - 0xb5, 0xc7, 0x00, 0xba, 0xc0, 0x21, 0x0d, 0x66, 0x45, 0xe4, 0xd5, 0x2b, 0x9c, 0x01, 0xc5, 0x0c, - 0x81, 0x6f, 0x32, 0x2f, 0xc2, 0x88, 0xb2, 0xfb, 0x55, 0x74, 0x69, 0x86, 0xbe, 0x86, 0x2b, 0x14, - 0x8f, 0x89, 0xe1, 0x07, 0x9e, 0x49, 0x28, 0x35, 0x30, 0x35, 0x32, 0xa1, 0x56, 0xaf, 0xbe, 0xe7, - 0xb5, 0xb6, 0x3c, 0xcf, 0x39, 0xc4, 0x4e, 0x44, 0x04, 0xdb, 0x2a, 0xe3, 0xe8, 0x0b, 0x8a, 0x16, - 0xed, 0x27, 0x51, 0x89, 0x1e, 0x42, 0xcd, 0x3c, 0xb6, 0x1d, 0x4b, 0x04, 0xae, 0xe9, 0x45, 0x6e, - 0x58, 0x9f, 0xe7, 0x9c, 0x57, 0xde, 0xe2, 0xec, 0xba, 0xe1, 0x9d, 0x66, 0x86, 0x74, 0x81, 0x23, - 0x19, 0xcd, 0x36, 0xc3, 0x35, 0x7e, 0xca, 0x01, 0xa4, 0x8f, 0x8a, 0x08, 0xcc, 0x27, 0xcf, 0x6a, - 0x8c, 0xb1, 0x5f, 0x57, 0x6e, 0xe6, 0xd7, 0x2b, 0xcd, 0x4f, 0x2f, 0x16, 0x1b, 0xe9, 0xe7, 0x3e, - 0xf6, 0xdb, 0x6e, 0x18, 0x9c, 0xea, 0x55, 0x9c, 0x11, 0xa1, 0x7b, 0x50, 0xb7, 0x02, 0xcf, 0xf7, - 0x89, 0x65, 0xa4, 0x51, 0x24, 0x3d, 0x61, 0xa9, 0x5a, 0xd4, 0x2f, 0x49, 0x7d, 0x4a, 0x2a, 0xce, - 0xeb, 0xc2, 0xe2, 0x5b, 0xe4, 0xa8, 0x06, 0xf9, 0x67, 0xe4, 0x54, 0x14, 0x00, 0x9d, 0x7d, 0xa2, - 0x6d, 0x28, 0x9e, 0x30, 0xa7, 0x39, 0x5b, 0xa5, 0xb9, 0x71, 0xc6, 0xf9, 0x13, 0x4a, 0x7e, 0x53, - 0xba, 0xc0, 0x6e, 0xe6, 0xee, 0x29, 0x8d, 0xdf, 0x8a, 0x50, 0x4e, 0xe2, 0x0a, 0xa9, 0x50, 0xe0, - 0xf9, 0xa6, 0x9c, 0x95, 0x6f, 0x3a, 0xb7, 0x43, 0x4f, 0x00, 0xd2, 0x72, 0x2a, 0xcf, 0x72, 0xef, - 0x42, 0xa1, 0xac, 0xb6, 0x12, 0x7c, 0x67, 0x46, 0xcf, 0xb0, 0x21, 0x0c, 0xf3, 0x63, 0x42, 0x29, - 0x1e, 0xc9, 0x54, 0xe1, 0xe5, 0xab, 0xd2, 0xdc, 0xbc, 0x18, 0xfd, 0xbe, 0xa0, 0xe0, 0x8b, 0xce, - 0x8c, 0x5e, 0x1d, 0x67, 0xd6, 0x8d, 0xd7, 0x0a, 0x40, 0xba, 0x3f, 0xd2, 0xa1, 0x62, 0x11, 0x6a, - 0x06, 0xb6, 0xcf, 0xdd, 0x51, 0xa6, 0x2b, 0x85, 0x7a, 0x96, 0xe4, 0x8d, 0x4a, 0x94, 0xfb, 0xd8, - 0x4a, 0xd4, 0xf8, 0x21, 0x07, 0xd5, 0xac, 0x4f, 0x68, 0x00, 0x85, 0xf0, 0xd4, 0x17, 0x4f, 0xb6, - 0xd0, 0xbc, 0x3f, 0xfd, 0xed, 0xa8, 0x07, 0xa7, 0x3e, 0xd1, 0x39, 0x19, 0x5a, 0x80, 0x9c, 0x6c, - 0x2a, 0x79, 0x3d, 0x67, 0x5b, 0xe8, 0xbf, 0xb0, 0x1a, 0xb9, 0xa6, 0x37, 0xf6, 0x03, 0x42, 0x29, - 0xb1, 0x0c, 0x6a, 0x3f, 0x27, 0xc6, 0xf0, 0x94, 0xb9, 0x94, 0xe7, 0x46, 0x2b, 0x59, 0xf5, 0xc0, - 0x7e, 0x4e, 0xb6, 0x98, 0x12, 0x35, 0x61, 0xe5, 0xdd, 0xa8, 0x02, 0x47, 0x2d, 0xbd, 0x03, 0xb3, - 0x76, 0x17, 0x0a, 0xec, 0x24, 0x68, 0x19, 0x6a, 0x07, 0x5f, 0xf6, 0xdb, 0xc6, 0xe3, 0xde, 0xa0, - 0xdf, 0xde, 0xee, 0xee, 0x76, 0xdb, 0x3b, 0xb5, 0x19, 0x54, 0x82, 0xc2, 0xa0, 0xdd, 0x3b, 0xa8, - 0x29, 0xa8, 0x0a, 0x25, 0xbd, 0xbd, 0xdd, 0xee, 0x1e, 0xb6, 0x77, 0x6a, 0xb9, 0xad, 0x39, 0x99, - 0x10, 0x8d, 0xdf, 0x15, 0x80, 0xb4, 0x50, 0xa2, 0x3d, 0x80, 0xb4, 0xda, 0xca, 0x6c, 0xdf, 0xb8, - 0xd0, 0x25, 0xe9, 0xe5, 0xa4, 0xd6, 0xa2, 0x4d, 0xb8, 0x9c, 0xe4, 0x75, 0x3a, 0x46, 0x4c, 0x24, - 0xf6, 0x6a, 0x9c, 0xd8, 0xa9, 0x9e, 0x67, 0x36, 0xba, 0x0f, 0x57, 0x63, 0xec, 0x44, 0x5c, 0xc7, - 0xf0, 0x3c, 0x87, 0xc7, 0xfc, 0xd9, 0x97, 0x91, 0xa5, 0xe1, 0xc7, 0x1c, 0x14, 0x58, 0xdd, 0x46, - 0x97, 0xa1, 0xc4, 0xcf, 0xca, 0x7a, 0xba, 0xa8, 0x09, 0x73, 0x7c, 0xdd, 0xb5, 0xd0, 0xea, 0x1b, - 0x23, 0x41, 0x32, 0x0d, 0xb4, 0x64, 0x98, 0xe4, 0x79, 0x98, 0x6c, 0x9c, 0xb7, 0x47, 0x64, 0x83, - 0x62, 0x32, 0x94, 0x0b, 0x1f, 0x1b, 0xca, 0x6b, 0x8f, 0x3e, 0xf8, 0xd0, 0x2b, 0xb0, 0xb8, 0xdd, - 0xe9, 0xee, 0xed, 0x18, 0x7b, 0xdd, 0xde, 0xa3, 0xf6, 0x8e, 0x31, 0xe8, 0xb7, 0x7a, 0x35, 0x05, - 0x5d, 0x02, 0xd4, 0x6f, 0xe9, 0xed, 0xde, 0xc1, 0x84, 0x3c, 0xd7, 0x88, 0xa0, 0xc8, 0x7b, 0x1a, - 0xfa, 0x3f, 0x14, 0x58, 0x57, 0x93, 0x4f, 0xbd, 0x7e, 0x5e, 0x47, 0x75, 0x8e, 0x42, 0x2a, 0x2c, - 0xc5, 0x8f, 0xc4, 0x7b, 0xe3, 0xc4, 0xd3, 0x2e, 0x4a, 0x15, 0xdf, 0x88, 0xbf, 0xc9, 0xe6, 0xe0, - 0xcf, 0x56, 0x1f, 0xae, 0x67, 0x38, 0xc5, 0x76, 0xd8, 0xb7, 0xa9, 0x6a, 0x7a, 0x63, 0x8d, 0xf7, - 0x33, 0x56, 0x3f, 0xbf, 0x21, 0x66, 0x48, 0xb5, 0x17, 0xf2, 0xeb, 0xa5, 0x18, 0x5e, 0xa9, 0xf6, - 0x82, 0xff, 0xbe, 0xd4, 0xd8, 0x2b, 0x51, 0xed, 0x05, 0xfb, 0x79, 0xb9, 0xf6, 0x5a, 0x81, 0x85, - 0xc9, 0x8a, 0x8d, 0x1e, 0x43, 0x95, 0xf2, 0xea, 0x62, 0x88, 0xb2, 0x3f, 0x65, 0x6d, 0xea, 0xcc, - 0xe8, 0x15, 0xc1, 0x23, 0x68, 0xaf, 0x41, 0xd9, 0x76, 0x43, 0x23, 0x6d, 0x25, 0xf9, 0xce, 0x8c, - 0x5e, 0xb2, 0xdd, 0x50, 0xa8, 0x6f, 0x00, 0x0c, 0x3d, 0xcf, 0x91, 0x7a, 0x16, 0x3a, 0xa5, 0xce, - 0x8c, 0x5e, 0x1e, 0x26, 0x7d, 0x3c, 0xce, 0xba, 0xb5, 0x5f, 0x66, 0x01, 0xd2, 0x79, 0x87, 0x4d, - 0x95, 0x62, 0x5e, 0x3a, 0x0a, 0xf0, 0x98, 0x50, 0x79, 0xdc, 0xff, 0x9c, 0x7b, 0x60, 0x12, 0x9f, - 0xbb, 0x1c, 0xac, 0x8b, 0xd1, 0x4b, 0x2c, 0xd0, 0x06, 0x2c, 0x65, 0x26, 0x31, 0xe3, 0x18, 0xd3, - 0x63, 0x23, 0x29, 0x55, 0xb5, 0x74, 0xcc, 0xea, 0x60, 0x7a, 0xdc, 0xb5, 0x1a, 0xdf, 0x15, 0xe4, - 0xb9, 0x38, 0x1c, 0x3d, 0x86, 0xf9, 0xa3, 0xc8, 0x35, 0x59, 0x56, 0x1a, 0xc9, 0x4c, 0x3d, 0x4d, - 0x8d, 0xaf, 0xc6, 0x34, 0x7c, 0xd4, 0x3d, 0x82, 0x4b, 0x5e, 0x60, 0x8f, 0x6c, 0x17, 0x3b, 0xc6, - 0x24, 0x7f, 0x6e, 0x4a, 0xfe, 0xe5, 0x98, 0x6f, 0x37, 0xbb, 0xcf, 0x3e, 0x94, 0x8f, 0x6c, 0x87, - 0x08, 0xea, 0xfc, 0x94, 0xd4, 0x25, 0x46, 0xc1, 0xe9, 0x6e, 0x40, 0xc5, 0xb1, 0x5d, 0x62, 0xb8, - 0xd1, 0x78, 0x48, 0x02, 0x59, 0x93, 0x81, 0x89, 0x7a, 0x5c, 0x82, 0xfe, 0x09, 0xf3, 0xa6, 0xe7, - 0x44, 0x63, 0x37, 0x36, 0x29, 0x72, 0x93, 0xaa, 0x10, 0x4a, 0xa3, 0x5d, 0xa8, 0x38, 0x1e, 0xb6, - 0x8c, 0xb1, 0x67, 0x45, 0x4e, 0x3c, 0xaa, 0xff, 0xfb, 0x8c, 0x63, 0xed, 0x73, 0x63, 0x1d, 0x18, - 0x52, 0x7c, 0xa3, 0xcf, 0x61, 0x41, 0xfc, 0x65, 0x65, 0x9c, 0x90, 0x80, 0xb2, 0x06, 0x3c, 0x37, - 0xa5, 0x87, 0xf3, 0x82, 0xe7, 0x50, 0xd0, 0x34, 0xbe, 0x57, 0xa0, 0x92, 0x89, 0x27, 0xf4, 0x10, - 0x8a, 0x3c, 0x2c, 0x65, 0x89, 0xb8, 0x3b, 0x4d, 0x54, 0xea, 0x82, 0x02, 0xdd, 0x86, 0xe5, 0xb8, - 0x5e, 0x88, 0x50, 0x9f, 0x28, 0x18, 0x48, 0xea, 0xc4, 0xc6, 0xbc, 0x62, 0xac, 0xfd, 0xac, 0xc0, - 0xac, 0xf4, 0xb8, 0x03, 0xb3, 0xf2, 0xd2, 0xa6, 0x0d, 0x43, 0x89, 0x47, 0x8f, 0xa0, 0x34, 0x8c, - 0xd8, 0xc4, 0x2c, 0x53, 0x61, 0x1a, 0xae, 0x39, 0xce, 0xd0, 0xb5, 0xd6, 0xbe, 0x82, 0xc5, 0xb7, - 0xb4, 0x68, 0x39, 0x1e, 0x38, 0x45, 0xc3, 0x11, 0x0b, 0xe6, 0x7e, 0x28, 0x4c, 0x89, 0xc5, 0x3b, - 0xfb, 0xa4, 0xfb, 0x89, 0x8e, 0x75, 0x76, 0xee, 0xfe, 0xd6, 0x2b, 0x05, 0xfe, 0x61, 0x7a, 0xe3, - 0x0f, 0x9f, 0x6e, 0x0b, 0xf8, 0x7d, 0xf7, 0xd9, 0xd8, 0xd9, 0x57, 0x9e, 0x3c, 0x90, 0xc6, 0x23, - 0xcf, 0xc1, 0xee, 0x48, 0xf5, 0x82, 0x91, 0x36, 0x22, 0x2e, 0x1f, 0x4a, 0xb5, 0xb4, 0xde, 0xbe, - 0xe7, 0xdf, 0x04, 0xff, 0x4b, 0x57, 0xaf, 0x72, 0x2b, 0x0f, 0x04, 0xd3, 0x36, 0x93, 0xa9, 0xe2, - 0x51, 0x0f, 0x9b, 0xbf, 0xc6, 0xf2, 0xa7, 0x5c, 0xfe, 0x94, 0xcb, 0x9f, 0x1e, 0x36, 0x87, 0xb3, - 0x7c, 0x8f, 0x3b, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x31, 0x4c, 0x19, 0x89, 0x10, 0x00, - 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/devtools/cloudtrace/v2/tracing.pb.go b/vendor/google.golang.org/genproto/googleapis/devtools/cloudtrace/v2/tracing.pb.go deleted file mode 100644 index a87b00d51..000000000 --- a/vendor/google.golang.org/genproto/googleapis/devtools/cloudtrace/v2/tracing.pb.go +++ /dev/null @@ -1,249 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/devtools/cloudtrace/v2/tracing.proto - -package cloudtrace - -import ( - context "context" - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - empty "github.com/golang/protobuf/ptypes/empty" - _ "github.com/golang/protobuf/ptypes/timestamp" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The request message for the `BatchWriteSpans` method. -type BatchWriteSpansRequest struct { - // Required. The name of the project where the spans belong. The format is - // `projects/[PROJECT_ID]`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Required. A list of new spans. The span names must not match existing - // spans, or the results are undefined. - Spans []*Span `protobuf:"bytes,2,rep,name=spans,proto3" json:"spans,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BatchWriteSpansRequest) Reset() { *m = BatchWriteSpansRequest{} } -func (m *BatchWriteSpansRequest) String() string { return proto.CompactTextString(m) } -func (*BatchWriteSpansRequest) ProtoMessage() {} -func (*BatchWriteSpansRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d1f9b588db05fdc6, []int{0} -} - -func (m *BatchWriteSpansRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BatchWriteSpansRequest.Unmarshal(m, b) -} -func (m *BatchWriteSpansRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BatchWriteSpansRequest.Marshal(b, m, deterministic) -} -func (m *BatchWriteSpansRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_BatchWriteSpansRequest.Merge(m, src) -} -func (m *BatchWriteSpansRequest) XXX_Size() int { - return xxx_messageInfo_BatchWriteSpansRequest.Size(m) -} -func (m *BatchWriteSpansRequest) XXX_DiscardUnknown() { - xxx_messageInfo_BatchWriteSpansRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_BatchWriteSpansRequest proto.InternalMessageInfo - -func (m *BatchWriteSpansRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *BatchWriteSpansRequest) GetSpans() []*Span { - if m != nil { - return m.Spans - } - return nil -} - -func init() { - proto.RegisterType((*BatchWriteSpansRequest)(nil), "google.devtools.cloudtrace.v2.BatchWriteSpansRequest") -} - -func init() { - proto.RegisterFile("google/devtools/cloudtrace/v2/tracing.proto", fileDescriptor_d1f9b588db05fdc6) -} - -var fileDescriptor_d1f9b588db05fdc6 = []byte{ - // 534 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xc1, 0x6e, 0x13, 0x3d, - 0x10, 0xc7, 0xb5, 0xc9, 0xf7, 0x21, 0x61, 0x90, 0x90, 0x56, 0xa2, 0xb4, 0x01, 0x44, 0x09, 0x12, - 0x94, 0x24, 0xb5, 0xc5, 0x56, 0x5c, 0x82, 0x00, 0x6d, 0x2a, 0x94, 0x6b, 0x94, 0xa2, 0x22, 0x41, - 0x24, 0xe4, 0x6c, 0x26, 0x1b, 0xa3, 0x5d, 0xdb, 0xd8, 0xce, 0x46, 0x80, 0x7a, 0xe1, 0xc6, 0x99, - 0x27, 0xe8, 0x15, 0xf1, 0x04, 0x3c, 0x42, 0x8f, 0x70, 0xe3, 0xd4, 0x03, 0x4f, 0xc1, 0x09, 0xad, - 0xbd, 0xdb, 0x84, 0xa8, 0x34, 0xbd, 0xad, 0x67, 0xfe, 0x9e, 0xf9, 0xcd, 0xfc, 0xbd, 0xa8, 0x19, - 0x0b, 0x11, 0x27, 0x40, 0x46, 0x90, 0x19, 0x21, 0x12, 0x4d, 0xa2, 0x44, 0x4c, 0x47, 0x46, 0xd1, - 0x08, 0x48, 0x16, 0x90, 0xfc, 0x83, 0xf1, 0x18, 0x4b, 0x25, 0x8c, 0xf0, 0x6f, 0x3a, 0x31, 0x2e, - 0xc5, 0x78, 0x2e, 0xc6, 0x59, 0x50, 0xbb, 0x51, 0xd4, 0xa2, 0x92, 0x11, 0xca, 0xb9, 0x30, 0xd4, - 0x30, 0xc1, 0xb5, 0xbb, 0x5c, 0xbb, 0xb6, 0x90, 0x8d, 0x12, 0x06, 0xdc, 0x14, 0x89, 0x5b, 0x0b, - 0x89, 0x31, 0x83, 0x64, 0xf4, 0x7a, 0x08, 0x13, 0x9a, 0x31, 0xa1, 0x0a, 0xc1, 0xc6, 0x82, 0x40, - 0x81, 0x16, 0x53, 0x15, 0x41, 0x91, 0xba, 0xbf, 0x1a, 0xbf, 0x94, 0x5e, 0x2f, 0xa4, 0xf6, 0x34, - 0x9c, 0x8e, 0x09, 0xa4, 0xd2, 0xbc, 0x5b, 0x62, 0x38, 0x49, 0x1a, 0x96, 0x82, 0x36, 0x34, 0x95, - 0x4e, 0x50, 0x3f, 0xf4, 0xd0, 0x5a, 0x87, 0x9a, 0x68, 0xf2, 0x42, 0x31, 0x03, 0x7b, 0x92, 0x72, - 0xdd, 0x87, 0xb7, 0x53, 0xd0, 0xc6, 0xef, 0xa2, 0xff, 0x38, 0x4d, 0x61, 0xdd, 0xdb, 0xf4, 0xb6, - 0x2e, 0x76, 0x76, 0x8e, 0xc3, 0xca, 0xef, 0x70, 0x1b, 0x35, 0x2d, 0x49, 0x89, 0x9b, 0x52, 0x4e, - 0x63, 0x50, 0xd8, 0xb5, 0xa1, 0x92, 0x69, 0x1c, 0x89, 0x94, 0xf4, 0x94, 0x78, 0x03, 0x91, 0xe9, - 0xdb, 0x02, 0xfe, 0x13, 0xf4, 0xbf, 0xce, 0x0b, 0xaf, 0x57, 0x36, 0xab, 0x5b, 0x97, 0x82, 0x3b, - 0xf8, 0xcc, 0x75, 0xe3, 0x1c, 0xa2, 0x53, 0x3d, 0x0e, 0x2b, 0x7d, 0x77, 0x2d, 0xf8, 0x56, 0x45, - 0x97, 0x9f, 0xe7, 0xd9, 0x3d, 0x50, 0x19, 0x8b, 0xc0, 0x3f, 0xf4, 0xd0, 0x95, 0x25, 0x68, 0xff, - 0xe1, 0x8a, 0xaa, 0xa7, 0x0f, 0x59, 0x5b, 0x2b, 0xaf, 0x95, 0x1b, 0xc2, 0xcf, 0xf2, 0xf5, 0xd5, - 0x9f, 0xfe, 0x0c, 0x51, 0x0e, 0xdf, 0xb2, 0x08, 0x1f, 0x7f, 0xfc, 0xfa, 0x5c, 0x69, 0xd5, 0xef, - 0xe5, 0xbb, 0xff, 0x90, 0x87, 0x1f, 0x4b, 0x37, 0xa1, 0x26, 0x8d, 0x03, 0xe7, 0x86, 0x6e, 0x0f, - 0x4f, 0x3a, 0xb4, 0xbd, 0x86, 0xff, 0xc9, 0x43, 0x68, 0x57, 0x01, 0x75, 0xfd, 0xfc, 0xf3, 0x0c, - 0x5d, 0x3b, 0x8f, 0xa8, 0xfe, 0xc0, 0xc2, 0x34, 0xeb, 0x77, 0x4f, 0x83, 0x29, 0x58, 0x48, 0x83, - 0x58, 0x6e, 0xd2, 0x38, 0x68, 0x7b, 0x8d, 0xda, 0xfb, 0xa3, 0x70, 0x63, 0xa1, 0xd2, 0xdf, 0x66, - 0x7d, 0x0f, 0x5f, 0x4d, 0x8c, 0x91, 0xba, 0x4d, 0xc8, 0x6c, 0x36, 0x5b, 0x76, 0x92, 0x4e, 0xcd, - 0xc4, 0x3d, 0xbe, 0x6d, 0x99, 0x50, 0x33, 0x16, 0x2a, 0x6d, 0xad, 0x92, 0xbb, 0x2e, 0x54, 0x4a, - 0xe0, 0xa3, 0xce, 0x57, 0x0f, 0xdd, 0x8e, 0x44, 0x7a, 0xf6, 0x64, 0x1d, 0xeb, 0x2f, 0xe3, 0x71, - 0x2f, 0x77, 0xa1, 0xe7, 0xbd, 0xec, 0x16, 0xf2, 0x58, 0x24, 0x94, 0xc7, 0x58, 0xa8, 0x98, 0xc4, - 0xc0, 0xad, 0x47, 0x64, 0xde, 0xf2, 0x1f, 0xbf, 0xc7, 0xa3, 0xf9, 0xe9, 0x4b, 0xe5, 0x6a, 0xd7, - 0x55, 0xda, 0xcd, 0x63, 0xd8, 0x3e, 0x23, 0xbc, 0x1f, 0x1c, 0x95, 0xf1, 0x81, 0x8d, 0x0f, 0x6c, - 0x7c, 0xb0, 0x1f, 0x0c, 0x2f, 0xd8, 0x1e, 0x3b, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc9, 0xb4, - 0x7d, 0x35, 0x40, 0x04, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// TraceServiceClient is the client API for TraceService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type TraceServiceClient interface { - // Sends new spans to new or existing traces. You cannot update - // existing spans. - BatchWriteSpans(ctx context.Context, in *BatchWriteSpansRequest, opts ...grpc.CallOption) (*empty.Empty, error) - // Creates a new span. - CreateSpan(ctx context.Context, in *Span, opts ...grpc.CallOption) (*Span, error) -} - -type traceServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewTraceServiceClient(cc grpc.ClientConnInterface) TraceServiceClient { - return &traceServiceClient{cc} -} - -func (c *traceServiceClient) BatchWriteSpans(ctx context.Context, in *BatchWriteSpansRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/google.devtools.cloudtrace.v2.TraceService/BatchWriteSpans", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *traceServiceClient) CreateSpan(ctx context.Context, in *Span, opts ...grpc.CallOption) (*Span, error) { - out := new(Span) - err := c.cc.Invoke(ctx, "/google.devtools.cloudtrace.v2.TraceService/CreateSpan", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// TraceServiceServer is the server API for TraceService service. -type TraceServiceServer interface { - // Sends new spans to new or existing traces. You cannot update - // existing spans. - BatchWriteSpans(context.Context, *BatchWriteSpansRequest) (*empty.Empty, error) - // Creates a new span. - CreateSpan(context.Context, *Span) (*Span, error) -} - -// UnimplementedTraceServiceServer can be embedded to have forward compatible implementations. -type UnimplementedTraceServiceServer struct { -} - -func (*UnimplementedTraceServiceServer) BatchWriteSpans(ctx context.Context, req *BatchWriteSpansRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method BatchWriteSpans not implemented") -} -func (*UnimplementedTraceServiceServer) CreateSpan(ctx context.Context, req *Span) (*Span, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateSpan not implemented") -} - -func RegisterTraceServiceServer(s *grpc.Server, srv TraceServiceServer) { - s.RegisterService(&_TraceService_serviceDesc, srv) -} - -func _TraceService_BatchWriteSpans_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(BatchWriteSpansRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TraceServiceServer).BatchWriteSpans(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.devtools.cloudtrace.v2.TraceService/BatchWriteSpans", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TraceServiceServer).BatchWriteSpans(ctx, req.(*BatchWriteSpansRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _TraceService_CreateSpan_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Span) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TraceServiceServer).CreateSpan(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.devtools.cloudtrace.v2.TraceService/CreateSpan", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TraceServiceServer).CreateSpan(ctx, req.(*Span)) - } - return interceptor(ctx, in, info, handler) -} - -var _TraceService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.devtools.cloudtrace.v2.TraceService", - HandlerType: (*TraceServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "BatchWriteSpans", - Handler: _TraceService_BatchWriteSpans_Handler, - }, - { - MethodName: "CreateSpan", - Handler: _TraceService_CreateSpan_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/devtools/cloudtrace/v2/tracing.proto", -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/alert.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/alert.pb.go deleted file mode 100644 index c4517de71..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/alert.pb.go +++ /dev/null @@ -1,862 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/alert.proto - -package monitoring - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - duration "github.com/golang/protobuf/ptypes/duration" - wrappers "github.com/golang/protobuf/ptypes/wrappers" - _ "google.golang.org/genproto/googleapis/api/annotations" - status "google.golang.org/genproto/googleapis/rpc/status" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// Operators for combining conditions. -type AlertPolicy_ConditionCombinerType int32 - -const ( - // An unspecified combiner. - AlertPolicy_COMBINE_UNSPECIFIED AlertPolicy_ConditionCombinerType = 0 - // Combine conditions using the logical `AND` operator. An - // incident is created only if all the conditions are met - // simultaneously. This combiner is satisfied if all conditions are - // met, even if they are met on completely different resources. - AlertPolicy_AND AlertPolicy_ConditionCombinerType = 1 - // Combine conditions using the logical `OR` operator. An incident - // is created if any of the listed conditions is met. - AlertPolicy_OR AlertPolicy_ConditionCombinerType = 2 - // Combine conditions using logical `AND` operator, but unlike the regular - // `AND` option, an incident is created only if all conditions are met - // simultaneously on at least one resource. - AlertPolicy_AND_WITH_MATCHING_RESOURCE AlertPolicy_ConditionCombinerType = 3 -) - -var AlertPolicy_ConditionCombinerType_name = map[int32]string{ - 0: "COMBINE_UNSPECIFIED", - 1: "AND", - 2: "OR", - 3: "AND_WITH_MATCHING_RESOURCE", -} - -var AlertPolicy_ConditionCombinerType_value = map[string]int32{ - "COMBINE_UNSPECIFIED": 0, - "AND": 1, - "OR": 2, - "AND_WITH_MATCHING_RESOURCE": 3, -} - -func (x AlertPolicy_ConditionCombinerType) String() string { - return proto.EnumName(AlertPolicy_ConditionCombinerType_name, int32(x)) -} - -func (AlertPolicy_ConditionCombinerType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_014ef0e1a0f00a00, []int{0, 0} -} - -// A description of the conditions under which some aspect of your system is -// considered to be "unhealthy" and the ways to notify people or services about -// this state. For an overview of alert policies, see -// [Introduction to Alerting](/monitoring/alerts/). -type AlertPolicy struct { - // Required if the policy exists. The resource name for this policy. The - // format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[ALERT_POLICY_ID] - // - // `[ALERT_POLICY_ID]` is assigned by Stackdriver Monitoring when the policy - // is created. When calling the - // [alertPolicies.create][google.monitoring.v3.AlertPolicyService.CreateAlertPolicy] - // method, do not include the `name` field in the alerting policy passed as - // part of the request. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // A short name or phrase used to identify the policy in dashboards, - // notifications, and incidents. To avoid confusion, don't use the same - // display name for multiple policies in the same project. The name is - // limited to 512 Unicode characters. - DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // Documentation that is included with notifications and incidents related to - // this policy. Best practice is for the documentation to include information - // to help responders understand, mitigate, escalate, and correct the - // underlying problems detected by the alerting policy. Notification channels - // that have limited capacity might not show this documentation. - Documentation *AlertPolicy_Documentation `protobuf:"bytes,13,opt,name=documentation,proto3" json:"documentation,omitempty"` - // User-supplied key/value data to be used for organizing and - // identifying the `AlertPolicy` objects. - // - // The field can contain up to 64 entries. Each key and value is limited to - // 63 Unicode characters or 128 bytes, whichever is smaller. Labels and - // values can contain only lowercase letters, numerals, underscores, and - // dashes. Keys must begin with a letter. - UserLabels map[string]string `protobuf:"bytes,16,rep,name=user_labels,json=userLabels,proto3" json:"user_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // A list of conditions for the policy. The conditions are combined by AND or - // OR according to the `combiner` field. If the combined conditions evaluate - // to true, then an incident is created. A policy can have from one to six - // conditions. - // If `condition_time_series_query_language` is present, it must be the only - // `condition`. - Conditions []*AlertPolicy_Condition `protobuf:"bytes,12,rep,name=conditions,proto3" json:"conditions,omitempty"` - // How to combine the results of multiple conditions to determine if an - // incident should be opened. - // If `condition_time_series_query_language` is present, this must be - // `COMBINE_UNSPECIFIED`. - Combiner AlertPolicy_ConditionCombinerType `protobuf:"varint,6,opt,name=combiner,proto3,enum=google.monitoring.v3.AlertPolicy_ConditionCombinerType" json:"combiner,omitempty"` - // Whether or not the policy is enabled. On write, the default interpretation - // if unset is that the policy is enabled. On read, clients should not make - // any assumption about the state if it has not been populated. The - // field should always be populated on List and Get operations, unless - // a field projection has been specified that strips it out. - Enabled *wrappers.BoolValue `protobuf:"bytes,17,opt,name=enabled,proto3" json:"enabled,omitempty"` - // Read-only description of how the alert policy is invalid. OK if the alert - // policy is valid. If not OK, the alert policy will not generate incidents. - Validity *status.Status `protobuf:"bytes,18,opt,name=validity,proto3" json:"validity,omitempty"` - // Identifies the notification channels to which notifications should be sent - // when incidents are opened or closed or when new violations occur on - // an already opened incident. Each element of this array corresponds to - // the `name` field in each of the - // [`NotificationChannel`][google.monitoring.v3.NotificationChannel] - // objects that are returned from the [`ListNotificationChannels`] - // [google.monitoring.v3.NotificationChannelService.ListNotificationChannels] - // method. The format of the entries in this field is: - // - // projects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID] - NotificationChannels []string `protobuf:"bytes,14,rep,name=notification_channels,json=notificationChannels,proto3" json:"notification_channels,omitempty"` - // A read-only record of the creation of the alerting policy. If provided - // in a call to create or update, this field will be ignored. - CreationRecord *MutationRecord `protobuf:"bytes,10,opt,name=creation_record,json=creationRecord,proto3" json:"creation_record,omitempty"` - // A read-only record of the most recent change to the alerting policy. If - // provided in a call to create or update, this field will be ignored. - MutationRecord *MutationRecord `protobuf:"bytes,11,opt,name=mutation_record,json=mutationRecord,proto3" json:"mutation_record,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AlertPolicy) Reset() { *m = AlertPolicy{} } -func (m *AlertPolicy) String() string { return proto.CompactTextString(m) } -func (*AlertPolicy) ProtoMessage() {} -func (*AlertPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_014ef0e1a0f00a00, []int{0} -} - -func (m *AlertPolicy) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AlertPolicy.Unmarshal(m, b) -} -func (m *AlertPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AlertPolicy.Marshal(b, m, deterministic) -} -func (m *AlertPolicy) XXX_Merge(src proto.Message) { - xxx_messageInfo_AlertPolicy.Merge(m, src) -} -func (m *AlertPolicy) XXX_Size() int { - return xxx_messageInfo_AlertPolicy.Size(m) -} -func (m *AlertPolicy) XXX_DiscardUnknown() { - xxx_messageInfo_AlertPolicy.DiscardUnknown(m) -} - -var xxx_messageInfo_AlertPolicy proto.InternalMessageInfo - -func (m *AlertPolicy) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *AlertPolicy) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -func (m *AlertPolicy) GetDocumentation() *AlertPolicy_Documentation { - if m != nil { - return m.Documentation - } - return nil -} - -func (m *AlertPolicy) GetUserLabels() map[string]string { - if m != nil { - return m.UserLabels - } - return nil -} - -func (m *AlertPolicy) GetConditions() []*AlertPolicy_Condition { - if m != nil { - return m.Conditions - } - return nil -} - -func (m *AlertPolicy) GetCombiner() AlertPolicy_ConditionCombinerType { - if m != nil { - return m.Combiner - } - return AlertPolicy_COMBINE_UNSPECIFIED -} - -func (m *AlertPolicy) GetEnabled() *wrappers.BoolValue { - if m != nil { - return m.Enabled - } - return nil -} - -func (m *AlertPolicy) GetValidity() *status.Status { - if m != nil { - return m.Validity - } - return nil -} - -func (m *AlertPolicy) GetNotificationChannels() []string { - if m != nil { - return m.NotificationChannels - } - return nil -} - -func (m *AlertPolicy) GetCreationRecord() *MutationRecord { - if m != nil { - return m.CreationRecord - } - return nil -} - -func (m *AlertPolicy) GetMutationRecord() *MutationRecord { - if m != nil { - return m.MutationRecord - } - return nil -} - -// A content string and a MIME type that describes the content string's -// format. -type AlertPolicy_Documentation struct { - // The text of the documentation, interpreted according to `mime_type`. - // The content may not exceed 8,192 Unicode characters and may not exceed - // more than 10,240 bytes when encoded in UTF-8 format, whichever is - // smaller. - Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` - // The format of the `content` field. Presently, only the value - // `"text/markdown"` is supported. See - // [Markdown](https://en.wikipedia.org/wiki/Markdown) for more information. - MimeType string `protobuf:"bytes,2,opt,name=mime_type,json=mimeType,proto3" json:"mime_type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AlertPolicy_Documentation) Reset() { *m = AlertPolicy_Documentation{} } -func (m *AlertPolicy_Documentation) String() string { return proto.CompactTextString(m) } -func (*AlertPolicy_Documentation) ProtoMessage() {} -func (*AlertPolicy_Documentation) Descriptor() ([]byte, []int) { - return fileDescriptor_014ef0e1a0f00a00, []int{0, 0} -} - -func (m *AlertPolicy_Documentation) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AlertPolicy_Documentation.Unmarshal(m, b) -} -func (m *AlertPolicy_Documentation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AlertPolicy_Documentation.Marshal(b, m, deterministic) -} -func (m *AlertPolicy_Documentation) XXX_Merge(src proto.Message) { - xxx_messageInfo_AlertPolicy_Documentation.Merge(m, src) -} -func (m *AlertPolicy_Documentation) XXX_Size() int { - return xxx_messageInfo_AlertPolicy_Documentation.Size(m) -} -func (m *AlertPolicy_Documentation) XXX_DiscardUnknown() { - xxx_messageInfo_AlertPolicy_Documentation.DiscardUnknown(m) -} - -var xxx_messageInfo_AlertPolicy_Documentation proto.InternalMessageInfo - -func (m *AlertPolicy_Documentation) GetContent() string { - if m != nil { - return m.Content - } - return "" -} - -func (m *AlertPolicy_Documentation) GetMimeType() string { - if m != nil { - return m.MimeType - } - return "" -} - -// A condition is a true/false test that determines when an alerting policy -// should open an incident. If a condition evaluates to true, it signifies -// that something is wrong. -type AlertPolicy_Condition struct { - // Required if the condition exists. The unique resource name for this - // condition. Its format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[POLICY_ID]/conditions/[CONDITION_ID] - // - // `[CONDITION_ID]` is assigned by Stackdriver Monitoring when the - // condition is created as part of a new or updated alerting policy. - // - // When calling the - // [alertPolicies.create][google.monitoring.v3.AlertPolicyService.CreateAlertPolicy] - // method, do not include the `name` field in the conditions of the - // requested alerting policy. Stackdriver Monitoring creates the - // condition identifiers and includes them in the new policy. - // - // When calling the - // [alertPolicies.update][google.monitoring.v3.AlertPolicyService.UpdateAlertPolicy] - // method to update a policy, including a condition `name` causes the - // existing condition to be updated. Conditions without names are added to - // the updated policy. Existing conditions are deleted if they are not - // updated. - // - // Best practice is to preserve `[CONDITION_ID]` if you make only small - // changes, such as those to condition thresholds, durations, or trigger - // values. Otherwise, treat the change as a new condition and let the - // existing condition be deleted. - Name string `protobuf:"bytes,12,opt,name=name,proto3" json:"name,omitempty"` - // A short name or phrase used to identify the condition in dashboards, - // notifications, and incidents. To avoid confusion, don't use the same - // display name for multiple conditions in the same policy. - DisplayName string `protobuf:"bytes,6,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // Only one of the following condition types will be specified. - // - // Types that are valid to be assigned to Condition: - // *AlertPolicy_Condition_ConditionThreshold - // *AlertPolicy_Condition_ConditionAbsent - Condition isAlertPolicy_Condition_Condition `protobuf_oneof:"condition"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AlertPolicy_Condition) Reset() { *m = AlertPolicy_Condition{} } -func (m *AlertPolicy_Condition) String() string { return proto.CompactTextString(m) } -func (*AlertPolicy_Condition) ProtoMessage() {} -func (*AlertPolicy_Condition) Descriptor() ([]byte, []int) { - return fileDescriptor_014ef0e1a0f00a00, []int{0, 1} -} - -func (m *AlertPolicy_Condition) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AlertPolicy_Condition.Unmarshal(m, b) -} -func (m *AlertPolicy_Condition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AlertPolicy_Condition.Marshal(b, m, deterministic) -} -func (m *AlertPolicy_Condition) XXX_Merge(src proto.Message) { - xxx_messageInfo_AlertPolicy_Condition.Merge(m, src) -} -func (m *AlertPolicy_Condition) XXX_Size() int { - return xxx_messageInfo_AlertPolicy_Condition.Size(m) -} -func (m *AlertPolicy_Condition) XXX_DiscardUnknown() { - xxx_messageInfo_AlertPolicy_Condition.DiscardUnknown(m) -} - -var xxx_messageInfo_AlertPolicy_Condition proto.InternalMessageInfo - -func (m *AlertPolicy_Condition) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *AlertPolicy_Condition) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -type isAlertPolicy_Condition_Condition interface { - isAlertPolicy_Condition_Condition() -} - -type AlertPolicy_Condition_ConditionThreshold struct { - ConditionThreshold *AlertPolicy_Condition_MetricThreshold `protobuf:"bytes,1,opt,name=condition_threshold,json=conditionThreshold,proto3,oneof"` -} - -type AlertPolicy_Condition_ConditionAbsent struct { - ConditionAbsent *AlertPolicy_Condition_MetricAbsence `protobuf:"bytes,2,opt,name=condition_absent,json=conditionAbsent,proto3,oneof"` -} - -func (*AlertPolicy_Condition_ConditionThreshold) isAlertPolicy_Condition_Condition() {} - -func (*AlertPolicy_Condition_ConditionAbsent) isAlertPolicy_Condition_Condition() {} - -func (m *AlertPolicy_Condition) GetCondition() isAlertPolicy_Condition_Condition { - if m != nil { - return m.Condition - } - return nil -} - -func (m *AlertPolicy_Condition) GetConditionThreshold() *AlertPolicy_Condition_MetricThreshold { - if x, ok := m.GetCondition().(*AlertPolicy_Condition_ConditionThreshold); ok { - return x.ConditionThreshold - } - return nil -} - -func (m *AlertPolicy_Condition) GetConditionAbsent() *AlertPolicy_Condition_MetricAbsence { - if x, ok := m.GetCondition().(*AlertPolicy_Condition_ConditionAbsent); ok { - return x.ConditionAbsent - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*AlertPolicy_Condition) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*AlertPolicy_Condition_ConditionThreshold)(nil), - (*AlertPolicy_Condition_ConditionAbsent)(nil), - } -} - -// Specifies how many time series must fail a predicate to trigger a -// condition. If not specified, then a `{count: 1}` trigger is used. -type AlertPolicy_Condition_Trigger struct { - // A type of trigger. - // - // Types that are valid to be assigned to Type: - // *AlertPolicy_Condition_Trigger_Count - // *AlertPolicy_Condition_Trigger_Percent - Type isAlertPolicy_Condition_Trigger_Type `protobuf_oneof:"type"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AlertPolicy_Condition_Trigger) Reset() { *m = AlertPolicy_Condition_Trigger{} } -func (m *AlertPolicy_Condition_Trigger) String() string { return proto.CompactTextString(m) } -func (*AlertPolicy_Condition_Trigger) ProtoMessage() {} -func (*AlertPolicy_Condition_Trigger) Descriptor() ([]byte, []int) { - return fileDescriptor_014ef0e1a0f00a00, []int{0, 1, 0} -} - -func (m *AlertPolicy_Condition_Trigger) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AlertPolicy_Condition_Trigger.Unmarshal(m, b) -} -func (m *AlertPolicy_Condition_Trigger) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AlertPolicy_Condition_Trigger.Marshal(b, m, deterministic) -} -func (m *AlertPolicy_Condition_Trigger) XXX_Merge(src proto.Message) { - xxx_messageInfo_AlertPolicy_Condition_Trigger.Merge(m, src) -} -func (m *AlertPolicy_Condition_Trigger) XXX_Size() int { - return xxx_messageInfo_AlertPolicy_Condition_Trigger.Size(m) -} -func (m *AlertPolicy_Condition_Trigger) XXX_DiscardUnknown() { - xxx_messageInfo_AlertPolicy_Condition_Trigger.DiscardUnknown(m) -} - -var xxx_messageInfo_AlertPolicy_Condition_Trigger proto.InternalMessageInfo - -type isAlertPolicy_Condition_Trigger_Type interface { - isAlertPolicy_Condition_Trigger_Type() -} - -type AlertPolicy_Condition_Trigger_Count struct { - Count int32 `protobuf:"varint,1,opt,name=count,proto3,oneof"` -} - -type AlertPolicy_Condition_Trigger_Percent struct { - Percent float64 `protobuf:"fixed64,2,opt,name=percent,proto3,oneof"` -} - -func (*AlertPolicy_Condition_Trigger_Count) isAlertPolicy_Condition_Trigger_Type() {} - -func (*AlertPolicy_Condition_Trigger_Percent) isAlertPolicy_Condition_Trigger_Type() {} - -func (m *AlertPolicy_Condition_Trigger) GetType() isAlertPolicy_Condition_Trigger_Type { - if m != nil { - return m.Type - } - return nil -} - -func (m *AlertPolicy_Condition_Trigger) GetCount() int32 { - if x, ok := m.GetType().(*AlertPolicy_Condition_Trigger_Count); ok { - return x.Count - } - return 0 -} - -func (m *AlertPolicy_Condition_Trigger) GetPercent() float64 { - if x, ok := m.GetType().(*AlertPolicy_Condition_Trigger_Percent); ok { - return x.Percent - } - return 0 -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*AlertPolicy_Condition_Trigger) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*AlertPolicy_Condition_Trigger_Count)(nil), - (*AlertPolicy_Condition_Trigger_Percent)(nil), - } -} - -// A condition type that compares a collection of time series -// against a threshold. -type AlertPolicy_Condition_MetricThreshold struct { - // A [filter](https://cloud.google.com/monitoring/api/v3/filters) that - // identifies which time series should be compared with the threshold. - // - // The filter is similar to the one that is specified in the - // [`ListTimeSeries` - // request](/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list) (that - // call is useful to verify the time series that will be retrieved / - // processed) and must specify the metric type and optionally may contain - // restrictions on resource type, resource labels, and metric labels. - // This field may not exceed 2048 Unicode characters in length. - Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` - // Specifies the alignment of data points in individual time series as - // well as how to combine the retrieved time series together (such as - // when aggregating multiple streams on each resource to a single - // stream for each resource or when aggregating streams across all - // members of a group of resrouces). Multiple aggregations - // are applied in the order specified. - // - // This field is similar to the one in the [`ListTimeSeries` - // request](/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list). It - // is advisable to use the `ListTimeSeries` method when debugging this - // field. - Aggregations []*Aggregation `protobuf:"bytes,8,rep,name=aggregations,proto3" json:"aggregations,omitempty"` - // A [filter](https://cloud.google.com/monitoring/api/v3/filters) that - // identifies a time series that should be used as the denominator of a - // ratio that will be compared with the threshold. If a - // `denominator_filter` is specified, the time series specified by the - // `filter` field will be used as the numerator. - // - // The filter must specify the metric type and optionally may contain - // restrictions on resource type, resource labels, and metric labels. - // This field may not exceed 2048 Unicode characters in length. - DenominatorFilter string `protobuf:"bytes,9,opt,name=denominator_filter,json=denominatorFilter,proto3" json:"denominator_filter,omitempty"` - // Specifies the alignment of data points in individual time series - // selected by `denominatorFilter` as - // well as how to combine the retrieved time series together (such as - // when aggregating multiple streams on each resource to a single - // stream for each resource or when aggregating streams across all - // members of a group of resources). - // - // When computing ratios, the `aggregations` and - // `denominator_aggregations` fields must use the same alignment period - // and produce time series that have the same periodicity and labels. - DenominatorAggregations []*Aggregation `protobuf:"bytes,10,rep,name=denominator_aggregations,json=denominatorAggregations,proto3" json:"denominator_aggregations,omitempty"` - // The comparison to apply between the time series (indicated by `filter` - // and `aggregation`) and the threshold (indicated by `threshold_value`). - // The comparison is applied on each time series, with the time series - // on the left-hand side and the threshold on the right-hand side. - // - // Only `COMPARISON_LT` and `COMPARISON_GT` are supported currently. - Comparison ComparisonType `protobuf:"varint,4,opt,name=comparison,proto3,enum=google.monitoring.v3.ComparisonType" json:"comparison,omitempty"` - // A value against which to compare the time series. - ThresholdValue float64 `protobuf:"fixed64,5,opt,name=threshold_value,json=thresholdValue,proto3" json:"threshold_value,omitempty"` - // The amount of time that a time series must violate the - // threshold to be considered failing. Currently, only values - // that are a multiple of a minute--e.g., 0, 60, 120, or 300 - // seconds--are supported. If an invalid value is given, an - // error will be returned. When choosing a duration, it is useful to - // keep in mind the frequency of the underlying time series data - // (which may also be affected by any alignments specified in the - // `aggregations` field); a good duration is long enough so that a single - // outlier does not generate spurious alerts, but short enough that - // unhealthy states are detected and alerted on quickly. - Duration *duration.Duration `protobuf:"bytes,6,opt,name=duration,proto3" json:"duration,omitempty"` - // The number/percent of time series for which the comparison must hold - // in order for the condition to trigger. If unspecified, then the - // condition will trigger if the comparison is true for any of the - // time series that have been identified by `filter` and `aggregations`, - // or by the ratio, if `denominator_filter` and `denominator_aggregations` - // are specified. - Trigger *AlertPolicy_Condition_Trigger `protobuf:"bytes,7,opt,name=trigger,proto3" json:"trigger,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AlertPolicy_Condition_MetricThreshold) Reset() { *m = AlertPolicy_Condition_MetricThreshold{} } -func (m *AlertPolicy_Condition_MetricThreshold) String() string { return proto.CompactTextString(m) } -func (*AlertPolicy_Condition_MetricThreshold) ProtoMessage() {} -func (*AlertPolicy_Condition_MetricThreshold) Descriptor() ([]byte, []int) { - return fileDescriptor_014ef0e1a0f00a00, []int{0, 1, 1} -} - -func (m *AlertPolicy_Condition_MetricThreshold) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AlertPolicy_Condition_MetricThreshold.Unmarshal(m, b) -} -func (m *AlertPolicy_Condition_MetricThreshold) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AlertPolicy_Condition_MetricThreshold.Marshal(b, m, deterministic) -} -func (m *AlertPolicy_Condition_MetricThreshold) XXX_Merge(src proto.Message) { - xxx_messageInfo_AlertPolicy_Condition_MetricThreshold.Merge(m, src) -} -func (m *AlertPolicy_Condition_MetricThreshold) XXX_Size() int { - return xxx_messageInfo_AlertPolicy_Condition_MetricThreshold.Size(m) -} -func (m *AlertPolicy_Condition_MetricThreshold) XXX_DiscardUnknown() { - xxx_messageInfo_AlertPolicy_Condition_MetricThreshold.DiscardUnknown(m) -} - -var xxx_messageInfo_AlertPolicy_Condition_MetricThreshold proto.InternalMessageInfo - -func (m *AlertPolicy_Condition_MetricThreshold) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *AlertPolicy_Condition_MetricThreshold) GetAggregations() []*Aggregation { - if m != nil { - return m.Aggregations - } - return nil -} - -func (m *AlertPolicy_Condition_MetricThreshold) GetDenominatorFilter() string { - if m != nil { - return m.DenominatorFilter - } - return "" -} - -func (m *AlertPolicy_Condition_MetricThreshold) GetDenominatorAggregations() []*Aggregation { - if m != nil { - return m.DenominatorAggregations - } - return nil -} - -func (m *AlertPolicy_Condition_MetricThreshold) GetComparison() ComparisonType { - if m != nil { - return m.Comparison - } - return ComparisonType_COMPARISON_UNSPECIFIED -} - -func (m *AlertPolicy_Condition_MetricThreshold) GetThresholdValue() float64 { - if m != nil { - return m.ThresholdValue - } - return 0 -} - -func (m *AlertPolicy_Condition_MetricThreshold) GetDuration() *duration.Duration { - if m != nil { - return m.Duration - } - return nil -} - -func (m *AlertPolicy_Condition_MetricThreshold) GetTrigger() *AlertPolicy_Condition_Trigger { - if m != nil { - return m.Trigger - } - return nil -} - -// A condition type that checks that monitored resources -// are reporting data. The configuration defines a metric and -// a set of monitored resources. The predicate is considered in violation -// when a time series for the specified metric of a monitored -// resource does not include any data in the specified `duration`. -type AlertPolicy_Condition_MetricAbsence struct { - // A [filter](https://cloud.google.com/monitoring/api/v3/filters) that - // identifies which time series should be compared with the threshold. - // - // The filter is similar to the one that is specified in the - // [`ListTimeSeries` - // request](/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list) (that - // call is useful to verify the time series that will be retrieved / - // processed) and must specify the metric type and optionally may contain - // restrictions on resource type, resource labels, and metric labels. - // This field may not exceed 2048 Unicode characters in length. - Filter string `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` - // Specifies the alignment of data points in individual time series as - // well as how to combine the retrieved time series together (such as - // when aggregating multiple streams on each resource to a single - // stream for each resource or when aggregating streams across all - // members of a group of resrouces). Multiple aggregations - // are applied in the order specified. - // - // This field is similar to the one in the [`ListTimeSeries` - // request](/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list). It - // is advisable to use the `ListTimeSeries` method when debugging this - // field. - Aggregations []*Aggregation `protobuf:"bytes,5,rep,name=aggregations,proto3" json:"aggregations,omitempty"` - // The amount of time that a time series must fail to report new - // data to be considered failing. Currently, only values that - // are a multiple of a minute--e.g. 60, 120, or 300 - // seconds--are supported. If an invalid value is given, an - // error will be returned. The `Duration.nanos` field is - // ignored. - Duration *duration.Duration `protobuf:"bytes,2,opt,name=duration,proto3" json:"duration,omitempty"` - // The number/percent of time series for which the comparison must hold - // in order for the condition to trigger. If unspecified, then the - // condition will trigger if the comparison is true for any of the - // time series that have been identified by `filter` and `aggregations`. - Trigger *AlertPolicy_Condition_Trigger `protobuf:"bytes,3,opt,name=trigger,proto3" json:"trigger,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AlertPolicy_Condition_MetricAbsence) Reset() { *m = AlertPolicy_Condition_MetricAbsence{} } -func (m *AlertPolicy_Condition_MetricAbsence) String() string { return proto.CompactTextString(m) } -func (*AlertPolicy_Condition_MetricAbsence) ProtoMessage() {} -func (*AlertPolicy_Condition_MetricAbsence) Descriptor() ([]byte, []int) { - return fileDescriptor_014ef0e1a0f00a00, []int{0, 1, 2} -} - -func (m *AlertPolicy_Condition_MetricAbsence) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AlertPolicy_Condition_MetricAbsence.Unmarshal(m, b) -} -func (m *AlertPolicy_Condition_MetricAbsence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AlertPolicy_Condition_MetricAbsence.Marshal(b, m, deterministic) -} -func (m *AlertPolicy_Condition_MetricAbsence) XXX_Merge(src proto.Message) { - xxx_messageInfo_AlertPolicy_Condition_MetricAbsence.Merge(m, src) -} -func (m *AlertPolicy_Condition_MetricAbsence) XXX_Size() int { - return xxx_messageInfo_AlertPolicy_Condition_MetricAbsence.Size(m) -} -func (m *AlertPolicy_Condition_MetricAbsence) XXX_DiscardUnknown() { - xxx_messageInfo_AlertPolicy_Condition_MetricAbsence.DiscardUnknown(m) -} - -var xxx_messageInfo_AlertPolicy_Condition_MetricAbsence proto.InternalMessageInfo - -func (m *AlertPolicy_Condition_MetricAbsence) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *AlertPolicy_Condition_MetricAbsence) GetAggregations() []*Aggregation { - if m != nil { - return m.Aggregations - } - return nil -} - -func (m *AlertPolicy_Condition_MetricAbsence) GetDuration() *duration.Duration { - if m != nil { - return m.Duration - } - return nil -} - -func (m *AlertPolicy_Condition_MetricAbsence) GetTrigger() *AlertPolicy_Condition_Trigger { - if m != nil { - return m.Trigger - } - return nil -} - -func init() { - proto.RegisterEnum("google.monitoring.v3.AlertPolicy_ConditionCombinerType", AlertPolicy_ConditionCombinerType_name, AlertPolicy_ConditionCombinerType_value) - proto.RegisterType((*AlertPolicy)(nil), "google.monitoring.v3.AlertPolicy") - proto.RegisterMapType((map[string]string)(nil), "google.monitoring.v3.AlertPolicy.UserLabelsEntry") - proto.RegisterType((*AlertPolicy_Documentation)(nil), "google.monitoring.v3.AlertPolicy.Documentation") - proto.RegisterType((*AlertPolicy_Condition)(nil), "google.monitoring.v3.AlertPolicy.Condition") - proto.RegisterType((*AlertPolicy_Condition_Trigger)(nil), "google.monitoring.v3.AlertPolicy.Condition.Trigger") - proto.RegisterType((*AlertPolicy_Condition_MetricThreshold)(nil), "google.monitoring.v3.AlertPolicy.Condition.MetricThreshold") - proto.RegisterType((*AlertPolicy_Condition_MetricAbsence)(nil), "google.monitoring.v3.AlertPolicy.Condition.MetricAbsence") -} - -func init() { proto.RegisterFile("google/monitoring/v3/alert.proto", fileDescriptor_014ef0e1a0f00a00) } - -var fileDescriptor_014ef0e1a0f00a00 = []byte{ - // 1094 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x4d, 0x6f, 0xdb, 0x46, - 0x13, 0x36, 0xa5, 0x58, 0xb2, 0x46, 0xfe, 0x50, 0x36, 0x4e, 0xcc, 0xf0, 0x05, 0x02, 0x39, 0x78, - 0x8b, 0x1a, 0x29, 0x42, 0xa2, 0x56, 0x8b, 0x36, 0x0e, 0x5a, 0x40, 0x96, 0xe4, 0xc8, 0x68, 0x25, - 0x1b, 0xf4, 0x47, 0x81, 0xc2, 0x00, 0xb1, 0xa2, 0xd6, 0x34, 0x5b, 0x72, 0x97, 0x58, 0x52, 0x2e, - 0x54, 0xc3, 0xbf, 0xa2, 0x87, 0xde, 0x7b, 0xec, 0xff, 0xe8, 0xa1, 0xfd, 0x29, 0x39, 0x16, 0x01, - 0x7a, 0x2d, 0xb8, 0x5c, 0x52, 0x94, 0x23, 0x27, 0x91, 0x7b, 0xdb, 0xd9, 0x79, 0xe6, 0x99, 0x9d, - 0x9d, 0x67, 0x87, 0x84, 0xba, 0xc3, 0x98, 0xe3, 0x11, 0xc3, 0x67, 0xd4, 0x8d, 0x18, 0x77, 0xa9, - 0x63, 0x5c, 0x36, 0x0c, 0xec, 0x11, 0x1e, 0xe9, 0x01, 0x67, 0x11, 0x43, 0xeb, 0x09, 0x42, 0x9f, - 0x20, 0xf4, 0xcb, 0x86, 0xf6, 0x58, 0xc6, 0xe1, 0xc0, 0x35, 0x38, 0x09, 0xd9, 0x88, 0xdb, 0x24, - 0x09, 0xd0, 0x36, 0x67, 0x52, 0xda, 0xcc, 0xf7, 0x19, 0x95, 0x90, 0x67, 0x33, 0x21, 0xfe, 0x28, - 0xc2, 0x91, 0xcb, 0xa8, 0xc5, 0x89, 0xcd, 0xf8, 0x50, 0x62, 0x9f, 0x48, 0xac, 0xb0, 0x06, 0xa3, - 0x73, 0x63, 0x38, 0xe2, 0x02, 0x76, 0x9b, 0xff, 0x27, 0x8e, 0x83, 0x80, 0xf0, 0x50, 0xfa, 0x37, - 0xa4, 0x9f, 0x07, 0xb6, 0x11, 0x46, 0x38, 0x1a, 0x49, 0xc7, 0xd3, 0x7f, 0x1e, 0x40, 0xb5, 0x19, - 0x17, 0x7a, 0xc8, 0x3c, 0xd7, 0x1e, 0x23, 0x04, 0xf7, 0x28, 0xf6, 0x89, 0xaa, 0xd4, 0x95, 0xad, - 0x8a, 0x29, 0xd6, 0x68, 0x13, 0x96, 0x87, 0x6e, 0x18, 0x78, 0x78, 0x6c, 0x09, 0x5f, 0x41, 0xf8, - 0xaa, 0x72, 0xaf, 0x1f, 0x43, 0x4e, 0x60, 0x65, 0xc8, 0xec, 0x91, 0x4f, 0x68, 0x72, 0x7a, 0x75, - 0xa5, 0xae, 0x6c, 0x55, 0xb7, 0x0d, 0x7d, 0xd6, 0xbd, 0xe9, 0xb9, 0x84, 0x7a, 0x3b, 0x1f, 0x66, - 0x4e, 0xb3, 0x20, 0x13, 0xaa, 0xa3, 0x90, 0x70, 0xcb, 0xc3, 0x03, 0xe2, 0x85, 0x6a, 0xad, 0x5e, - 0xdc, 0xaa, 0x6e, 0x7f, 0xfa, 0x7e, 0xd2, 0x93, 0x90, 0xf0, 0x6f, 0x45, 0x4c, 0x87, 0x46, 0x7c, - 0x6c, 0xc2, 0x28, 0xdb, 0x40, 0xdf, 0x00, 0xd8, 0x8c, 0x0e, 0xdd, 0x38, 0x41, 0xa8, 0x2e, 0x0b, - 0xca, 0x4f, 0xde, 0x4f, 0xd9, 0x4a, 0x63, 0xcc, 0x5c, 0x38, 0x3a, 0x82, 0x25, 0x9b, 0xf9, 0x03, - 0x97, 0x12, 0xae, 0x96, 0xea, 0xca, 0xd6, 0xea, 0xf6, 0x17, 0x73, 0x50, 0xb5, 0x64, 0xe8, 0xf1, - 0x38, 0x20, 0x66, 0x46, 0x84, 0x3e, 0x83, 0x32, 0xa1, 0x78, 0xe0, 0x91, 0xa1, 0x7a, 0x5f, 0x5c, - 0xa3, 0x96, 0x72, 0xa6, 0xed, 0xd5, 0x77, 0x19, 0xf3, 0x4e, 0xb1, 0x37, 0x22, 0x66, 0x0a, 0x45, - 0x3a, 0x2c, 0x5d, 0x62, 0xcf, 0x1d, 0xba, 0xd1, 0x58, 0x45, 0x22, 0x0c, 0xa5, 0x61, 0x3c, 0xb0, - 0xf5, 0x23, 0xd1, 0x75, 0x33, 0xc3, 0xa0, 0x06, 0x3c, 0xa4, 0x2c, 0x72, 0xcf, 0x5d, 0x3b, 0xd1, - 0x9b, 0x7d, 0x81, 0x29, 0x8d, 0x6f, 0x79, 0xb5, 0x5e, 0xdc, 0xaa, 0x98, 0xeb, 0x79, 0x67, 0x4b, - 0xfa, 0x50, 0x0f, 0xd6, 0x6c, 0x4e, 0xf2, 0x02, 0x55, 0x41, 0xe4, 0xfa, 0xff, 0xec, 0xb2, 0x7b, - 0x52, 0xcd, 0xa6, 0xc0, 0x9a, 0xab, 0x69, 0x70, 0x62, 0xc7, 0x74, 0x37, 0xf4, 0xae, 0x56, 0xe7, - 0xa1, 0xf3, 0xa7, 0x6c, 0x6d, 0x0f, 0x56, 0xa6, 0xe4, 0x84, 0x54, 0x28, 0xdb, 0x8c, 0x46, 0x84, - 0x46, 0x52, 0xd0, 0xa9, 0x89, 0xfe, 0x07, 0x15, 0xdf, 0xf5, 0x89, 0x15, 0x8d, 0x83, 0x54, 0xd0, - 0x4b, 0xf1, 0x46, 0xdc, 0x0a, 0xed, 0x0d, 0x40, 0x25, 0x6b, 0x52, 0xf6, 0x24, 0x96, 0xdf, 0xf1, - 0x24, 0x4a, 0x6f, 0x3f, 0x09, 0x0a, 0x0f, 0x32, 0xa1, 0x58, 0xd1, 0x05, 0x27, 0xe1, 0x05, 0xf3, - 0x86, 0xe2, 0x1c, 0xd5, 0xed, 0x97, 0x73, 0xa8, 0x44, 0xef, 0x91, 0x88, 0xbb, 0xf6, 0x71, 0x4a, - 0xd1, 0x5d, 0x30, 0x51, 0xc6, 0x9c, 0xed, 0xa2, 0x73, 0xa8, 0x4d, 0xf2, 0xe1, 0x41, 0x18, 0x17, - 0x5d, 0x10, 0xc9, 0x5e, 0xcc, 0x9f, 0xac, 0x19, 0xc7, 0xdb, 0xa4, 0xbb, 0x60, 0xae, 0x65, 0xa4, - 0x62, 0x2f, 0xd2, 0x3a, 0x50, 0x3e, 0xe6, 0xae, 0xe3, 0x10, 0x8e, 0x1e, 0xc1, 0xa2, 0xcd, 0x46, - 0xf2, 0x72, 0x17, 0xbb, 0x0b, 0x66, 0x62, 0x22, 0x0d, 0xca, 0x01, 0xe1, 0x76, 0x7a, 0x02, 0xa5, - 0xbb, 0x60, 0xa6, 0x1b, 0xbb, 0x25, 0xb8, 0x17, 0xdf, 0xb9, 0xf6, 0x77, 0x11, 0xd6, 0x6e, 0x14, - 0x86, 0x1e, 0x41, 0xe9, 0xdc, 0xf5, 0x22, 0xc2, 0x65, 0x47, 0xa4, 0x85, 0x3a, 0xb0, 0x8c, 0x1d, - 0x87, 0x13, 0x07, 0x27, 0x8f, 0x76, 0x49, 0x3c, 0xda, 0xcd, 0x5b, 0xca, 0x9a, 0x20, 0xcd, 0xa9, - 0x30, 0xf4, 0x1c, 0xd0, 0x90, 0x50, 0xe6, 0xbb, 0x14, 0x47, 0x8c, 0x5b, 0x32, 0x55, 0x45, 0xa4, - 0xba, 0x9f, 0xf3, 0xec, 0x25, 0x59, 0xcf, 0x40, 0xcd, 0xc3, 0xa7, 0x4e, 0x00, 0x1f, 0x7a, 0x82, - 0x8d, 0x1c, 0x45, 0x33, 0x7f, 0x98, 0x76, 0x3c, 0x86, 0xfc, 0x00, 0x73, 0x37, 0x64, 0x54, 0xbd, - 0x27, 0x66, 0xc7, 0x2d, 0xaa, 0x6f, 0x65, 0x38, 0x31, 0x28, 0x72, 0x71, 0xe8, 0x63, 0x58, 0xcb, - 0xa4, 0x65, 0x5d, 0xc6, 0x03, 0x41, 0x5d, 0x8c, 0x6f, 0xdc, 0x5c, 0xcd, 0xb6, 0xc5, 0x98, 0x40, - 0x9f, 0xc3, 0x52, 0xfa, 0xc9, 0x10, 0x62, 0xad, 0x6e, 0x3f, 0x7e, 0x6b, 0xa8, 0xb4, 0x25, 0xc0, - 0xcc, 0xa0, 0xa8, 0x07, 0xe5, 0x28, 0x69, 0xb6, 0x5a, 0x16, 0x51, 0x8d, 0x79, 0xb4, 0x24, 0x75, - 0x62, 0xa6, 0x1c, 0xda, 0x1b, 0x05, 0x56, 0xa6, 0x04, 0x96, 0x6b, 0xb9, 0xf2, 0xce, 0x96, 0x2f, - 0xde, 0xad, 0xe5, 0xf9, 0xb2, 0x0b, 0x77, 0x2a, 0xbb, 0xf8, 0xdf, 0xcb, 0xde, 0xf9, 0xb5, 0xf0, - 0xba, 0xf9, 0x4b, 0x01, 0xf2, 0xc1, 0x09, 0x1d, 0x0e, 0xdc, 0x50, 0xb7, 0x99, 0x6f, 0xe4, 0x88, - 0x26, 0x83, 0x67, 0x2f, 0xe0, 0xec, 0x07, 0x62, 0x47, 0xa1, 0x71, 0x25, 0x57, 0xd7, 0xc9, 0x4f, - 0x89, 0x00, 0xba, 0x24, 0x34, 0xae, 0x84, 0x69, 0x05, 0x22, 0xf0, 0xda, 0x98, 0x7c, 0x98, 0x8c, - 0xab, 0x6c, 0x7d, 0x8d, 0x0e, 0x19, 0x77, 0x30, 0x75, 0x7f, 0xc6, 0xd2, 0x95, 0x37, 0xef, 0xc6, - 0xd8, 0x3e, 0x67, 0xde, 0x90, 0xf0, 0xd0, 0xb8, 0x4a, 0x16, 0x77, 0x63, 0x51, 0x9e, 0xed, 0x56, - 0xa1, 0x92, 0x6d, 0x68, 0x5f, 0xc1, 0xda, 0x8d, 0x0f, 0x37, 0xaa, 0x41, 0xf1, 0x47, 0x32, 0x96, - 0xda, 0x88, 0x97, 0x68, 0x1d, 0x16, 0x13, 0x9d, 0x27, 0x23, 0x22, 0x31, 0x76, 0x0a, 0x5f, 0x2a, - 0x4f, 0x31, 0x3c, 0x9c, 0xf9, 0x65, 0x45, 0x1b, 0xf0, 0xa0, 0x75, 0xd0, 0xdb, 0xdd, 0xef, 0x77, - 0xac, 0x93, 0xfe, 0xd1, 0x61, 0xa7, 0xb5, 0xbf, 0xb7, 0xdf, 0x69, 0xd7, 0x16, 0x50, 0x19, 0x8a, - 0xcd, 0x7e, 0xbb, 0xa6, 0xa0, 0x12, 0x14, 0x0e, 0xcc, 0x5a, 0x01, 0x3d, 0x01, 0xad, 0xd9, 0x6f, - 0x5b, 0xdf, 0xed, 0x1f, 0x77, 0xad, 0x5e, 0xf3, 0xb8, 0xd5, 0xdd, 0xef, 0xbf, 0xb2, 0xcc, 0xce, - 0xd1, 0xc1, 0x89, 0xd9, 0xea, 0xd4, 0x8a, 0x3b, 0x7f, 0x2a, 0xaf, 0x9b, 0x7f, 0x28, 0xf0, 0xd1, - 0x07, 0x35, 0x12, 0x19, 0x73, 0xf6, 0x0f, 0xbd, 0xb8, 0x73, 0xa3, 0xd0, 0xf3, 0xb9, 0x3a, 0x12, - 0x5f, 0xfd, 0x6f, 0x0a, 0xa8, 0x36, 0xf3, 0x67, 0x0a, 0x7b, 0x17, 0x92, 0x3a, 0xe2, 0x27, 0x72, - 0xa8, 0x7c, 0xff, 0xb5, 0xc4, 0x38, 0xcc, 0xc3, 0xd4, 0xd1, 0x19, 0x77, 0x0c, 0x87, 0x50, 0xf1, - 0x80, 0x8c, 0x49, 0xfd, 0xd3, 0x3f, 0xb2, 0x2f, 0x27, 0xd6, 0xef, 0x05, 0xed, 0x55, 0x42, 0xd0, - 0xf2, 0xd8, 0x68, 0xa8, 0xf7, 0x26, 0xa9, 0x4e, 0x1b, 0x7f, 0xa5, 0xce, 0x33, 0xe1, 0x3c, 0x9b, - 0x38, 0xcf, 0x4e, 0x1b, 0x83, 0x92, 0x48, 0xd2, 0xf8, 0x37, 0x00, 0x00, 0xff, 0xff, 0xde, 0xc1, - 0xf6, 0xc0, 0xa2, 0x0b, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/alert_service.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/alert_service.pb.go deleted file mode 100644 index 5279f0182..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/alert_service.pb.go +++ /dev/null @@ -1,707 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/alert_service.proto - -package monitoring - -import ( - context "context" - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - empty "github.com/golang/protobuf/ptypes/empty" - _ "google.golang.org/genproto/googleapis/api/annotations" - field_mask "google.golang.org/genproto/protobuf/field_mask" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The protocol for the `CreateAlertPolicy` request. -type CreateAlertPolicyRequest struct { - // Required. The project in which to create the alerting policy. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER] - // - // Note that this field names the parent container in which the alerting - // policy will be written, not the name of the created policy. The alerting - // policy that is returned will have a name that contains a normalized - // representation of this name as a prefix but adds a suffix of the form - // `/alertPolicies/[ALERT_POLICY_ID]`, identifying the policy in the - // container. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - // Required. The requested alerting policy. You should omit the `name` field in this - // policy. The name will be returned in the new policy, including - // a new `[ALERT_POLICY_ID]` value. - AlertPolicy *AlertPolicy `protobuf:"bytes,2,opt,name=alert_policy,json=alertPolicy,proto3" json:"alert_policy,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateAlertPolicyRequest) Reset() { *m = CreateAlertPolicyRequest{} } -func (m *CreateAlertPolicyRequest) String() string { return proto.CompactTextString(m) } -func (*CreateAlertPolicyRequest) ProtoMessage() {} -func (*CreateAlertPolicyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_c45362b2a456d1bf, []int{0} -} - -func (m *CreateAlertPolicyRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateAlertPolicyRequest.Unmarshal(m, b) -} -func (m *CreateAlertPolicyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateAlertPolicyRequest.Marshal(b, m, deterministic) -} -func (m *CreateAlertPolicyRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateAlertPolicyRequest.Merge(m, src) -} -func (m *CreateAlertPolicyRequest) XXX_Size() int { - return xxx_messageInfo_CreateAlertPolicyRequest.Size(m) -} -func (m *CreateAlertPolicyRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateAlertPolicyRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateAlertPolicyRequest proto.InternalMessageInfo - -func (m *CreateAlertPolicyRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *CreateAlertPolicyRequest) GetAlertPolicy() *AlertPolicy { - if m != nil { - return m.AlertPolicy - } - return nil -} - -// The protocol for the `GetAlertPolicy` request. -type GetAlertPolicyRequest struct { - // Required. The alerting policy to retrieve. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[ALERT_POLICY_ID] - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetAlertPolicyRequest) Reset() { *m = GetAlertPolicyRequest{} } -func (m *GetAlertPolicyRequest) String() string { return proto.CompactTextString(m) } -func (*GetAlertPolicyRequest) ProtoMessage() {} -func (*GetAlertPolicyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_c45362b2a456d1bf, []int{1} -} - -func (m *GetAlertPolicyRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetAlertPolicyRequest.Unmarshal(m, b) -} -func (m *GetAlertPolicyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetAlertPolicyRequest.Marshal(b, m, deterministic) -} -func (m *GetAlertPolicyRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetAlertPolicyRequest.Merge(m, src) -} -func (m *GetAlertPolicyRequest) XXX_Size() int { - return xxx_messageInfo_GetAlertPolicyRequest.Size(m) -} -func (m *GetAlertPolicyRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetAlertPolicyRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetAlertPolicyRequest proto.InternalMessageInfo - -func (m *GetAlertPolicyRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The protocol for the `ListAlertPolicies` request. -type ListAlertPoliciesRequest struct { - // Required. The project whose alert policies are to be listed. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER] - // - // Note that this field names the parent container in which the alerting - // policies to be listed are stored. To retrieve a single alerting policy - // by name, use the - // [GetAlertPolicy][google.monitoring.v3.AlertPolicyService.GetAlertPolicy] - // operation, instead. - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - // If provided, this field specifies the criteria that must be met by - // alert policies to be included in the response. - // - // For more details, see [sorting and - // filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering). - Filter string `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` - // A comma-separated list of fields by which to sort the result. Supports - // the same set of field references as the `filter` field. Entries can be - // prefixed with a minus sign to sort by the field in descending order. - // - // For more details, see [sorting and - // filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering). - OrderBy string `protobuf:"bytes,6,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` - // The maximum number of results to return in a single response. - PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If this field is not empty then it must contain the `nextPageToken` value - // returned by a previous call to this method. Using this field causes the - // method to return more results from the previous method call. - PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListAlertPoliciesRequest) Reset() { *m = ListAlertPoliciesRequest{} } -func (m *ListAlertPoliciesRequest) String() string { return proto.CompactTextString(m) } -func (*ListAlertPoliciesRequest) ProtoMessage() {} -func (*ListAlertPoliciesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_c45362b2a456d1bf, []int{2} -} - -func (m *ListAlertPoliciesRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListAlertPoliciesRequest.Unmarshal(m, b) -} -func (m *ListAlertPoliciesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListAlertPoliciesRequest.Marshal(b, m, deterministic) -} -func (m *ListAlertPoliciesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListAlertPoliciesRequest.Merge(m, src) -} -func (m *ListAlertPoliciesRequest) XXX_Size() int { - return xxx_messageInfo_ListAlertPoliciesRequest.Size(m) -} -func (m *ListAlertPoliciesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListAlertPoliciesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListAlertPoliciesRequest proto.InternalMessageInfo - -func (m *ListAlertPoliciesRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ListAlertPoliciesRequest) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *ListAlertPoliciesRequest) GetOrderBy() string { - if m != nil { - return m.OrderBy - } - return "" -} - -func (m *ListAlertPoliciesRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListAlertPoliciesRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -// The protocol for the `ListAlertPolicies` response. -type ListAlertPoliciesResponse struct { - // The returned alert policies. - AlertPolicies []*AlertPolicy `protobuf:"bytes,3,rep,name=alert_policies,json=alertPolicies,proto3" json:"alert_policies,omitempty"` - // If there might be more results than were returned, then this field is set - // to a non-empty value. To see the additional results, - // use that value as `page_token` in the next call to this method. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListAlertPoliciesResponse) Reset() { *m = ListAlertPoliciesResponse{} } -func (m *ListAlertPoliciesResponse) String() string { return proto.CompactTextString(m) } -func (*ListAlertPoliciesResponse) ProtoMessage() {} -func (*ListAlertPoliciesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_c45362b2a456d1bf, []int{3} -} - -func (m *ListAlertPoliciesResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListAlertPoliciesResponse.Unmarshal(m, b) -} -func (m *ListAlertPoliciesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListAlertPoliciesResponse.Marshal(b, m, deterministic) -} -func (m *ListAlertPoliciesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListAlertPoliciesResponse.Merge(m, src) -} -func (m *ListAlertPoliciesResponse) XXX_Size() int { - return xxx_messageInfo_ListAlertPoliciesResponse.Size(m) -} -func (m *ListAlertPoliciesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListAlertPoliciesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListAlertPoliciesResponse proto.InternalMessageInfo - -func (m *ListAlertPoliciesResponse) GetAlertPolicies() []*AlertPolicy { - if m != nil { - return m.AlertPolicies - } - return nil -} - -func (m *ListAlertPoliciesResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -// The protocol for the `UpdateAlertPolicy` request. -type UpdateAlertPolicyRequest struct { - // Optional. A list of alerting policy field names. If this field is not - // empty, each listed field in the existing alerting policy is set to the - // value of the corresponding field in the supplied policy (`alert_policy`), - // or to the field's default value if the field is not in the supplied - // alerting policy. Fields not listed retain their previous value. - // - // Examples of valid field masks include `display_name`, `documentation`, - // `documentation.content`, `documentation.mime_type`, `user_labels`, - // `user_label.nameofkey`, `enabled`, `conditions`, `combiner`, etc. - // - // If this field is empty, then the supplied alerting policy replaces the - // existing policy. It is the same as deleting the existing policy and - // adding the supplied policy, except for the following: - // - // + The new policy will have the same `[ALERT_POLICY_ID]` as the former - // policy. This gives you continuity with the former policy in your - // notifications and incidents. - // + Conditions in the new policy will keep their former `[CONDITION_ID]` if - // the supplied condition includes the `name` field with that - // `[CONDITION_ID]`. If the supplied condition omits the `name` field, - // then a new `[CONDITION_ID]` is created. - UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` - // Required. The updated alerting policy or the updated values for the - // fields listed in `update_mask`. - // If `update_mask` is not empty, any fields in this policy that are - // not in `update_mask` are ignored. - AlertPolicy *AlertPolicy `protobuf:"bytes,3,opt,name=alert_policy,json=alertPolicy,proto3" json:"alert_policy,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UpdateAlertPolicyRequest) Reset() { *m = UpdateAlertPolicyRequest{} } -func (m *UpdateAlertPolicyRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateAlertPolicyRequest) ProtoMessage() {} -func (*UpdateAlertPolicyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_c45362b2a456d1bf, []int{4} -} - -func (m *UpdateAlertPolicyRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UpdateAlertPolicyRequest.Unmarshal(m, b) -} -func (m *UpdateAlertPolicyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UpdateAlertPolicyRequest.Marshal(b, m, deterministic) -} -func (m *UpdateAlertPolicyRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateAlertPolicyRequest.Merge(m, src) -} -func (m *UpdateAlertPolicyRequest) XXX_Size() int { - return xxx_messageInfo_UpdateAlertPolicyRequest.Size(m) -} -func (m *UpdateAlertPolicyRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateAlertPolicyRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_UpdateAlertPolicyRequest proto.InternalMessageInfo - -func (m *UpdateAlertPolicyRequest) GetUpdateMask() *field_mask.FieldMask { - if m != nil { - return m.UpdateMask - } - return nil -} - -func (m *UpdateAlertPolicyRequest) GetAlertPolicy() *AlertPolicy { - if m != nil { - return m.AlertPolicy - } - return nil -} - -// The protocol for the `DeleteAlertPolicy` request. -type DeleteAlertPolicyRequest struct { - // Required. The alerting policy to delete. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/alertPolicies/[ALERT_POLICY_ID] - // - // For more information, see [AlertPolicy][google.monitoring.v3.AlertPolicy]. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteAlertPolicyRequest) Reset() { *m = DeleteAlertPolicyRequest{} } -func (m *DeleteAlertPolicyRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteAlertPolicyRequest) ProtoMessage() {} -func (*DeleteAlertPolicyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_c45362b2a456d1bf, []int{5} -} - -func (m *DeleteAlertPolicyRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteAlertPolicyRequest.Unmarshal(m, b) -} -func (m *DeleteAlertPolicyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteAlertPolicyRequest.Marshal(b, m, deterministic) -} -func (m *DeleteAlertPolicyRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteAlertPolicyRequest.Merge(m, src) -} -func (m *DeleteAlertPolicyRequest) XXX_Size() int { - return xxx_messageInfo_DeleteAlertPolicyRequest.Size(m) -} -func (m *DeleteAlertPolicyRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteAlertPolicyRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteAlertPolicyRequest proto.InternalMessageInfo - -func (m *DeleteAlertPolicyRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func init() { - proto.RegisterType((*CreateAlertPolicyRequest)(nil), "google.monitoring.v3.CreateAlertPolicyRequest") - proto.RegisterType((*GetAlertPolicyRequest)(nil), "google.monitoring.v3.GetAlertPolicyRequest") - proto.RegisterType((*ListAlertPoliciesRequest)(nil), "google.monitoring.v3.ListAlertPoliciesRequest") - proto.RegisterType((*ListAlertPoliciesResponse)(nil), "google.monitoring.v3.ListAlertPoliciesResponse") - proto.RegisterType((*UpdateAlertPolicyRequest)(nil), "google.monitoring.v3.UpdateAlertPolicyRequest") - proto.RegisterType((*DeleteAlertPolicyRequest)(nil), "google.monitoring.v3.DeleteAlertPolicyRequest") -} - -func init() { - proto.RegisterFile("google/monitoring/v3/alert_service.proto", fileDescriptor_c45362b2a456d1bf) -} - -var fileDescriptor_c45362b2a456d1bf = []byte{ - // 806 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x41, 0x4f, 0xdb, 0x48, - 0x14, 0x96, 0x13, 0x60, 0x61, 0x58, 0x58, 0x65, 0xb4, 0xcb, 0x3a, 0x66, 0x57, 0x4d, 0x53, 0x51, - 0x10, 0x05, 0x5b, 0x4a, 0x7a, 0x02, 0xb5, 0x92, 0x43, 0x5b, 0x5a, 0xa9, 0x48, 0x51, 0x68, 0x39, - 0x20, 0xaa, 0x68, 0xe2, 0x4c, 0xcc, 0x14, 0xc7, 0xe3, 0xda, 0x93, 0xd0, 0x50, 0x71, 0xe9, 0xad, - 0x87, 0x1e, 0xaa, 0x4a, 0x3d, 0xf6, 0xd0, 0x13, 0xf4, 0xde, 0x3f, 0x41, 0x7b, 0x6a, 0x6f, 0x9c, - 0x38, 0xf4, 0x57, 0xf4, 0x54, 0x79, 0xec, 0x90, 0x49, 0x62, 0x0b, 0xc3, 0x2d, 0xf3, 0xde, 0x37, - 0x6f, 0xbe, 0xf9, 0xde, 0xf7, 0x26, 0x06, 0x0b, 0x26, 0xa5, 0xa6, 0x85, 0xb5, 0x26, 0xb5, 0x09, - 0xa3, 0x2e, 0xb1, 0x4d, 0xad, 0x5d, 0xd4, 0x90, 0x85, 0x5d, 0x56, 0xf5, 0xb0, 0xdb, 0x26, 0x06, - 0x56, 0x1d, 0x97, 0x32, 0x0a, 0xff, 0x0e, 0x90, 0x6a, 0x0f, 0xa9, 0xb6, 0x8b, 0xca, 0x7f, 0xe1, - 0x7e, 0xe4, 0x10, 0x0d, 0xd9, 0x36, 0x65, 0x88, 0x11, 0x6a, 0x7b, 0xc1, 0x1e, 0xe5, 0x5f, 0x21, - 0x6b, 0x58, 0x04, 0xdb, 0x2c, 0x4c, 0x5c, 0x13, 0x12, 0x0d, 0x82, 0xad, 0x7a, 0xb5, 0x86, 0x77, - 0x51, 0x9b, 0x50, 0x37, 0x04, 0x64, 0x05, 0x80, 0x8b, 0x3d, 0xda, 0x72, 0xbb, 0x44, 0x94, 0x5c, - 0x3c, 0xe5, 0x10, 0x31, 0x1b, 0x22, 0xf8, 0xaa, 0xd6, 0x6a, 0x68, 0xb8, 0xe9, 0xb0, 0xce, 0xc0, - 0xf6, 0xf3, 0x64, 0x70, 0x7e, 0x13, 0x79, 0x7b, 0x01, 0x22, 0x7f, 0x24, 0x01, 0x79, 0xcd, 0xc5, - 0x88, 0x61, 0xdd, 0x2f, 0x5a, 0xa6, 0x16, 0x31, 0x3a, 0x15, 0xfc, 0xa2, 0x85, 0x3d, 0x06, 0x75, - 0x30, 0x62, 0xa3, 0x26, 0x96, 0xd3, 0x39, 0x69, 0x61, 0xa2, 0xb4, 0x7c, 0xa6, 0xa7, 0x7e, 0xe9, - 0xf3, 0x70, 0x4e, 0x50, 0x25, 0xa8, 0x8f, 0x1c, 0xe2, 0xa9, 0x06, 0x6d, 0x6a, 0x62, 0x0d, 0xbe, - 0x15, 0x3e, 0x02, 0x7f, 0x06, 0x02, 0x3b, 0x3c, 0x2a, 0xa7, 0x72, 0xd2, 0xc2, 0x64, 0xe1, 0xba, - 0x1a, 0x25, 0xb0, 0x2a, 0x6c, 0x2f, 0xa5, 0xcf, 0xf4, 0x54, 0x65, 0x12, 0xf5, 0x22, 0xf9, 0x6d, - 0xf0, 0xcf, 0x3a, 0x66, 0x49, 0x69, 0x82, 0xcb, 0xd0, 0xcc, 0x7f, 0x93, 0x80, 0xfc, 0x98, 0x78, - 0x42, 0x75, 0x82, 0xbd, 0xc1, 0xfa, 0x23, 0x57, 0x97, 0x61, 0x06, 0x8c, 0x35, 0x88, 0xc5, 0xb0, - 0x2b, 0x8f, 0xfa, 0x45, 0x2a, 0xe1, 0x0a, 0x66, 0xc1, 0x38, 0x75, 0xeb, 0xd8, 0xad, 0xd6, 0x3a, - 0xf2, 0x18, 0xcf, 0xfc, 0xc1, 0xd7, 0xa5, 0x0e, 0x9c, 0x05, 0x13, 0x0e, 0x32, 0x71, 0xd5, 0x23, - 0x07, 0x98, 0xcb, 0x36, 0x5a, 0x19, 0xf7, 0x03, 0x9b, 0xe4, 0x00, 0xc3, 0xff, 0x01, 0xe0, 0x49, - 0x46, 0xf7, 0xb0, 0x1d, 0x5c, 0xbc, 0xc2, 0xe1, 0x4f, 0xfc, 0x40, 0xfe, 0xad, 0x04, 0xb2, 0x11, - 0xd7, 0xf1, 0x1c, 0x6a, 0x7b, 0x18, 0x3e, 0x04, 0xd3, 0x42, 0x4f, 0x08, 0xf6, 0xe4, 0x74, 0x2e, - 0x9d, 0xa8, 0x2b, 0x95, 0x29, 0x24, 0x56, 0x84, 0x37, 0xc1, 0x5f, 0x36, 0x7e, 0xc9, 0xaa, 0x02, - 0x97, 0x14, 0xe7, 0x32, 0xe5, 0x87, 0xcb, 0xe7, 0x7c, 0x3e, 0x49, 0x40, 0x7e, 0xea, 0xd4, 0xa3, - 0x5d, 0xb6, 0x0a, 0x26, 0x5b, 0x3c, 0xc7, 0x7d, 0x19, 0x3a, 0x44, 0xe9, 0x72, 0xe9, 0x5a, 0x57, - 0x7d, 0xe0, 0x5b, 0x77, 0x03, 0x79, 0x7b, 0x15, 0x10, 0xc0, 0xfd, 0xdf, 0x43, 0xfe, 0x4a, 0x5f, - 0xdd, 0x5f, 0xcf, 0x80, 0x7c, 0x0f, 0x5b, 0x38, 0xf9, 0x24, 0x5c, 0xca, 0x62, 0x85, 0x8f, 0xe3, - 0x00, 0x0a, 0xd1, 0xcd, 0xe0, 0xc1, 0x81, 0x47, 0x12, 0xc8, 0x0c, 0xb5, 0x0a, 0xaa, 0xd1, 0x17, - 0x88, 0xb3, 0xa8, 0xa2, 0x25, 0xc6, 0x07, 0x1e, 0xc8, 0x17, 0x4e, 0x75, 0x4e, 0xeb, 0xf5, 0x8f, - 0x9f, 0xef, 0x53, 0x73, 0xf0, 0x86, 0xff, 0xac, 0xbc, 0xf2, 0x03, 0x77, 0x1c, 0x97, 0x3e, 0xc7, - 0x06, 0xf3, 0xb4, 0xc5, 0x43, 0xad, 0xbf, 0xdb, 0x1f, 0x24, 0x30, 0xdd, 0x3f, 0x81, 0xf0, 0x56, - 0xf4, 0xb9, 0x91, 0x73, 0xaa, 0x5c, 0xdc, 0x95, 0xfc, 0x6d, 0x91, 0xd6, 0x3c, 0x9c, 0x8b, 0xa2, - 0xd5, 0xcf, 0x4a, 0x5b, 0x3c, 0x84, 0x5f, 0x24, 0x90, 0x19, 0x7a, 0xc4, 0xe2, 0x34, 0x8c, 0x7b, - 0xed, 0x92, 0xd0, 0xdb, 0x38, 0xd5, 0x33, 0x3e, 0x9b, 0x25, 0xd1, 0x73, 0x9c, 0x6b, 0x31, 0x9f, - 0x44, 0xc2, 0x95, 0x3e, 0xb3, 0xc2, 0x77, 0x12, 0xc8, 0x0c, 0x59, 0x2e, 0x8e, 0x77, 0x9c, 0x37, - 0x95, 0x99, 0xa1, 0x51, 0xb9, 0xef, 0xff, 0x05, 0x0c, 0x68, 0xb9, 0x98, 0x50, 0xcb, 0xaf, 0x12, - 0xc8, 0x0c, 0x8d, 0x6a, 0x1c, 0xa7, 0xb8, 0x99, 0x4e, 0xa2, 0xa5, 0x71, 0xaa, 0xcb, 0xc2, 0xdc, - 0x0f, 0x4b, 0x5a, 0x2a, 0x14, 0x38, 0x65, 0x31, 0xa1, 0x5e, 0xc4, 0xbf, 0x5f, 0x61, 0xe5, 0x58, - 0x3a, 0xd1, 0xb3, 0xb1, 0x53, 0xfa, 0x5d, 0x7f, 0x23, 0xed, 0x32, 0xe6, 0x78, 0x2b, 0x9a, 0xb6, - 0xbf, 0xbf, 0x3f, 0x38, 0xc3, 0xa8, 0xc5, 0x76, 0x35, 0xc3, 0xa2, 0xad, 0xfa, 0xb2, 0x63, 0x21, - 0xd6, 0xa0, 0x6e, 0x73, 0xe9, 0x22, 0x78, 0xef, 0xac, 0x4b, 0x40, 0x55, 0x17, 0xa3, 0x7a, 0xe9, - 0x58, 0x02, 0xb2, 0x41, 0x9b, 0x91, 0xca, 0x95, 0x32, 0x5c, 0xba, 0xf0, 0xd1, 0x28, 0xfb, 0x8d, - 0x2e, 0x4b, 0xdb, 0x77, 0x43, 0xa8, 0x49, 0x2d, 0x64, 0x9b, 0x2a, 0x75, 0x4d, 0xcd, 0xc4, 0x36, - 0xb7, 0x81, 0xd6, 0x3b, 0xb1, 0xff, 0xe3, 0x61, 0xb5, 0xb7, 0xfa, 0x9c, 0x52, 0xd6, 0x83, 0x02, - 0x6b, 0xfe, 0x25, 0xd5, 0x8d, 0xde, 0x89, 0x5b, 0xc5, 0x93, 0x6e, 0x72, 0x87, 0x27, 0x77, 0x7a, - 0xc9, 0x9d, 0xad, 0x62, 0x6d, 0x8c, 0x1f, 0x52, 0xfc, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x54, 0x73, - 0x76, 0x58, 0x53, 0x09, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// AlertPolicyServiceClient is the client API for AlertPolicyService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type AlertPolicyServiceClient interface { - // Lists the existing alerting policies for the project. - ListAlertPolicies(ctx context.Context, in *ListAlertPoliciesRequest, opts ...grpc.CallOption) (*ListAlertPoliciesResponse, error) - // Gets a single alerting policy. - GetAlertPolicy(ctx context.Context, in *GetAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) - // Creates a new alerting policy. - CreateAlertPolicy(ctx context.Context, in *CreateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) - // Deletes an alerting policy. - DeleteAlertPolicy(ctx context.Context, in *DeleteAlertPolicyRequest, opts ...grpc.CallOption) (*empty.Empty, error) - // Updates an alerting policy. You can either replace the entire policy with - // a new one or replace only certain fields in the current alerting policy by - // specifying the fields to be updated via `updateMask`. Returns the - // updated alerting policy. - UpdateAlertPolicy(ctx context.Context, in *UpdateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) -} - -type alertPolicyServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewAlertPolicyServiceClient(cc grpc.ClientConnInterface) AlertPolicyServiceClient { - return &alertPolicyServiceClient{cc} -} - -func (c *alertPolicyServiceClient) ListAlertPolicies(ctx context.Context, in *ListAlertPoliciesRequest, opts ...grpc.CallOption) (*ListAlertPoliciesResponse, error) { - out := new(ListAlertPoliciesResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/ListAlertPolicies", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *alertPolicyServiceClient) GetAlertPolicy(ctx context.Context, in *GetAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { - out := new(AlertPolicy) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/GetAlertPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *alertPolicyServiceClient) CreateAlertPolicy(ctx context.Context, in *CreateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { - out := new(AlertPolicy) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/CreateAlertPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *alertPolicyServiceClient) DeleteAlertPolicy(ctx context.Context, in *DeleteAlertPolicyRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/DeleteAlertPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *alertPolicyServiceClient) UpdateAlertPolicy(ctx context.Context, in *UpdateAlertPolicyRequest, opts ...grpc.CallOption) (*AlertPolicy, error) { - out := new(AlertPolicy) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.AlertPolicyService/UpdateAlertPolicy", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// AlertPolicyServiceServer is the server API for AlertPolicyService service. -type AlertPolicyServiceServer interface { - // Lists the existing alerting policies for the project. - ListAlertPolicies(context.Context, *ListAlertPoliciesRequest) (*ListAlertPoliciesResponse, error) - // Gets a single alerting policy. - GetAlertPolicy(context.Context, *GetAlertPolicyRequest) (*AlertPolicy, error) - // Creates a new alerting policy. - CreateAlertPolicy(context.Context, *CreateAlertPolicyRequest) (*AlertPolicy, error) - // Deletes an alerting policy. - DeleteAlertPolicy(context.Context, *DeleteAlertPolicyRequest) (*empty.Empty, error) - // Updates an alerting policy. You can either replace the entire policy with - // a new one or replace only certain fields in the current alerting policy by - // specifying the fields to be updated via `updateMask`. Returns the - // updated alerting policy. - UpdateAlertPolicy(context.Context, *UpdateAlertPolicyRequest) (*AlertPolicy, error) -} - -// UnimplementedAlertPolicyServiceServer can be embedded to have forward compatible implementations. -type UnimplementedAlertPolicyServiceServer struct { -} - -func (*UnimplementedAlertPolicyServiceServer) ListAlertPolicies(ctx context.Context, req *ListAlertPoliciesRequest) (*ListAlertPoliciesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListAlertPolicies not implemented") -} -func (*UnimplementedAlertPolicyServiceServer) GetAlertPolicy(ctx context.Context, req *GetAlertPolicyRequest) (*AlertPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetAlertPolicy not implemented") -} -func (*UnimplementedAlertPolicyServiceServer) CreateAlertPolicy(ctx context.Context, req *CreateAlertPolicyRequest) (*AlertPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateAlertPolicy not implemented") -} -func (*UnimplementedAlertPolicyServiceServer) DeleteAlertPolicy(ctx context.Context, req *DeleteAlertPolicyRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteAlertPolicy not implemented") -} -func (*UnimplementedAlertPolicyServiceServer) UpdateAlertPolicy(ctx context.Context, req *UpdateAlertPolicyRequest) (*AlertPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateAlertPolicy not implemented") -} - -func RegisterAlertPolicyServiceServer(s *grpc.Server, srv AlertPolicyServiceServer) { - s.RegisterService(&_AlertPolicyService_serviceDesc, srv) -} - -func _AlertPolicyService_ListAlertPolicies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListAlertPoliciesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AlertPolicyServiceServer).ListAlertPolicies(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.AlertPolicyService/ListAlertPolicies", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AlertPolicyServiceServer).ListAlertPolicies(ctx, req.(*ListAlertPoliciesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _AlertPolicyService_GetAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetAlertPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AlertPolicyServiceServer).GetAlertPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.AlertPolicyService/GetAlertPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AlertPolicyServiceServer).GetAlertPolicy(ctx, req.(*GetAlertPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _AlertPolicyService_CreateAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateAlertPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AlertPolicyServiceServer).CreateAlertPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.AlertPolicyService/CreateAlertPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AlertPolicyServiceServer).CreateAlertPolicy(ctx, req.(*CreateAlertPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _AlertPolicyService_DeleteAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteAlertPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AlertPolicyServiceServer).DeleteAlertPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.AlertPolicyService/DeleteAlertPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AlertPolicyServiceServer).DeleteAlertPolicy(ctx, req.(*DeleteAlertPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _AlertPolicyService_UpdateAlertPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateAlertPolicyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AlertPolicyServiceServer).UpdateAlertPolicy(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.AlertPolicyService/UpdateAlertPolicy", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AlertPolicyServiceServer).UpdateAlertPolicy(ctx, req.(*UpdateAlertPolicyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _AlertPolicyService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.AlertPolicyService", - HandlerType: (*AlertPolicyServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListAlertPolicies", - Handler: _AlertPolicyService_ListAlertPolicies_Handler, - }, - { - MethodName: "GetAlertPolicy", - Handler: _AlertPolicyService_GetAlertPolicy_Handler, - }, - { - MethodName: "CreateAlertPolicy", - Handler: _AlertPolicyService_CreateAlertPolicy_Handler, - }, - { - MethodName: "DeleteAlertPolicy", - Handler: _AlertPolicyService_DeleteAlertPolicy_Handler, - }, - { - MethodName: "UpdateAlertPolicy", - Handler: _AlertPolicyService_UpdateAlertPolicy_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/alert_service.proto", -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/common.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/common.pb.go deleted file mode 100644 index 31e278c90..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/common.pb.go +++ /dev/null @@ -1,854 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/common.proto - -package monitoring - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - duration "github.com/golang/protobuf/ptypes/duration" - timestamp "github.com/golang/protobuf/ptypes/timestamp" - distribution "google.golang.org/genproto/googleapis/api/distribution" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// Specifies an ordering relationship on two arguments, called `left` and -// `right`. -type ComparisonType int32 - -const ( - // No ordering relationship is specified. - ComparisonType_COMPARISON_UNSPECIFIED ComparisonType = 0 - // True if the left argument is greater than the right argument. - ComparisonType_COMPARISON_GT ComparisonType = 1 - // True if the left argument is greater than or equal to the right argument. - ComparisonType_COMPARISON_GE ComparisonType = 2 - // True if the left argument is less than the right argument. - ComparisonType_COMPARISON_LT ComparisonType = 3 - // True if the left argument is less than or equal to the right argument. - ComparisonType_COMPARISON_LE ComparisonType = 4 - // True if the left argument is equal to the right argument. - ComparisonType_COMPARISON_EQ ComparisonType = 5 - // True if the left argument is not equal to the right argument. - ComparisonType_COMPARISON_NE ComparisonType = 6 -) - -var ComparisonType_name = map[int32]string{ - 0: "COMPARISON_UNSPECIFIED", - 1: "COMPARISON_GT", - 2: "COMPARISON_GE", - 3: "COMPARISON_LT", - 4: "COMPARISON_LE", - 5: "COMPARISON_EQ", - 6: "COMPARISON_NE", -} - -var ComparisonType_value = map[string]int32{ - "COMPARISON_UNSPECIFIED": 0, - "COMPARISON_GT": 1, - "COMPARISON_GE": 2, - "COMPARISON_LT": 3, - "COMPARISON_LE": 4, - "COMPARISON_EQ": 5, - "COMPARISON_NE": 6, -} - -func (x ComparisonType) String() string { - return proto.EnumName(ComparisonType_name, int32(x)) -} - -func (ComparisonType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_013c57c1dcbb8d65, []int{0} -} - -// The tier of service for a Workspace. Please see the -// [service tiers -// documentation](https://cloud.google.com/monitoring/workspaces/tiers) for more -// details. -type ServiceTier int32 // Deprecated: Do not use. -const ( - // An invalid sentinel value, used to indicate that a tier has not - // been provided explicitly. - ServiceTier_SERVICE_TIER_UNSPECIFIED ServiceTier = 0 - // The Stackdriver Basic tier, a free tier of service that provides basic - // features, a moderate allotment of logs, and access to built-in metrics. - // A number of features are not available in this tier. For more details, - // see [the service tiers - // documentation](https://cloud.google.com/monitoring/workspaces/tiers). - ServiceTier_SERVICE_TIER_BASIC ServiceTier = 1 - // The Stackdriver Premium tier, a higher, more expensive tier of service - // that provides access to all Stackdriver features, lets you use Stackdriver - // with AWS accounts, and has a larger allotments for logs and metrics. For - // more details, see [the service tiers - // documentation](https://cloud.google.com/monitoring/workspaces/tiers). - ServiceTier_SERVICE_TIER_PREMIUM ServiceTier = 2 -) - -var ServiceTier_name = map[int32]string{ - 0: "SERVICE_TIER_UNSPECIFIED", - 1: "SERVICE_TIER_BASIC", - 2: "SERVICE_TIER_PREMIUM", -} - -var ServiceTier_value = map[string]int32{ - "SERVICE_TIER_UNSPECIFIED": 0, - "SERVICE_TIER_BASIC": 1, - "SERVICE_TIER_PREMIUM": 2, -} - -func (x ServiceTier) String() string { - return proto.EnumName(ServiceTier_name, int32(x)) -} - -func (ServiceTier) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_013c57c1dcbb8d65, []int{1} -} - -// The `Aligner` specifies the operation that will be applied to the data -// points in each alignment period in a time series. Except for -// `ALIGN_NONE`, which specifies that no operation be applied, each alignment -// operation replaces the set of data values in each alignment period with -// a single value: the result of applying the operation to the data values. -// An aligned time series has a single data value at the end of each -// `alignment_period`. -// -// An alignment operation can change the data type of the values, too. For -// example, if you apply a counting operation to boolean values, the data -// `value_type` in the original time series is `BOOLEAN`, but the `value_type` -// in the aligned result is `INT64`. -type Aggregation_Aligner int32 - -const ( - // No alignment. Raw data is returned. Not valid if cross-series reduction - // is requested. The `value_type` of the result is the same as the - // `value_type` of the input. - Aggregation_ALIGN_NONE Aggregation_Aligner = 0 - // Align and convert to - // [DELTA][google.api.MetricDescriptor.MetricKind.DELTA]. - // The output is `delta = y1 - y0`. - // - // This alignment is valid for - // [CUMULATIVE][google.api.MetricDescriptor.MetricKind.CUMULATIVE] and - // `DELTA` metrics. If the selected alignment period results in periods - // with no data, then the aligned value for such a period is created by - // interpolation. The `value_type` of the aligned result is the same as - // the `value_type` of the input. - Aggregation_ALIGN_DELTA Aggregation_Aligner = 1 - // Align and convert to a rate. The result is computed as - // `rate = (y1 - y0)/(t1 - t0)`, or "delta over time". - // Think of this aligner as providing the slope of the line that passes - // through the value at the start and at the end of the `alignment_period`. - // - // This aligner is valid for `CUMULATIVE` - // and `DELTA` metrics with numeric values. If the selected alignment - // period results in periods with no data, then the aligned value for - // such a period is created by interpolation. The output is a `GAUGE` - // metric with `value_type` `DOUBLE`. - // - // If, by "rate", you mean "percentage change", see the - // `ALIGN_PERCENT_CHANGE` aligner instead. - Aggregation_ALIGN_RATE Aggregation_Aligner = 2 - // Align by interpolating between adjacent points around the alignment - // period boundary. This aligner is valid for `GAUGE` metrics with - // numeric values. The `value_type` of the aligned result is the same as the - // `value_type` of the input. - Aggregation_ALIGN_INTERPOLATE Aggregation_Aligner = 3 - // Align by moving the most recent data point before the end of the - // alignment period to the boundary at the end of the alignment - // period. This aligner is valid for `GAUGE` metrics. The `value_type` of - // the aligned result is the same as the `value_type` of the input. - Aggregation_ALIGN_NEXT_OLDER Aggregation_Aligner = 4 - // Align the time series by returning the minimum value in each alignment - // period. This aligner is valid for `GAUGE` and `DELTA` metrics with - // numeric values. The `value_type` of the aligned result is the same as - // the `value_type` of the input. - Aggregation_ALIGN_MIN Aggregation_Aligner = 10 - // Align the time series by returning the maximum value in each alignment - // period. This aligner is valid for `GAUGE` and `DELTA` metrics with - // numeric values. The `value_type` of the aligned result is the same as - // the `value_type` of the input. - Aggregation_ALIGN_MAX Aggregation_Aligner = 11 - // Align the time series by returning the mean value in each alignment - // period. This aligner is valid for `GAUGE` and `DELTA` metrics with - // numeric values. The `value_type` of the aligned result is `DOUBLE`. - Aggregation_ALIGN_MEAN Aggregation_Aligner = 12 - // Align the time series by returning the number of values in each alignment - // period. This aligner is valid for `GAUGE` and `DELTA` metrics with - // numeric or Boolean values. The `value_type` of the aligned result is - // `INT64`. - Aggregation_ALIGN_COUNT Aggregation_Aligner = 13 - // Align the time series by returning the sum of the values in each - // alignment period. This aligner is valid for `GAUGE` and `DELTA` - // metrics with numeric and distribution values. The `value_type` of the - // aligned result is the same as the `value_type` of the input. - Aggregation_ALIGN_SUM Aggregation_Aligner = 14 - // Align the time series by returning the standard deviation of the values - // in each alignment period. This aligner is valid for `GAUGE` and - // `DELTA` metrics with numeric values. The `value_type` of the output is - // `DOUBLE`. - Aggregation_ALIGN_STDDEV Aggregation_Aligner = 15 - // Align the time series by returning the number of `True` values in - // each alignment period. This aligner is valid for `GAUGE` metrics with - // Boolean values. The `value_type` of the output is `INT64`. - Aggregation_ALIGN_COUNT_TRUE Aggregation_Aligner = 16 - // Align the time series by returning the number of `False` values in - // each alignment period. This aligner is valid for `GAUGE` metrics with - // Boolean values. The `value_type` of the output is `INT64`. - Aggregation_ALIGN_COUNT_FALSE Aggregation_Aligner = 24 - // Align the time series by returning the ratio of the number of `True` - // values to the total number of values in each alignment period. This - // aligner is valid for `GAUGE` metrics with Boolean values. The output - // value is in the range [0.0, 1.0] and has `value_type` `DOUBLE`. - Aggregation_ALIGN_FRACTION_TRUE Aggregation_Aligner = 17 - // Align the time series by using [percentile - // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting - // data point in each alignment period is the 99th percentile of all data - // points in the period. This aligner is valid for `GAUGE` and `DELTA` - // metrics with distribution values. The output is a `GAUGE` metric with - // `value_type` `DOUBLE`. - Aggregation_ALIGN_PERCENTILE_99 Aggregation_Aligner = 18 - // Align the time series by using [percentile - // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting - // data point in each alignment period is the 95th percentile of all data - // points in the period. This aligner is valid for `GAUGE` and `DELTA` - // metrics with distribution values. The output is a `GAUGE` metric with - // `value_type` `DOUBLE`. - Aggregation_ALIGN_PERCENTILE_95 Aggregation_Aligner = 19 - // Align the time series by using [percentile - // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting - // data point in each alignment period is the 50th percentile of all data - // points in the period. This aligner is valid for `GAUGE` and `DELTA` - // metrics with distribution values. The output is a `GAUGE` metric with - // `value_type` `DOUBLE`. - Aggregation_ALIGN_PERCENTILE_50 Aggregation_Aligner = 20 - // Align the time series by using [percentile - // aggregation](https://en.wikipedia.org/wiki/Percentile). The resulting - // data point in each alignment period is the 5th percentile of all data - // points in the period. This aligner is valid for `GAUGE` and `DELTA` - // metrics with distribution values. The output is a `GAUGE` metric with - // `value_type` `DOUBLE`. - Aggregation_ALIGN_PERCENTILE_05 Aggregation_Aligner = 21 - // Align and convert to a percentage change. This aligner is valid for - // `GAUGE` and `DELTA` metrics with numeric values. This alignment returns - // `((current - previous)/previous) * 100`, where the value of `previous` is - // determined based on the `alignment_period`. - // - // If the values of `current` and `previous` are both 0, then the returned - // value is 0. If only `previous` is 0, the returned value is infinity. - // - // A 10-minute moving mean is computed at each point of the alignment period - // prior to the above calculation to smooth the metric and prevent false - // positives from very short-lived spikes. The moving mean is only - // applicable for data whose values are `>= 0`. Any values `< 0` are - // treated as a missing datapoint, and are ignored. While `DELTA` - // metrics are accepted by this alignment, special care should be taken that - // the values for the metric will always be positive. The output is a - // `GAUGE` metric with `value_type` `DOUBLE`. - Aggregation_ALIGN_PERCENT_CHANGE Aggregation_Aligner = 23 -) - -var Aggregation_Aligner_name = map[int32]string{ - 0: "ALIGN_NONE", - 1: "ALIGN_DELTA", - 2: "ALIGN_RATE", - 3: "ALIGN_INTERPOLATE", - 4: "ALIGN_NEXT_OLDER", - 10: "ALIGN_MIN", - 11: "ALIGN_MAX", - 12: "ALIGN_MEAN", - 13: "ALIGN_COUNT", - 14: "ALIGN_SUM", - 15: "ALIGN_STDDEV", - 16: "ALIGN_COUNT_TRUE", - 24: "ALIGN_COUNT_FALSE", - 17: "ALIGN_FRACTION_TRUE", - 18: "ALIGN_PERCENTILE_99", - 19: "ALIGN_PERCENTILE_95", - 20: "ALIGN_PERCENTILE_50", - 21: "ALIGN_PERCENTILE_05", - 23: "ALIGN_PERCENT_CHANGE", -} - -var Aggregation_Aligner_value = map[string]int32{ - "ALIGN_NONE": 0, - "ALIGN_DELTA": 1, - "ALIGN_RATE": 2, - "ALIGN_INTERPOLATE": 3, - "ALIGN_NEXT_OLDER": 4, - "ALIGN_MIN": 10, - "ALIGN_MAX": 11, - "ALIGN_MEAN": 12, - "ALIGN_COUNT": 13, - "ALIGN_SUM": 14, - "ALIGN_STDDEV": 15, - "ALIGN_COUNT_TRUE": 16, - "ALIGN_COUNT_FALSE": 24, - "ALIGN_FRACTION_TRUE": 17, - "ALIGN_PERCENTILE_99": 18, - "ALIGN_PERCENTILE_95": 19, - "ALIGN_PERCENTILE_50": 20, - "ALIGN_PERCENTILE_05": 21, - "ALIGN_PERCENT_CHANGE": 23, -} - -func (x Aggregation_Aligner) String() string { - return proto.EnumName(Aggregation_Aligner_name, int32(x)) -} - -func (Aggregation_Aligner) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_013c57c1dcbb8d65, []int{2, 0} -} - -// A Reducer operation describes how to aggregate data points from multiple -// time series into a single time series, where the value of each data point -// in the resulting series is a function of all the already aligned values in -// the input time series. -type Aggregation_Reducer int32 - -const ( - // No cross-time series reduction. The output of the `Aligner` is - // returned. - Aggregation_REDUCE_NONE Aggregation_Reducer = 0 - // Reduce by computing the mean value across time series for each - // alignment period. This reducer is valid for - // [DELTA][google.api.MetricDescriptor.MetricKind.DELTA] and - // [GAUGE][google.api.MetricDescriptor.MetricKind.GAUGE] metrics with - // numeric or distribution values. The `value_type` of the output is - // [DOUBLE][google.api.MetricDescriptor.ValueType.DOUBLE]. - Aggregation_REDUCE_MEAN Aggregation_Reducer = 1 - // Reduce by computing the minimum value across time series for each - // alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics - // with numeric values. The `value_type` of the output is the same as the - // `value_type` of the input. - Aggregation_REDUCE_MIN Aggregation_Reducer = 2 - // Reduce by computing the maximum value across time series for each - // alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics - // with numeric values. The `value_type` of the output is the same as the - // `value_type` of the input. - Aggregation_REDUCE_MAX Aggregation_Reducer = 3 - // Reduce by computing the sum across time series for each - // alignment period. This reducer is valid for `DELTA` and `GAUGE` metrics - // with numeric and distribution values. The `value_type` of the output is - // the same as the `value_type` of the input. - Aggregation_REDUCE_SUM Aggregation_Reducer = 4 - // Reduce by computing the standard deviation across time series - // for each alignment period. This reducer is valid for `DELTA` and - // `GAUGE` metrics with numeric or distribution values. The `value_type` - // of the output is `DOUBLE`. - Aggregation_REDUCE_STDDEV Aggregation_Reducer = 5 - // Reduce by computing the number of data points across time series - // for each alignment period. This reducer is valid for `DELTA` and - // `GAUGE` metrics of numeric, Boolean, distribution, and string - // `value_type`. The `value_type` of the output is `INT64`. - Aggregation_REDUCE_COUNT Aggregation_Reducer = 6 - // Reduce by computing the number of `True`-valued data points across time - // series for each alignment period. This reducer is valid for `DELTA` and - // `GAUGE` metrics of Boolean `value_type`. The `value_type` of the output - // is `INT64`. - Aggregation_REDUCE_COUNT_TRUE Aggregation_Reducer = 7 - // Reduce by computing the number of `False`-valued data points across time - // series for each alignment period. This reducer is valid for `DELTA` and - // `GAUGE` metrics of Boolean `value_type`. The `value_type` of the output - // is `INT64`. - Aggregation_REDUCE_COUNT_FALSE Aggregation_Reducer = 15 - // Reduce by computing the ratio of the number of `True`-valued data points - // to the total number of data points for each alignment period. This - // reducer is valid for `DELTA` and `GAUGE` metrics of Boolean `value_type`. - // The output value is in the range [0.0, 1.0] and has `value_type` - // `DOUBLE`. - Aggregation_REDUCE_FRACTION_TRUE Aggregation_Reducer = 8 - // Reduce by computing the [99th - // percentile](https://en.wikipedia.org/wiki/Percentile) of data points - // across time series for each alignment period. This reducer is valid for - // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value - // of the output is `DOUBLE`. - Aggregation_REDUCE_PERCENTILE_99 Aggregation_Reducer = 9 - // Reduce by computing the [95th - // percentile](https://en.wikipedia.org/wiki/Percentile) of data points - // across time series for each alignment period. This reducer is valid for - // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value - // of the output is `DOUBLE`. - Aggregation_REDUCE_PERCENTILE_95 Aggregation_Reducer = 10 - // Reduce by computing the [50th - // percentile](https://en.wikipedia.org/wiki/Percentile) of data points - // across time series for each alignment period. This reducer is valid for - // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value - // of the output is `DOUBLE`. - Aggregation_REDUCE_PERCENTILE_50 Aggregation_Reducer = 11 - // Reduce by computing the [5th - // percentile](https://en.wikipedia.org/wiki/Percentile) of data points - // across time series for each alignment period. This reducer is valid for - // `GAUGE` and `DELTA` metrics of numeric and distribution type. The value - // of the output is `DOUBLE`. - Aggregation_REDUCE_PERCENTILE_05 Aggregation_Reducer = 12 -) - -var Aggregation_Reducer_name = map[int32]string{ - 0: "REDUCE_NONE", - 1: "REDUCE_MEAN", - 2: "REDUCE_MIN", - 3: "REDUCE_MAX", - 4: "REDUCE_SUM", - 5: "REDUCE_STDDEV", - 6: "REDUCE_COUNT", - 7: "REDUCE_COUNT_TRUE", - 15: "REDUCE_COUNT_FALSE", - 8: "REDUCE_FRACTION_TRUE", - 9: "REDUCE_PERCENTILE_99", - 10: "REDUCE_PERCENTILE_95", - 11: "REDUCE_PERCENTILE_50", - 12: "REDUCE_PERCENTILE_05", -} - -var Aggregation_Reducer_value = map[string]int32{ - "REDUCE_NONE": 0, - "REDUCE_MEAN": 1, - "REDUCE_MIN": 2, - "REDUCE_MAX": 3, - "REDUCE_SUM": 4, - "REDUCE_STDDEV": 5, - "REDUCE_COUNT": 6, - "REDUCE_COUNT_TRUE": 7, - "REDUCE_COUNT_FALSE": 15, - "REDUCE_FRACTION_TRUE": 8, - "REDUCE_PERCENTILE_99": 9, - "REDUCE_PERCENTILE_95": 10, - "REDUCE_PERCENTILE_50": 11, - "REDUCE_PERCENTILE_05": 12, -} - -func (x Aggregation_Reducer) String() string { - return proto.EnumName(Aggregation_Reducer_name, int32(x)) -} - -func (Aggregation_Reducer) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_013c57c1dcbb8d65, []int{2, 1} -} - -// A single strongly-typed value. -type TypedValue struct { - // The typed value field. - // - // Types that are valid to be assigned to Value: - // *TypedValue_BoolValue - // *TypedValue_Int64Value - // *TypedValue_DoubleValue - // *TypedValue_StringValue - // *TypedValue_DistributionValue - Value isTypedValue_Value `protobuf_oneof:"value"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TypedValue) Reset() { *m = TypedValue{} } -func (m *TypedValue) String() string { return proto.CompactTextString(m) } -func (*TypedValue) ProtoMessage() {} -func (*TypedValue) Descriptor() ([]byte, []int) { - return fileDescriptor_013c57c1dcbb8d65, []int{0} -} - -func (m *TypedValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_TypedValue.Unmarshal(m, b) -} -func (m *TypedValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_TypedValue.Marshal(b, m, deterministic) -} -func (m *TypedValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_TypedValue.Merge(m, src) -} -func (m *TypedValue) XXX_Size() int { - return xxx_messageInfo_TypedValue.Size(m) -} -func (m *TypedValue) XXX_DiscardUnknown() { - xxx_messageInfo_TypedValue.DiscardUnknown(m) -} - -var xxx_messageInfo_TypedValue proto.InternalMessageInfo - -type isTypedValue_Value interface { - isTypedValue_Value() -} - -type TypedValue_BoolValue struct { - BoolValue bool `protobuf:"varint,1,opt,name=bool_value,json=boolValue,proto3,oneof"` -} - -type TypedValue_Int64Value struct { - Int64Value int64 `protobuf:"varint,2,opt,name=int64_value,json=int64Value,proto3,oneof"` -} - -type TypedValue_DoubleValue struct { - DoubleValue float64 `protobuf:"fixed64,3,opt,name=double_value,json=doubleValue,proto3,oneof"` -} - -type TypedValue_StringValue struct { - StringValue string `protobuf:"bytes,4,opt,name=string_value,json=stringValue,proto3,oneof"` -} - -type TypedValue_DistributionValue struct { - DistributionValue *distribution.Distribution `protobuf:"bytes,5,opt,name=distribution_value,json=distributionValue,proto3,oneof"` -} - -func (*TypedValue_BoolValue) isTypedValue_Value() {} - -func (*TypedValue_Int64Value) isTypedValue_Value() {} - -func (*TypedValue_DoubleValue) isTypedValue_Value() {} - -func (*TypedValue_StringValue) isTypedValue_Value() {} - -func (*TypedValue_DistributionValue) isTypedValue_Value() {} - -func (m *TypedValue) GetValue() isTypedValue_Value { - if m != nil { - return m.Value - } - return nil -} - -func (m *TypedValue) GetBoolValue() bool { - if x, ok := m.GetValue().(*TypedValue_BoolValue); ok { - return x.BoolValue - } - return false -} - -func (m *TypedValue) GetInt64Value() int64 { - if x, ok := m.GetValue().(*TypedValue_Int64Value); ok { - return x.Int64Value - } - return 0 -} - -func (m *TypedValue) GetDoubleValue() float64 { - if x, ok := m.GetValue().(*TypedValue_DoubleValue); ok { - return x.DoubleValue - } - return 0 -} - -func (m *TypedValue) GetStringValue() string { - if x, ok := m.GetValue().(*TypedValue_StringValue); ok { - return x.StringValue - } - return "" -} - -func (m *TypedValue) GetDistributionValue() *distribution.Distribution { - if x, ok := m.GetValue().(*TypedValue_DistributionValue); ok { - return x.DistributionValue - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*TypedValue) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*TypedValue_BoolValue)(nil), - (*TypedValue_Int64Value)(nil), - (*TypedValue_DoubleValue)(nil), - (*TypedValue_StringValue)(nil), - (*TypedValue_DistributionValue)(nil), - } -} - -// A closed time interval. It extends from the start time to the end time, and includes both: `[startTime, endTime]`. Valid time intervals depend on the [`MetricKind`](/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors#MetricKind) of the metric value. In no case can the end time be earlier than the start time. -// -// * For a `GAUGE` metric, the `startTime` value is technically optional; if -// no value is specified, the start time defaults to the value of the -// end time, and the interval represents a single point in time. If both -// start and end times are specified, they must be identical. Such an -// interval is valid only for `GAUGE` metrics, which are point-in-time -// measurements. -// -// * For `DELTA` and `CUMULATIVE` metrics, the start time must be earlier -// than the end time. -// -// * In all cases, the start time of the next interval must be -// at least a microsecond after the end time of the previous interval. -// Because the interval is closed, if the start time of a new interval -// is the same as the end time of the previous interval, data written -// at the new start time could overwrite data written at the previous -// end time. -type TimeInterval struct { - // Required. The end of the time interval. - EndTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` - // Optional. The beginning of the time interval. The default value - // for the start time is the end time. The start time must not be - // later than the end time. - StartTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TimeInterval) Reset() { *m = TimeInterval{} } -func (m *TimeInterval) String() string { return proto.CompactTextString(m) } -func (*TimeInterval) ProtoMessage() {} -func (*TimeInterval) Descriptor() ([]byte, []int) { - return fileDescriptor_013c57c1dcbb8d65, []int{1} -} - -func (m *TimeInterval) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_TimeInterval.Unmarshal(m, b) -} -func (m *TimeInterval) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_TimeInterval.Marshal(b, m, deterministic) -} -func (m *TimeInterval) XXX_Merge(src proto.Message) { - xxx_messageInfo_TimeInterval.Merge(m, src) -} -func (m *TimeInterval) XXX_Size() int { - return xxx_messageInfo_TimeInterval.Size(m) -} -func (m *TimeInterval) XXX_DiscardUnknown() { - xxx_messageInfo_TimeInterval.DiscardUnknown(m) -} - -var xxx_messageInfo_TimeInterval proto.InternalMessageInfo - -func (m *TimeInterval) GetEndTime() *timestamp.Timestamp { - if m != nil { - return m.EndTime - } - return nil -} - -func (m *TimeInterval) GetStartTime() *timestamp.Timestamp { - if m != nil { - return m.StartTime - } - return nil -} - -// Describes how to combine multiple time series to provide a different view of -// the data. Aggregation of time series is done in two steps. First, each time -// series in the set is _aligned_ to the same time interval boundaries, then the -// set of time series is optionally _reduced_ in number. -// -// Alignment consists of applying the `per_series_aligner` operation -// to each time series after its data has been divided into regular -// `alignment_period` time intervals. This process takes _all_ of the data -// points in an alignment period, applies a mathematical transformation such as -// averaging, minimum, maximum, delta, etc., and converts them into a single -// data point per period. -// -// Reduction is when the aligned and transformed time series can optionally be -// combined, reducing the number of time series through similar mathematical -// transformations. Reduction involves applying a `cross_series_reducer` to -// all the time series, optionally sorting the time series into subsets with -// `group_by_fields`, and applying the reducer to each subset. -// -// The raw time series data can contain a huge amount of information from -// multiple sources. Alignment and reduction transforms this mass of data into -// a more manageable and representative collection of data, for example "the -// 95% latency across the average of all tasks in a cluster". This -// representative data can be more easily graphed and comprehended, and the -// individual time series data is still available for later drilldown. For more -// details, see [Aggregating Time -// Series](/monitoring/api/v3/metrics#aggregating_time_series). -type Aggregation struct { - // The `alignment_period` specifies a time interval, in seconds, that is used - // to divide the data in all the - // [time series][google.monitoring.v3.TimeSeries] into consistent blocks of - // time. This will be done before the per-series aligner can be applied to - // the data. - // - // The value must be at least 60 seconds. If a per-series aligner other than - // `ALIGN_NONE` is specified, this field is required or an error is returned. - // If no per-series aligner is specified, or the aligner `ALIGN_NONE` is - // specified, then this field is ignored. - AlignmentPeriod *duration.Duration `protobuf:"bytes,1,opt,name=alignment_period,json=alignmentPeriod,proto3" json:"alignment_period,omitempty"` - // An `Aligner` describes how to bring the data points in a single - // time series into temporal alignment. Except for `ALIGN_NONE`, all - // alignments cause all the data points in an `alignment_period` to be - // mathematically grouped together, resulting in a single data point for - // each `alignment_period` with end timestamp at the end of the period. - // - // Not all alignment operations may be applied to all time series. The valid - // choices depend on the `metric_kind` and `value_type` of the original time - // series. Alignment can change the `metric_kind` or the `value_type` of - // the time series. - // - // Time series data must be aligned in order to perform cross-time - // series reduction. If `cross_series_reducer` is specified, then - // `per_series_aligner` must be specified and not equal to `ALIGN_NONE` - // and `alignment_period` must be specified; otherwise, an error is - // returned. - PerSeriesAligner Aggregation_Aligner `protobuf:"varint,2,opt,name=per_series_aligner,json=perSeriesAligner,proto3,enum=google.monitoring.v3.Aggregation_Aligner" json:"per_series_aligner,omitempty"` - // The reduction operation to be used to combine time series into a single - // time series, where the value of each data point in the resulting series is - // a function of all the already aligned values in the input time series. - // - // Not all reducer operations can be applied to all time series. The valid - // choices depend on the `metric_kind` and the `value_type` of the original - // time series. Reduction can yield a time series with a different - // `metric_kind` or `value_type` than the input time series. - // - // Time series data must first be aligned (see `per_series_aligner`) in order - // to perform cross-time series reduction. If `cross_series_reducer` is - // specified, then `per_series_aligner` must be specified, and must not be - // `ALIGN_NONE`. An `alignment_period` must also be specified; otherwise, an - // error is returned. - CrossSeriesReducer Aggregation_Reducer `protobuf:"varint,4,opt,name=cross_series_reducer,json=crossSeriesReducer,proto3,enum=google.monitoring.v3.Aggregation_Reducer" json:"cross_series_reducer,omitempty"` - // The set of fields to preserve when `cross_series_reducer` is - // specified. The `group_by_fields` determine how the time series are - // partitioned into subsets prior to applying the aggregation - // operation. Each subset contains time series that have the same - // value for each of the grouping fields. Each individual time - // series is a member of exactly one subset. The - // `cross_series_reducer` is applied to each subset of time series. - // It is not possible to reduce across different resource types, so - // this field implicitly contains `resource.type`. Fields not - // specified in `group_by_fields` are aggregated away. If - // `group_by_fields` is not specified and all the time series have - // the same resource type, then the time series are aggregated into - // a single output time series. If `cross_series_reducer` is not - // defined, this field is ignored. - GroupByFields []string `protobuf:"bytes,5,rep,name=group_by_fields,json=groupByFields,proto3" json:"group_by_fields,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Aggregation) Reset() { *m = Aggregation{} } -func (m *Aggregation) String() string { return proto.CompactTextString(m) } -func (*Aggregation) ProtoMessage() {} -func (*Aggregation) Descriptor() ([]byte, []int) { - return fileDescriptor_013c57c1dcbb8d65, []int{2} -} - -func (m *Aggregation) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Aggregation.Unmarshal(m, b) -} -func (m *Aggregation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Aggregation.Marshal(b, m, deterministic) -} -func (m *Aggregation) XXX_Merge(src proto.Message) { - xxx_messageInfo_Aggregation.Merge(m, src) -} -func (m *Aggregation) XXX_Size() int { - return xxx_messageInfo_Aggregation.Size(m) -} -func (m *Aggregation) XXX_DiscardUnknown() { - xxx_messageInfo_Aggregation.DiscardUnknown(m) -} - -var xxx_messageInfo_Aggregation proto.InternalMessageInfo - -func (m *Aggregation) GetAlignmentPeriod() *duration.Duration { - if m != nil { - return m.AlignmentPeriod - } - return nil -} - -func (m *Aggregation) GetPerSeriesAligner() Aggregation_Aligner { - if m != nil { - return m.PerSeriesAligner - } - return Aggregation_ALIGN_NONE -} - -func (m *Aggregation) GetCrossSeriesReducer() Aggregation_Reducer { - if m != nil { - return m.CrossSeriesReducer - } - return Aggregation_REDUCE_NONE -} - -func (m *Aggregation) GetGroupByFields() []string { - if m != nil { - return m.GroupByFields - } - return nil -} - -func init() { - proto.RegisterEnum("google.monitoring.v3.ComparisonType", ComparisonType_name, ComparisonType_value) - proto.RegisterEnum("google.monitoring.v3.ServiceTier", ServiceTier_name, ServiceTier_value) - proto.RegisterEnum("google.monitoring.v3.Aggregation_Aligner", Aggregation_Aligner_name, Aggregation_Aligner_value) - proto.RegisterEnum("google.monitoring.v3.Aggregation_Reducer", Aggregation_Reducer_name, Aggregation_Reducer_value) - proto.RegisterType((*TypedValue)(nil), "google.monitoring.v3.TypedValue") - proto.RegisterType((*TimeInterval)(nil), "google.monitoring.v3.TimeInterval") - proto.RegisterType((*Aggregation)(nil), "google.monitoring.v3.Aggregation") -} - -func init() { proto.RegisterFile("google/monitoring/v3/common.proto", fileDescriptor_013c57c1dcbb8d65) } - -var fileDescriptor_013c57c1dcbb8d65 = []byte{ - // 946 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x95, 0x41, 0x6f, 0xe2, 0xc6, - 0x1b, 0xc6, 0x31, 0x24, 0x21, 0xbc, 0x4e, 0xc2, 0x64, 0x36, 0x9b, 0xe5, 0x8f, 0xfe, 0xed, 0xb2, - 0xa9, 0x54, 0xd1, 0x3d, 0x98, 0x28, 0x29, 0x95, 0xa2, 0x4a, 0x95, 0x1c, 0x33, 0x49, 0x2c, 0x81, - 0xa1, 0x83, 0x49, 0xa3, 0x36, 0x92, 0x65, 0xc2, 0xac, 0x65, 0x09, 0x6c, 0x6b, 0x30, 0x91, 0x72, - 0xeb, 0xbd, 0xdf, 0xa1, 0x97, 0xde, 0x7a, 0xeb, 0xd7, 0xe8, 0x87, 0xe9, 0xa5, 0x5f, 0xa0, 0xf2, - 0x8c, 0xbd, 0x36, 0x94, 0xaa, 0x3d, 0xbe, 0xbf, 0xe7, 0x79, 0xdf, 0x99, 0x79, 0xc6, 0x1a, 0xc3, - 0x3b, 0x2f, 0x0c, 0xbd, 0x39, 0xeb, 0x2c, 0xc2, 0xc0, 0x8f, 0x43, 0xee, 0x07, 0x5e, 0xe7, 0xf9, - 0xb2, 0xf3, 0x14, 0x2e, 0x16, 0x61, 0xa0, 0x45, 0x3c, 0x8c, 0x43, 0x7c, 0x22, 0x2d, 0x5a, 0x6e, - 0xd1, 0x9e, 0x2f, 0x9b, 0x9f, 0xa4, 0x8d, 0x6e, 0xe4, 0x77, 0x66, 0xfe, 0x32, 0xe6, 0xfe, 0x74, - 0x15, 0xfb, 0x59, 0x53, 0xf3, 0xd3, 0x54, 0x16, 0xd5, 0x74, 0xf5, 0xa1, 0x33, 0x5b, 0x71, 0xb7, - 0xa0, 0xbf, 0xdd, 0xd4, 0x63, 0x7f, 0xc1, 0x96, 0xb1, 0xbb, 0x88, 0xa4, 0xe1, 0xec, 0x0f, 0x05, - 0xc0, 0x7e, 0x89, 0xd8, 0xec, 0xde, 0x9d, 0xaf, 0x18, 0x7e, 0x0b, 0x30, 0x0d, 0xc3, 0xb9, 0xf3, - 0x9c, 0x54, 0x0d, 0xa5, 0xa5, 0xb4, 0xf7, 0xef, 0x4a, 0xb4, 0x96, 0x30, 0x69, 0x78, 0x07, 0xaa, - 0x1f, 0xc4, 0x5f, 0x7d, 0x99, 0x3a, 0xca, 0x2d, 0xa5, 0x5d, 0xb9, 0x2b, 0x51, 0x10, 0x50, 0x5a, - 0x3e, 0x83, 0x83, 0x59, 0xb8, 0x9a, 0xce, 0x59, 0xea, 0xa9, 0xb4, 0x94, 0xb6, 0x72, 0x57, 0xa2, - 0xaa, 0xa4, 0x1f, 0x4d, 0xc9, 0x61, 0x02, 0x2f, 0x35, 0xed, 0xb4, 0x94, 0x76, 0x2d, 0x31, 0x49, - 0x2a, 0x4d, 0x26, 0xe0, 0xe2, 0x99, 0x53, 0xeb, 0x6e, 0x4b, 0x69, 0xab, 0x17, 0x0d, 0x2d, 0xcd, - 0xcb, 0x8d, 0x7c, 0xad, 0x57, 0x70, 0xdd, 0x95, 0xe8, 0x71, 0xb1, 0x4b, 0x8c, 0xba, 0xae, 0xc2, - 0xae, 0xe8, 0x3e, 0xfb, 0x51, 0x81, 0x03, 0xdb, 0x5f, 0x30, 0x33, 0x88, 0x19, 0x7f, 0x76, 0xe7, - 0xb8, 0x0b, 0xfb, 0x2c, 0x98, 0x39, 0x49, 0x30, 0xe2, 0x38, 0xea, 0x45, 0x33, 0x1b, 0x9d, 0xa5, - 0xa6, 0xd9, 0x59, 0x6a, 0xb4, 0xca, 0x82, 0x59, 0x52, 0xe1, 0x2b, 0x80, 0x65, 0xec, 0xf2, 0x58, - 0x36, 0x2a, 0xff, 0xda, 0x58, 0x13, 0xee, 0xa4, 0x3e, 0xfb, 0xb3, 0x0a, 0xaa, 0xee, 0x79, 0x9c, - 0x79, 0xe2, 0xaa, 0x70, 0x0f, 0x90, 0x3b, 0xf7, 0xbd, 0x60, 0xc1, 0x82, 0xd8, 0x89, 0x18, 0xf7, - 0xc3, 0x59, 0x3a, 0xf0, 0x7f, 0x7f, 0x1b, 0xd8, 0x4b, 0xef, 0x97, 0xd6, 0x3f, 0xb6, 0x8c, 0x44, - 0x07, 0xfe, 0x0e, 0x70, 0xc4, 0xb8, 0xb3, 0x64, 0xdc, 0x67, 0x4b, 0x47, 0xa8, 0x8c, 0x8b, 0x13, - 0x1d, 0x5d, 0x7c, 0xa1, 0x6d, 0xfb, 0xb8, 0xb4, 0xc2, 0x26, 0x34, 0x5d, 0x36, 0x50, 0x14, 0x31, - 0x3e, 0x16, 0x33, 0x52, 0x82, 0x7f, 0x80, 0x93, 0x27, 0x1e, 0x2e, 0x97, 0xd9, 0x68, 0xce, 0x66, - 0xab, 0x27, 0xc6, 0xc5, 0x95, 0xfd, 0xa7, 0xd1, 0x54, 0x36, 0x50, 0x2c, 0xc6, 0xc8, 0xe1, 0x29, - 0xc3, 0x9f, 0x43, 0xdd, 0xe3, 0xe1, 0x2a, 0x72, 0xa6, 0x2f, 0xce, 0x07, 0x9f, 0xcd, 0x67, 0xcb, - 0xc6, 0x6e, 0xab, 0xd2, 0xae, 0xd1, 0x43, 0x81, 0xaf, 0x5f, 0x6e, 0x04, 0x3c, 0xfb, 0xa9, 0x02, - 0xd5, 0x6c, 0x43, 0x47, 0x00, 0x7a, 0xdf, 0xbc, 0xb5, 0x1c, 0x6b, 0x68, 0x11, 0x54, 0xc2, 0x75, - 0x50, 0x65, 0xdd, 0x23, 0x7d, 0x5b, 0x47, 0x4a, 0x6e, 0xa0, 0xba, 0x4d, 0x50, 0x19, 0xbf, 0x86, - 0x63, 0x59, 0x9b, 0x96, 0x4d, 0xe8, 0x68, 0xd8, 0x4f, 0x70, 0x05, 0x9f, 0x00, 0x4a, 0xe7, 0x90, - 0x07, 0xdb, 0x19, 0xf6, 0x7b, 0x84, 0xa2, 0x1d, 0x7c, 0x08, 0x35, 0x49, 0x07, 0xa6, 0x85, 0xa0, - 0x50, 0xea, 0x0f, 0x48, 0xcd, 0x47, 0x0f, 0x88, 0x6e, 0xa1, 0x83, 0x7c, 0x6d, 0x63, 0x38, 0xb1, - 0x6c, 0x74, 0x98, 0xfb, 0xc7, 0x93, 0x01, 0x3a, 0xc2, 0x08, 0x0e, 0xd2, 0xd2, 0xee, 0xf5, 0xc8, - 0x3d, 0xaa, 0xe7, 0xab, 0x8a, 0x0e, 0xc7, 0xa6, 0x13, 0x82, 0x50, 0xbe, 0x45, 0x49, 0x6f, 0xf4, - 0xfe, 0x98, 0xa0, 0x06, 0x7e, 0x03, 0xaf, 0x24, 0xbe, 0xa1, 0xba, 0x61, 0x9b, 0x43, 0x4b, 0xfa, - 0x8f, 0x73, 0x61, 0x44, 0xa8, 0x41, 0x2c, 0xdb, 0xec, 0x13, 0xe7, 0xea, 0x0a, 0xe1, 0xed, 0x42, - 0x17, 0xbd, 0xda, 0x2a, 0x74, 0xcf, 0xd1, 0xc9, 0x56, 0xe1, 0xbc, 0x8b, 0x5e, 0xe3, 0x06, 0x9c, - 0xac, 0x09, 0x8e, 0x71, 0xa7, 0x5b, 0xb7, 0x04, 0xbd, 0x39, 0xfb, 0xad, 0x0c, 0xd5, 0xec, 0x06, - 0xeb, 0xa0, 0x52, 0xd2, 0x9b, 0x18, 0xa4, 0x70, 0x1d, 0x29, 0x10, 0x19, 0x89, 0xeb, 0xc8, 0x80, - 0x69, 0xa1, 0x72, 0xb1, 0xd6, 0x1f, 0x50, 0xa5, 0x50, 0x27, 0x99, 0xed, 0xe0, 0x63, 0x38, 0xcc, - 0x6a, 0x19, 0xda, 0x6e, 0x12, 0x63, 0x8a, 0x64, 0xce, 0x7b, 0x49, 0x60, 0x45, 0x22, 0x73, 0xa9, - 0xe2, 0x53, 0xc0, 0x6b, 0x58, 0x06, 0x59, 0x4f, 0xce, 0x92, 0xf2, 0xf5, 0x24, 0xf7, 0x0b, 0xca, - 0x7a, 0x94, 0xb5, 0x7f, 0x50, 0xba, 0x08, 0xb6, 0x2b, 0xdd, 0x73, 0xa4, 0x6e, 0x57, 0xce, 0xbb, - 0xe8, 0xe0, 0xfd, 0xcf, 0x0a, 0x1c, 0x19, 0xe1, 0x22, 0x72, 0xb9, 0xbf, 0x0c, 0x83, 0xe4, 0xcd, - 0xc5, 0x4d, 0x38, 0x35, 0x86, 0x83, 0x91, 0x4e, 0xcd, 0xf1, 0xd0, 0x72, 0x26, 0xd6, 0x78, 0x44, - 0x0c, 0xf3, 0xc6, 0x24, 0x3d, 0x54, 0x4a, 0x42, 0x28, 0x68, 0xb7, 0x36, 0x52, 0x36, 0x51, 0xf2, - 0x65, 0xaf, 0xa3, 0xbe, 0x8d, 0x2a, 0x9b, 0x88, 0xc8, 0x40, 0x0b, 0x88, 0x7c, 0x8b, 0x76, 0x37, - 0x90, 0x45, 0xd0, 0xde, 0x7b, 0x17, 0xd4, 0x31, 0xe3, 0xcf, 0xfe, 0x13, 0xb3, 0x7d, 0xc6, 0xf1, - 0xff, 0xa1, 0x31, 0x26, 0xf4, 0xde, 0x34, 0x88, 0x63, 0x9b, 0x84, 0x6e, 0x6c, 0xef, 0x14, 0xf0, - 0x9a, 0x7a, 0xad, 0x8f, 0x4d, 0x03, 0x29, 0xc9, 0xf9, 0xd7, 0xf8, 0x88, 0x92, 0x81, 0x39, 0x19, - 0xa0, 0x72, 0xb3, 0xdc, 0x50, 0xae, 0x7f, 0x51, 0xa0, 0xf1, 0x14, 0x2e, 0xb6, 0x3e, 0x19, 0xd7, - 0xaa, 0x21, 0x7e, 0x87, 0xa3, 0xe4, 0xa9, 0x1b, 0x29, 0xdf, 0x7f, 0x93, 0x9a, 0xbc, 0x70, 0xee, - 0x06, 0x9e, 0x16, 0x72, 0xaf, 0xe3, 0xb1, 0x40, 0x3c, 0x84, 0x1d, 0x29, 0xb9, 0x91, 0xbf, 0x5c, - 0xff, 0xa3, 0x7e, 0x9d, 0x57, 0xbf, 0x96, 0x9b, 0xb7, 0x72, 0x80, 0x31, 0x0f, 0x57, 0x33, 0x6d, - 0x90, 0xaf, 0x75, 0x7f, 0xf9, 0x7b, 0x26, 0x3e, 0x0a, 0xf1, 0x31, 0x17, 0x1f, 0xef, 0x2f, 0xa7, - 0x7b, 0x62, 0x91, 0xcb, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x70, 0xc6, 0x75, 0xb5, 0x07, - 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/dropped_labels.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/dropped_labels.pb.go deleted file mode 100644 index fc158f196..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/dropped_labels.pb.go +++ /dev/null @@ -1,106 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/dropped_labels.proto - -package monitoring - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// A set of (label, value) pairs which were dropped during aggregation, attached -// to google.api.Distribution.Exemplars in google.api.Distribution values during -// aggregation. -// -// These values are used in combination with the label values that remain on the -// aggregated Distribution timeseries to construct the full label set for the -// exemplar values. The resulting full label set may be used to identify the -// specific task/job/instance (for example) which may be contributing to a -// long-tail, while allowing the storage savings of only storing aggregated -// distribution values for a large group. -// -// Note that there are no guarantees on ordering of the labels from -// exemplar-to-exemplar and from distribution-to-distribution in the same -// stream, and there may be duplicates. It is up to clients to resolve any -// ambiguities. -type DroppedLabels struct { - // Map from label to its value, for all labels dropped in any aggregation. - Label map[string]string `protobuf:"bytes,1,rep,name=label,proto3" json:"label,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DroppedLabels) Reset() { *m = DroppedLabels{} } -func (m *DroppedLabels) String() string { return proto.CompactTextString(m) } -func (*DroppedLabels) ProtoMessage() {} -func (*DroppedLabels) Descriptor() ([]byte, []int) { - return fileDescriptor_15749142c06d7f43, []int{0} -} - -func (m *DroppedLabels) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DroppedLabels.Unmarshal(m, b) -} -func (m *DroppedLabels) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DroppedLabels.Marshal(b, m, deterministic) -} -func (m *DroppedLabels) XXX_Merge(src proto.Message) { - xxx_messageInfo_DroppedLabels.Merge(m, src) -} -func (m *DroppedLabels) XXX_Size() int { - return xxx_messageInfo_DroppedLabels.Size(m) -} -func (m *DroppedLabels) XXX_DiscardUnknown() { - xxx_messageInfo_DroppedLabels.DiscardUnknown(m) -} - -var xxx_messageInfo_DroppedLabels proto.InternalMessageInfo - -func (m *DroppedLabels) GetLabel() map[string]string { - if m != nil { - return m.Label - } - return nil -} - -func init() { - proto.RegisterType((*DroppedLabels)(nil), "google.monitoring.v3.DroppedLabels") - proto.RegisterMapType((map[string]string)(nil), "google.monitoring.v3.DroppedLabels.LabelEntry") -} - -func init() { - proto.RegisterFile("google/monitoring/v3/dropped_labels.proto", fileDescriptor_15749142c06d7f43) -} - -var fileDescriptor_15749142c06d7f43 = []byte{ - // 246 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x4c, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0xcf, 0xcd, 0xcf, 0xcb, 0x2c, 0xc9, 0x2f, 0xca, 0xcc, 0x4b, 0xd7, 0x2f, 0x33, - 0xd6, 0x4f, 0x29, 0xca, 0x2f, 0x28, 0x48, 0x4d, 0x89, 0xcf, 0x49, 0x4c, 0x4a, 0xcd, 0x29, 0xd6, - 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x81, 0x28, 0xd5, 0x43, 0x28, 0xd5, 0x2b, 0x33, 0x56, - 0xea, 0x67, 0xe4, 0xe2, 0x75, 0x81, 0x28, 0xf7, 0x01, 0xab, 0x16, 0x72, 0xe1, 0x62, 0x05, 0xeb, - 0x93, 0x60, 0x54, 0x60, 0xd6, 0xe0, 0x36, 0xd2, 0xd3, 0xc3, 0xa6, 0x4f, 0x0f, 0x45, 0x8f, 0x1e, - 0x98, 0x72, 0xcd, 0x2b, 0x29, 0xaa, 0x0c, 0x82, 0x68, 0x96, 0xb2, 0xe0, 0xe2, 0x42, 0x08, 0x0a, - 0x09, 0x70, 0x31, 0x67, 0xa7, 0x56, 0x4a, 0x30, 0x2a, 0x30, 0x6a, 0x70, 0x06, 0x81, 0x98, 0x42, - 0x22, 0x5c, 0xac, 0x65, 0x89, 0x39, 0xa5, 0xa9, 0x12, 0x4c, 0x60, 0x31, 0x08, 0xc7, 0x8a, 0xc9, - 0x82, 0xd1, 0x69, 0x15, 0x23, 0x97, 0x44, 0x72, 0x7e, 0x2e, 0x56, 0x6b, 0x9d, 0x84, 0x50, 0xec, - 0x0d, 0x00, 0x79, 0x2c, 0x80, 0x31, 0xca, 0x0e, 0xaa, 0x36, 0x3d, 0x3f, 0x27, 0x31, 0x2f, 0x5d, - 0x2f, 0xbf, 0x28, 0x5d, 0x3f, 0x3d, 0x35, 0x0f, 0xec, 0x6d, 0x7d, 0x88, 0x54, 0x62, 0x41, 0x66, - 0x31, 0x6a, 0x20, 0x59, 0x23, 0x78, 0xab, 0x98, 0xa4, 0xdc, 0x21, 0x06, 0x38, 0xe7, 0xe4, 0x97, - 0xa6, 0xe8, 0xf9, 0x22, 0xac, 0x0c, 0x33, 0x3e, 0x05, 0x93, 0x8c, 0x01, 0x4b, 0xc6, 0x20, 0x24, - 0x63, 0xc2, 0x8c, 0x93, 0xd8, 0xc0, 0x96, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x65, 0x9b, - 0x10, 0x62, 0x88, 0x01, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/group.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/group.pb.go deleted file mode 100644 index fb2ec76e4..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/group.pb.go +++ /dev/null @@ -1,165 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/group.proto - -package monitoring - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The description of a dynamic collection of monitored resources. Each group -// has a filter that is matched against monitored resources and their associated -// metadata. If a group's filter matches an available monitored resource, then -// that resource is a member of that group. Groups can contain any number of -// monitored resources, and each monitored resource can be a member of any -// number of groups. -// -// Groups can be nested in parent-child hierarchies. The `parentName` field -// identifies an optional parent for each group. If a group has a parent, then -// the only monitored resources available to be matched by the group's filter -// are the resources contained in the parent group. In other words, a group -// contains the monitored resources that match its filter and the filters of all -// the group's ancestors. A group without a parent can contain any monitored -// resource. -// -// For example, consider an infrastructure running a set of instances with two -// user-defined tags: `"environment"` and `"role"`. A parent group has a filter, -// `environment="production"`. A child of that parent group has a filter, -// `role="transcoder"`. The parent group contains all instances in the -// production environment, regardless of their roles. The child group contains -// instances that have the transcoder role *and* are in the production -// environment. -// -// The monitored resources contained in a group can change at any moment, -// depending on what resources exist and what filters are associated with the -// group and its ancestors. -type Group struct { - // Output only. The name of this group. The format is - // `"projects/{project_id_or_number}/groups/{group_id}"`. - // When creating a group, this field is ignored and a new name is created - // consisting of the project specified in the call to `CreateGroup` - // and a unique `{group_id}` that is generated automatically. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // A user-assigned name for this group, used only for display purposes. - DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // The name of the group's parent, if it has one. - // The format is `"projects/{project_id_or_number}/groups/{group_id}"`. - // For groups with no parent, `parentName` is the empty string, `""`. - ParentName string `protobuf:"bytes,3,opt,name=parent_name,json=parentName,proto3" json:"parent_name,omitempty"` - // The filter used to determine which monitored resources belong to this - // group. - Filter string `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` - // If true, the members of this group are considered to be a cluster. - // The system can perform additional analysis on groups that are clusters. - IsCluster bool `protobuf:"varint,6,opt,name=is_cluster,json=isCluster,proto3" json:"is_cluster,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Group) Reset() { *m = Group{} } -func (m *Group) String() string { return proto.CompactTextString(m) } -func (*Group) ProtoMessage() {} -func (*Group) Descriptor() ([]byte, []int) { - return fileDescriptor_907e30c1f087271d, []int{0} -} - -func (m *Group) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Group.Unmarshal(m, b) -} -func (m *Group) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Group.Marshal(b, m, deterministic) -} -func (m *Group) XXX_Merge(src proto.Message) { - xxx_messageInfo_Group.Merge(m, src) -} -func (m *Group) XXX_Size() int { - return xxx_messageInfo_Group.Size(m) -} -func (m *Group) XXX_DiscardUnknown() { - xxx_messageInfo_Group.DiscardUnknown(m) -} - -var xxx_messageInfo_Group proto.InternalMessageInfo - -func (m *Group) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Group) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -func (m *Group) GetParentName() string { - if m != nil { - return m.ParentName - } - return "" -} - -func (m *Group) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *Group) GetIsCluster() bool { - if m != nil { - return m.IsCluster - } - return false -} - -func init() { - proto.RegisterType((*Group)(nil), "google.monitoring.v3.Group") -} - -func init() { proto.RegisterFile("google/monitoring/v3/group.proto", fileDescriptor_907e30c1f087271d) } - -var fileDescriptor_907e30c1f087271d = []byte{ - // 349 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x91, 0xcf, 0x4a, 0x2b, 0x31, - 0x14, 0xc6, 0x49, 0xef, 0x6d, 0xb9, 0x4d, 0xef, 0x6a, 0xb8, 0x5c, 0x6a, 0x41, 0xda, 0xba, 0x2a, - 0x0a, 0xc9, 0x62, 0x76, 0x0a, 0x82, 0xed, 0xa2, 0x2b, 0xa5, 0x74, 0xd1, 0x85, 0x14, 0x4a, 0x9c, - 0xa6, 0x21, 0x92, 0xc9, 0x09, 0xc9, 0x4c, 0x41, 0x87, 0x3e, 0x86, 0x0b, 0xb7, 0x2e, 0x5d, 0xfa, - 0x18, 0x3e, 0x8a, 0x4f, 0x21, 0x93, 0x8c, 0x4c, 0xa5, 0xae, 0xe6, 0x9c, 0xf3, 0xfd, 0x72, 0xfe, - 0x7c, 0x83, 0x07, 0x02, 0x40, 0x28, 0x4e, 0x53, 0xd0, 0x32, 0x03, 0x2b, 0xb5, 0xa0, 0xdb, 0x98, - 0x0a, 0x0b, 0xb9, 0x21, 0xc6, 0x42, 0x06, 0xd1, 0xbf, 0x40, 0x90, 0x9a, 0x20, 0xdb, 0xb8, 0x77, - 0x54, 0xbd, 0x63, 0x46, 0x52, 0xcb, 0x1d, 0xe4, 0x36, 0xe1, 0xe1, 0xc1, 0xc9, 0x5b, 0x03, 0x37, - 0xa7, 0x65, 0x83, 0x28, 0xc2, 0xbf, 0x35, 0x4b, 0x79, 0x17, 0x0d, 0xd0, 0xa8, 0x3d, 0xf7, 0x71, - 0x34, 0xc4, 0x7f, 0xd7, 0xd2, 0x19, 0xc5, 0x1e, 0x56, 0x5e, 0x6b, 0x78, 0xad, 0x53, 0xd5, 0x6e, - 0x4a, 0xa4, 0x8f, 0x3b, 0x86, 0x59, 0xae, 0xb3, 0x40, 0xfc, 0xf2, 0x04, 0x0e, 0x25, 0x0f, 0xfc, - 0xc7, 0xad, 0x8d, 0x54, 0x19, 0xb7, 0xdd, 0xa6, 0xd7, 0xaa, 0x2c, 0x3a, 0xc6, 0x58, 0xba, 0x55, - 0xa2, 0x72, 0x57, 0x6a, 0xad, 0x01, 0x1a, 0xfd, 0x99, 0xb7, 0xa5, 0x9b, 0x84, 0xc2, 0xf9, 0x33, - 0xfa, 0xb8, 0x7a, 0x42, 0xb8, 0xbf, 0x77, 0x49, 0xb8, 0x82, 0x19, 0xe9, 0x48, 0x02, 0x29, 0x0d, - 0x6b, 0x0f, 0x8d, 0x85, 0x7b, 0x9e, 0x64, 0x8e, 0x16, 0x55, 0xb4, 0x0b, 0x8e, 0x38, 0x5a, 0xf8, - 0xef, 0x2e, 0x3a, 0x03, 0x2b, 0x98, 0x96, 0x8f, 0x2c, 0x93, 0xa0, 0x1d, 0x2d, 0xf6, 0xd3, 0x03, - 0xb8, 0xbf, 0x01, 0xb5, 0xe6, 0xd6, 0xd1, 0x22, 0x04, 0x07, 0x00, 0x3a, 0x1d, 0xbf, 0x20, 0xdc, - 0x4d, 0x20, 0x25, 0x3f, 0x99, 0x3d, 0xc6, 0x7e, 0xaf, 0x59, 0xe9, 0xee, 0x0c, 0xdd, 0x5e, 0x56, - 0x8c, 0x00, 0xc5, 0xb4, 0x20, 0x60, 0x05, 0x15, 0x5c, 0x7b, 0xef, 0x69, 0x7d, 0xcf, 0xf7, 0x3f, - 0x7a, 0x51, 0x67, 0xaf, 0x8d, 0xde, 0x34, 0x34, 0x98, 0x28, 0xc8, 0xd7, 0xe4, 0xba, 0x1e, 0xb5, - 0x88, 0xdf, 0xbf, 0xc4, 0xa5, 0x17, 0x97, 0xb5, 0xb8, 0x5c, 0xc4, 0x77, 0x2d, 0x3f, 0x24, 0xfe, - 0x0c, 0x00, 0x00, 0xff, 0xff, 0x3e, 0xbb, 0x3f, 0x33, 0x35, 0x02, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/group_service.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/group_service.pb.go deleted file mode 100644 index c496d0f24..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/group_service.pb.go +++ /dev/null @@ -1,931 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/group_service.proto - -package monitoring - -import ( - context "context" - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - empty "github.com/golang/protobuf/ptypes/empty" - _ "google.golang.org/genproto/googleapis/api/annotations" - monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The `ListGroup` request. -type ListGroupsRequest struct { - // Required. The project whose groups are to be listed. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER] - Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"` - // An optional filter consisting of a single group name. The filters limit - // the groups returned based on their parent-child relationship with the - // specified group. If no filter is specified, all groups are returned. - // - // Types that are valid to be assigned to Filter: - // *ListGroupsRequest_ChildrenOfGroup - // *ListGroupsRequest_AncestorsOfGroup - // *ListGroupsRequest_DescendantsOfGroup - Filter isListGroupsRequest_Filter `protobuf_oneof:"filter"` - // A positive number that is the maximum number of results to return. - PageSize int32 `protobuf:"varint,5,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If this field is not empty then it must contain the `next_page_token` value - // returned by a previous call to this method. Using this field causes the - // method to return additional results from the previous method call. - PageToken string `protobuf:"bytes,6,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListGroupsRequest) Reset() { *m = ListGroupsRequest{} } -func (m *ListGroupsRequest) String() string { return proto.CompactTextString(m) } -func (*ListGroupsRequest) ProtoMessage() {} -func (*ListGroupsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_21ad21d0ed55c55a, []int{0} -} - -func (m *ListGroupsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListGroupsRequest.Unmarshal(m, b) -} -func (m *ListGroupsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListGroupsRequest.Marshal(b, m, deterministic) -} -func (m *ListGroupsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListGroupsRequest.Merge(m, src) -} -func (m *ListGroupsRequest) XXX_Size() int { - return xxx_messageInfo_ListGroupsRequest.Size(m) -} -func (m *ListGroupsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListGroupsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListGroupsRequest proto.InternalMessageInfo - -func (m *ListGroupsRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -type isListGroupsRequest_Filter interface { - isListGroupsRequest_Filter() -} - -type ListGroupsRequest_ChildrenOfGroup struct { - ChildrenOfGroup string `protobuf:"bytes,2,opt,name=children_of_group,json=childrenOfGroup,proto3,oneof"` -} - -type ListGroupsRequest_AncestorsOfGroup struct { - AncestorsOfGroup string `protobuf:"bytes,3,opt,name=ancestors_of_group,json=ancestorsOfGroup,proto3,oneof"` -} - -type ListGroupsRequest_DescendantsOfGroup struct { - DescendantsOfGroup string `protobuf:"bytes,4,opt,name=descendants_of_group,json=descendantsOfGroup,proto3,oneof"` -} - -func (*ListGroupsRequest_ChildrenOfGroup) isListGroupsRequest_Filter() {} - -func (*ListGroupsRequest_AncestorsOfGroup) isListGroupsRequest_Filter() {} - -func (*ListGroupsRequest_DescendantsOfGroup) isListGroupsRequest_Filter() {} - -func (m *ListGroupsRequest) GetFilter() isListGroupsRequest_Filter { - if m != nil { - return m.Filter - } - return nil -} - -func (m *ListGroupsRequest) GetChildrenOfGroup() string { - if x, ok := m.GetFilter().(*ListGroupsRequest_ChildrenOfGroup); ok { - return x.ChildrenOfGroup - } - return "" -} - -func (m *ListGroupsRequest) GetAncestorsOfGroup() string { - if x, ok := m.GetFilter().(*ListGroupsRequest_AncestorsOfGroup); ok { - return x.AncestorsOfGroup - } - return "" -} - -func (m *ListGroupsRequest) GetDescendantsOfGroup() string { - if x, ok := m.GetFilter().(*ListGroupsRequest_DescendantsOfGroup); ok { - return x.DescendantsOfGroup - } - return "" -} - -func (m *ListGroupsRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListGroupsRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*ListGroupsRequest) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*ListGroupsRequest_ChildrenOfGroup)(nil), - (*ListGroupsRequest_AncestorsOfGroup)(nil), - (*ListGroupsRequest_DescendantsOfGroup)(nil), - } -} - -// The `ListGroups` response. -type ListGroupsResponse struct { - // The groups that match the specified filters. - Group []*Group `protobuf:"bytes,1,rep,name=group,proto3" json:"group,omitempty"` - // If there are more results than have been returned, then this field is set - // to a non-empty value. To see the additional results, - // use that value as `page_token` in the next call to this method. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListGroupsResponse) Reset() { *m = ListGroupsResponse{} } -func (m *ListGroupsResponse) String() string { return proto.CompactTextString(m) } -func (*ListGroupsResponse) ProtoMessage() {} -func (*ListGroupsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_21ad21d0ed55c55a, []int{1} -} - -func (m *ListGroupsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListGroupsResponse.Unmarshal(m, b) -} -func (m *ListGroupsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListGroupsResponse.Marshal(b, m, deterministic) -} -func (m *ListGroupsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListGroupsResponse.Merge(m, src) -} -func (m *ListGroupsResponse) XXX_Size() int { - return xxx_messageInfo_ListGroupsResponse.Size(m) -} -func (m *ListGroupsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListGroupsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListGroupsResponse proto.InternalMessageInfo - -func (m *ListGroupsResponse) GetGroup() []*Group { - if m != nil { - return m.Group - } - return nil -} - -func (m *ListGroupsResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -// The `GetGroup` request. -type GetGroupRequest struct { - // Required. The group to retrieve. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID] - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetGroupRequest) Reset() { *m = GetGroupRequest{} } -func (m *GetGroupRequest) String() string { return proto.CompactTextString(m) } -func (*GetGroupRequest) ProtoMessage() {} -func (*GetGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_21ad21d0ed55c55a, []int{2} -} - -func (m *GetGroupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetGroupRequest.Unmarshal(m, b) -} -func (m *GetGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetGroupRequest.Marshal(b, m, deterministic) -} -func (m *GetGroupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetGroupRequest.Merge(m, src) -} -func (m *GetGroupRequest) XXX_Size() int { - return xxx_messageInfo_GetGroupRequest.Size(m) -} -func (m *GetGroupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetGroupRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetGroupRequest proto.InternalMessageInfo - -func (m *GetGroupRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The `CreateGroup` request. -type CreateGroupRequest struct { - // Required. The project in which to create the group. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER] - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - // Required. A group definition. It is an error to define the `name` field because - // the system assigns the name. - Group *Group `protobuf:"bytes,2,opt,name=group,proto3" json:"group,omitempty"` - // If true, validate this request but do not create the group. - ValidateOnly bool `protobuf:"varint,3,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateGroupRequest) Reset() { *m = CreateGroupRequest{} } -func (m *CreateGroupRequest) String() string { return proto.CompactTextString(m) } -func (*CreateGroupRequest) ProtoMessage() {} -func (*CreateGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_21ad21d0ed55c55a, []int{3} -} - -func (m *CreateGroupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateGroupRequest.Unmarshal(m, b) -} -func (m *CreateGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateGroupRequest.Marshal(b, m, deterministic) -} -func (m *CreateGroupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateGroupRequest.Merge(m, src) -} -func (m *CreateGroupRequest) XXX_Size() int { - return xxx_messageInfo_CreateGroupRequest.Size(m) -} -func (m *CreateGroupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateGroupRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateGroupRequest proto.InternalMessageInfo - -func (m *CreateGroupRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *CreateGroupRequest) GetGroup() *Group { - if m != nil { - return m.Group - } - return nil -} - -func (m *CreateGroupRequest) GetValidateOnly() bool { - if m != nil { - return m.ValidateOnly - } - return false -} - -// The `UpdateGroup` request. -type UpdateGroupRequest struct { - // Required. The new definition of the group. All fields of the existing group, - // excepting `name`, are replaced with the corresponding fields of this group. - Group *Group `protobuf:"bytes,2,opt,name=group,proto3" json:"group,omitempty"` - // If true, validate this request but do not update the existing group. - ValidateOnly bool `protobuf:"varint,3,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UpdateGroupRequest) Reset() { *m = UpdateGroupRequest{} } -func (m *UpdateGroupRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateGroupRequest) ProtoMessage() {} -func (*UpdateGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_21ad21d0ed55c55a, []int{4} -} - -func (m *UpdateGroupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UpdateGroupRequest.Unmarshal(m, b) -} -func (m *UpdateGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UpdateGroupRequest.Marshal(b, m, deterministic) -} -func (m *UpdateGroupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateGroupRequest.Merge(m, src) -} -func (m *UpdateGroupRequest) XXX_Size() int { - return xxx_messageInfo_UpdateGroupRequest.Size(m) -} -func (m *UpdateGroupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateGroupRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_UpdateGroupRequest proto.InternalMessageInfo - -func (m *UpdateGroupRequest) GetGroup() *Group { - if m != nil { - return m.Group - } - return nil -} - -func (m *UpdateGroupRequest) GetValidateOnly() bool { - if m != nil { - return m.ValidateOnly - } - return false -} - -// The `DeleteGroup` request. The default behavior is to be able to delete a -// single group without any descendants. -type DeleteGroupRequest struct { - // Required. The group to delete. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID] - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - // If this field is true, then the request means to delete a group with all - // its descendants. Otherwise, the request means to delete a group only when - // it has no descendants. The default value is false. - Recursive bool `protobuf:"varint,4,opt,name=recursive,proto3" json:"recursive,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteGroupRequest) Reset() { *m = DeleteGroupRequest{} } -func (m *DeleteGroupRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteGroupRequest) ProtoMessage() {} -func (*DeleteGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_21ad21d0ed55c55a, []int{5} -} - -func (m *DeleteGroupRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteGroupRequest.Unmarshal(m, b) -} -func (m *DeleteGroupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteGroupRequest.Marshal(b, m, deterministic) -} -func (m *DeleteGroupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteGroupRequest.Merge(m, src) -} -func (m *DeleteGroupRequest) XXX_Size() int { - return xxx_messageInfo_DeleteGroupRequest.Size(m) -} -func (m *DeleteGroupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteGroupRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteGroupRequest proto.InternalMessageInfo - -func (m *DeleteGroupRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *DeleteGroupRequest) GetRecursive() bool { - if m != nil { - return m.Recursive - } - return false -} - -// The `ListGroupMembers` request. -type ListGroupMembersRequest struct { - // Required. The group whose members are listed. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/groups/[GROUP_ID] - Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"` - // A positive number that is the maximum number of results to return. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If this field is not empty then it must contain the `next_page_token` value - // returned by a previous call to this method. Using this field causes the - // method to return additional results from the previous method call. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - // An optional [list - // filter](https://cloud.google.com/monitoring/api/learn_more#filtering) - // describing the members to be returned. The filter may reference the type, - // labels, and metadata of monitored resources that comprise the group. For - // example, to return only resources representing Compute Engine VM instances, - // use this filter: - // - // `resource.type = "gce_instance"` - Filter string `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"` - // An optional time interval for which results should be returned. Only - // members that were part of the group during the specified interval are - // included in the response. If no interval is provided then the group - // membership over the last minute is returned. - Interval *TimeInterval `protobuf:"bytes,6,opt,name=interval,proto3" json:"interval,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListGroupMembersRequest) Reset() { *m = ListGroupMembersRequest{} } -func (m *ListGroupMembersRequest) String() string { return proto.CompactTextString(m) } -func (*ListGroupMembersRequest) ProtoMessage() {} -func (*ListGroupMembersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_21ad21d0ed55c55a, []int{6} -} - -func (m *ListGroupMembersRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListGroupMembersRequest.Unmarshal(m, b) -} -func (m *ListGroupMembersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListGroupMembersRequest.Marshal(b, m, deterministic) -} -func (m *ListGroupMembersRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListGroupMembersRequest.Merge(m, src) -} -func (m *ListGroupMembersRequest) XXX_Size() int { - return xxx_messageInfo_ListGroupMembersRequest.Size(m) -} -func (m *ListGroupMembersRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListGroupMembersRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListGroupMembersRequest proto.InternalMessageInfo - -func (m *ListGroupMembersRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ListGroupMembersRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListGroupMembersRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -func (m *ListGroupMembersRequest) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *ListGroupMembersRequest) GetInterval() *TimeInterval { - if m != nil { - return m.Interval - } - return nil -} - -// The `ListGroupMembers` response. -type ListGroupMembersResponse struct { - // A set of monitored resources in the group. - Members []*monitoredres.MonitoredResource `protobuf:"bytes,1,rep,name=members,proto3" json:"members,omitempty"` - // If there are more results than have been returned, then this field is - // set to a non-empty value. To see the additional results, use that value as - // `page_token` in the next call to this method. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - // The total number of elements matching this request. - TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListGroupMembersResponse) Reset() { *m = ListGroupMembersResponse{} } -func (m *ListGroupMembersResponse) String() string { return proto.CompactTextString(m) } -func (*ListGroupMembersResponse) ProtoMessage() {} -func (*ListGroupMembersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_21ad21d0ed55c55a, []int{7} -} - -func (m *ListGroupMembersResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListGroupMembersResponse.Unmarshal(m, b) -} -func (m *ListGroupMembersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListGroupMembersResponse.Marshal(b, m, deterministic) -} -func (m *ListGroupMembersResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListGroupMembersResponse.Merge(m, src) -} -func (m *ListGroupMembersResponse) XXX_Size() int { - return xxx_messageInfo_ListGroupMembersResponse.Size(m) -} -func (m *ListGroupMembersResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListGroupMembersResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListGroupMembersResponse proto.InternalMessageInfo - -func (m *ListGroupMembersResponse) GetMembers() []*monitoredres.MonitoredResource { - if m != nil { - return m.Members - } - return nil -} - -func (m *ListGroupMembersResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -func (m *ListGroupMembersResponse) GetTotalSize() int32 { - if m != nil { - return m.TotalSize - } - return 0 -} - -func init() { - proto.RegisterType((*ListGroupsRequest)(nil), "google.monitoring.v3.ListGroupsRequest") - proto.RegisterType((*ListGroupsResponse)(nil), "google.monitoring.v3.ListGroupsResponse") - proto.RegisterType((*GetGroupRequest)(nil), "google.monitoring.v3.GetGroupRequest") - proto.RegisterType((*CreateGroupRequest)(nil), "google.monitoring.v3.CreateGroupRequest") - proto.RegisterType((*UpdateGroupRequest)(nil), "google.monitoring.v3.UpdateGroupRequest") - proto.RegisterType((*DeleteGroupRequest)(nil), "google.monitoring.v3.DeleteGroupRequest") - proto.RegisterType((*ListGroupMembersRequest)(nil), "google.monitoring.v3.ListGroupMembersRequest") - proto.RegisterType((*ListGroupMembersResponse)(nil), "google.monitoring.v3.ListGroupMembersResponse") -} - -func init() { - proto.RegisterFile("google/monitoring/v3/group_service.proto", fileDescriptor_21ad21d0ed55c55a) -} - -var fileDescriptor_21ad21d0ed55c55a = []byte{ - // 999 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0x67, 0xed, 0x24, 0xb5, 0xc7, 0xad, 0xd2, 0x8c, 0xaa, 0xd6, 0xdd, 0xa4, 0xad, 0xb3, 0xfd, - 0x67, 0x85, 0x66, 0x57, 0xc4, 0xe2, 0x8f, 0x1a, 0x51, 0xc9, 0x2e, 0x28, 0x20, 0x51, 0x1a, 0x6d, - 0x43, 0x85, 0x50, 0x24, 0x6b, 0xb2, 0x7e, 0x76, 0x06, 0x76, 0x67, 0xb6, 0xb3, 0x63, 0x87, 0x14, - 0x85, 0x03, 0x37, 0x24, 0x84, 0x84, 0xb8, 0xa0, 0x7e, 0x02, 0xca, 0x81, 0x0f, 0xd2, 0x23, 0xdc, - 0x72, 0xea, 0x81, 0x13, 0x1f, 0xa1, 0x27, 0xb4, 0xb3, 0x3b, 0xf1, 0xc6, 0x7f, 0x93, 0x48, 0x1c, - 0xf7, 0xbd, 0xdf, 0xbc, 0xdf, 0x7b, 0x6f, 0xde, 0xfb, 0xcd, 0xa2, 0x6a, 0x87, 0xf3, 0x8e, 0x0f, - 0x4e, 0xc0, 0x19, 0x95, 0x5c, 0x50, 0xd6, 0x71, 0x7a, 0x35, 0xa7, 0x23, 0x78, 0x37, 0x6c, 0x46, - 0x20, 0x7a, 0xd4, 0x03, 0x3b, 0x14, 0x5c, 0x72, 0x7c, 0x29, 0x41, 0xda, 0x7d, 0xa4, 0xdd, 0xab, - 0x99, 0x4b, 0xe9, 0x79, 0x12, 0x52, 0x87, 0x30, 0xc6, 0x25, 0x91, 0x94, 0xb3, 0x28, 0x39, 0x63, - 0x5e, 0xc9, 0x78, 0x3d, 0x9f, 0x02, 0x93, 0xa9, 0xe3, 0x46, 0xc6, 0xd1, 0xa6, 0xe0, 0xb7, 0x9a, - 0x3b, 0xb0, 0x4b, 0x7a, 0x94, 0x8b, 0x14, 0x70, 0x33, 0x03, 0x48, 0x19, 0xa1, 0xd5, 0x14, 0x10, - 0xf1, 0xae, 0xd0, 0x29, 0x99, 0x57, 0x33, 0xa0, 0x01, 0xd7, 0xf2, 0xc8, 0xba, 0x3c, 0x1e, 0x04, - 0x9c, 0xa5, 0x90, 0xca, 0xf8, 0xd2, 0x53, 0xc4, 0x62, 0x8a, 0x50, 0x5f, 0x3b, 0xdd, 0xb6, 0x03, - 0x41, 0x28, 0xf7, 0x13, 0xa7, 0xf5, 0x22, 0x8f, 0x16, 0x3e, 0xa3, 0x91, 0xdc, 0x88, 0x0f, 0x44, - 0x2e, 0x3c, 0xeb, 0x42, 0x24, 0xf1, 0x3a, 0x9a, 0x61, 0x24, 0x80, 0xf2, 0xb9, 0x8a, 0x51, 0x2d, - 0x36, 0xee, 0xbe, 0xae, 0xe7, 0xde, 0xd4, 0x97, 0xf1, 0x8d, 0x4c, 0xd3, 0x92, 0x98, 0x24, 0xa4, - 0x91, 0xed, 0xf1, 0xc0, 0x51, 0xc7, 0x5d, 0x75, 0x08, 0xbb, 0x68, 0xc1, 0xdb, 0xa5, 0x7e, 0x4b, - 0x00, 0x6b, 0xf2, 0x76, 0x53, 0xa5, 0x52, 0xce, 0xa9, 0x48, 0xb7, 0xde, 0xd4, 0x97, 0xd1, 0xb4, - 0x30, 0x9f, 0xbc, 0xe5, 0xce, 0xeb, 0x00, 0x8f, 0xdb, 0xca, 0x84, 0xb7, 0x10, 0x26, 0xcc, 0x83, - 0x48, 0x72, 0x11, 0xf5, 0x83, 0xe6, 0x4f, 0x15, 0xf4, 0xe2, 0x51, 0x04, 0x1d, 0xf5, 0x4b, 0x74, - 0xa9, 0x05, 0x91, 0x07, 0xac, 0x45, 0x98, 0xcc, 0xc4, 0x9d, 0x39, 0x55, 0x5c, 0x9c, 0x89, 0xa1, - 0x23, 0x2f, 0xa2, 0x62, 0x48, 0x3a, 0xd0, 0x8c, 0xe8, 0x73, 0x28, 0xcf, 0x56, 0x8c, 0xea, 0xac, - 0x5b, 0x88, 0x0d, 0x4f, 0xe8, 0x73, 0xc0, 0xd7, 0x10, 0x52, 0x4e, 0xc9, 0xbf, 0x01, 0x56, 0x9e, - 0x8b, 0xc9, 0x5c, 0x05, 0xdf, 0x8a, 0x0d, 0x8d, 0x02, 0x9a, 0x6b, 0x53, 0x5f, 0x82, 0xb0, 0x38, - 0xc2, 0xd9, 0xbb, 0x89, 0x42, 0xce, 0x22, 0xc0, 0xef, 0xa0, 0xd9, 0x24, 0x4d, 0xa3, 0x92, 0xaf, - 0x96, 0xd6, 0x16, 0xed, 0x51, 0x23, 0x6d, 0x27, 0x37, 0x92, 0x20, 0xf1, 0x1d, 0x34, 0xcf, 0xe0, - 0x5b, 0xd9, 0xcc, 0xd0, 0xaa, 0x0b, 0x71, 0x2f, 0xc4, 0xe6, 0x4d, 0x4d, 0x6d, 0x7d, 0x8e, 0xe6, - 0x37, 0x20, 0xe1, 0x1b, 0x1c, 0x85, 0x7c, 0x76, 0x14, 0xd0, 0xc9, 0x46, 0xc1, 0xfa, 0xd3, 0x40, - 0xf8, 0xa1, 0x00, 0x22, 0x61, 0x64, 0xcc, 0x99, 0xb3, 0x8c, 0xd7, 0x7b, 0xba, 0xfc, 0xb8, 0x82, - 0xc9, 0xe5, 0x37, 0xf2, 0xaf, 0xeb, 0x39, 0xdd, 0x83, 0x9b, 0xe8, 0x42, 0x8f, 0xf8, 0xb4, 0x45, - 0x24, 0x34, 0x39, 0xf3, 0xf7, 0x55, 0x45, 0x05, 0xf7, 0xbc, 0x36, 0x3e, 0x66, 0xfe, 0xbe, 0xf5, - 0x0c, 0xe1, 0x2f, 0xc2, 0xd6, 0x60, 0xbe, 0xff, 0x2b, 0x25, 0x47, 0xf8, 0x23, 0xf0, 0x61, 0x4c, - 0x8b, 0xce, 0xd2, 0x76, 0xbc, 0x84, 0x8a, 0x02, 0xbc, 0xae, 0x88, 0x68, 0x2f, 0x69, 0x72, 0xc1, - 0xed, 0x1b, 0xac, 0x7f, 0x0d, 0x74, 0xe5, 0x68, 0xac, 0x1e, 0x41, 0xb0, 0x03, 0x62, 0xf2, 0xe2, - 0x9f, 0x94, 0xf6, 0xd8, 0xd0, 0xe7, 0x27, 0x0e, 0xfd, 0xcc, 0xc0, 0xd0, 0xe3, 0xcb, 0x7a, 0xe8, - 0xd5, 0xb6, 0x14, 0xdd, 0xf4, 0x0b, 0x3f, 0x40, 0x05, 0xca, 0x24, 0x88, 0x1e, 0xf1, 0xd5, 0xa6, - 0x94, 0xd6, 0xac, 0xd1, 0xdd, 0xdf, 0xa2, 0x01, 0x7c, 0x9a, 0x22, 0xdd, 0xa3, 0x33, 0xd6, 0x0b, - 0x03, 0x95, 0x87, 0x8b, 0x4d, 0x37, 0xe9, 0x7d, 0x74, 0x2e, 0x48, 0x4c, 0xe9, 0x2e, 0x5d, 0xd3, - 0xb1, 0x49, 0x48, 0xed, 0x47, 0x5a, 0xb0, 0xdd, 0x54, 0x94, 0x5d, 0x8d, 0x3e, 0xe9, 0x3e, 0xc5, - 0x45, 0x4b, 0x2e, 0x89, 0x9f, 0x6d, 0x49, 0x51, 0x59, 0xe2, 0x9e, 0xac, 0xfd, 0x56, 0x40, 0xe7, - 0x55, 0x62, 0x4f, 0x92, 0x37, 0x0a, 0xff, 0x64, 0x20, 0xd4, 0xdf, 0x78, 0x7c, 0x77, 0x74, 0xa9, - 0x43, 0x7a, 0x6d, 0x56, 0xa7, 0x03, 0x93, 0x92, 0xad, 0xb7, 0x0f, 0xeb, 0xea, 0xb2, 0x7e, 0xf8, - 0xfb, 0x9f, 0x5f, 0x73, 0xd7, 0xf1, 0x52, 0xfc, 0x58, 0x7c, 0x17, 0x1b, 0x3e, 0x0c, 0x05, 0xff, - 0x1a, 0x3c, 0x19, 0x39, 0x2b, 0x07, 0xc9, 0xf3, 0x11, 0xe1, 0x03, 0x54, 0xd0, 0x72, 0x80, 0x6f, - 0x8f, 0x19, 0xfa, 0xe3, 0x72, 0x61, 0x4e, 0xda, 0x0d, 0x6b, 0x35, 0x4b, 0x5e, 0xc1, 0xd7, 0x47, - 0x91, 0xa7, 0xdc, 0xce, 0xca, 0x01, 0xfe, 0xd9, 0x40, 0xa5, 0x8c, 0x7a, 0xe0, 0x31, 0x55, 0x0e, - 0x0b, 0xcc, 0xe4, 0x2c, 0x3e, 0x38, 0xac, 0xa3, 0x98, 0xf4, 0x9e, 0x62, 0x52, 0xb9, 0xdc, 0xb6, - 0x26, 0x36, 0xe2, 0x7e, 0xba, 0xcf, 0xbf, 0x18, 0xa8, 0x94, 0x91, 0x87, 0x71, 0x09, 0x0d, 0x2b, - 0xc8, 0xe4, 0x84, 0xd6, 0x0f, 0xeb, 0xb3, 0xfd, 0x5c, 0x56, 0xcd, 0x5b, 0x2a, 0x97, 0xe4, 0x09, - 0x1f, 0xdb, 0x1d, 0x9d, 0xd3, 0xf7, 0xa8, 0x94, 0x91, 0x8f, 0x71, 0x29, 0x0d, 0x2b, 0x8c, 0x79, - 0x59, 0x23, 0xf5, 0x7f, 0x81, 0xfd, 0x71, 0xfc, 0x5f, 0x30, 0x70, 0x49, 0x2b, 0xd3, 0x2e, 0xe9, - 0x77, 0x03, 0x5d, 0x1c, 0x5c, 0x30, 0xbc, 0x3a, 0x65, 0x1e, 0x8f, 0xab, 0x8e, 0x69, 0x9f, 0x14, - 0x9e, 0x0e, 0xf1, 0xbb, 0xd9, 0x14, 0xab, 0xf8, 0xce, 0xe4, 0x14, 0x9d, 0x74, 0x6b, 0xcd, 0x97, - 0xc6, 0xab, 0xfa, 0xd5, 0xb1, 0x52, 0xf6, 0x57, 0xfd, 0x47, 0x63, 0x57, 0xca, 0x30, 0xba, 0xef, - 0x38, 0x7b, 0x7b, 0x7b, 0x83, 0x42, 0x47, 0xba, 0x72, 0xd7, 0xf1, 0x7c, 0xde, 0x6d, 0xad, 0x86, - 0x3e, 0x91, 0x6d, 0x2e, 0x82, 0x7b, 0xd3, 0xe0, 0x7d, 0xae, 0x53, 0x40, 0x6d, 0x01, 0xa4, 0xd5, - 0x78, 0x69, 0xa0, 0xb2, 0xc7, 0x83, 0x91, 0x8d, 0x69, 0x2c, 0x64, 0x45, 0x63, 0x33, 0xbe, 0xbe, - 0x4d, 0xe3, 0xab, 0x07, 0x29, 0xb4, 0xc3, 0x7d, 0xc2, 0x3a, 0x36, 0x17, 0x1d, 0xa7, 0x03, 0x4c, - 0x5d, 0xae, 0xd3, 0x67, 0x3c, 0xfe, 0x9f, 0xb8, 0xde, 0xff, 0xfa, 0x23, 0x67, 0x6e, 0x24, 0x01, - 0x1e, 0xc6, 0x45, 0x6a, 0xf5, 0x8b, 0x19, 0x9f, 0xd6, 0x5e, 0x69, 0xe7, 0xb6, 0x72, 0x6e, 0xf7, - 0x9d, 0xdb, 0x4f, 0x6b, 0x3b, 0x73, 0x8a, 0xa4, 0xf6, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3c, - 0x8b, 0xf0, 0x28, 0x86, 0x0b, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// GroupServiceClient is the client API for GroupService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type GroupServiceClient interface { - // Lists the existing groups. - ListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error) - // Gets a single group. - GetGroup(ctx context.Context, in *GetGroupRequest, opts ...grpc.CallOption) (*Group, error) - // Creates a new group. - CreateGroup(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*Group, error) - // Updates an existing group. - // You can change any group attributes except `name`. - UpdateGroup(ctx context.Context, in *UpdateGroupRequest, opts ...grpc.CallOption) (*Group, error) - // Deletes an existing group. - DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*empty.Empty, error) - // Lists the monitored resources that are members of a group. - ListGroupMembers(ctx context.Context, in *ListGroupMembersRequest, opts ...grpc.CallOption) (*ListGroupMembersResponse, error) -} - -type groupServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewGroupServiceClient(cc grpc.ClientConnInterface) GroupServiceClient { - return &groupServiceClient{cc} -} - -func (c *groupServiceClient) ListGroups(ctx context.Context, in *ListGroupsRequest, opts ...grpc.CallOption) (*ListGroupsResponse, error) { - out := new(ListGroupsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/ListGroups", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *groupServiceClient) GetGroup(ctx context.Context, in *GetGroupRequest, opts ...grpc.CallOption) (*Group, error) { - out := new(Group) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/GetGroup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *groupServiceClient) CreateGroup(ctx context.Context, in *CreateGroupRequest, opts ...grpc.CallOption) (*Group, error) { - out := new(Group) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/CreateGroup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *groupServiceClient) UpdateGroup(ctx context.Context, in *UpdateGroupRequest, opts ...grpc.CallOption) (*Group, error) { - out := new(Group) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/UpdateGroup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *groupServiceClient) DeleteGroup(ctx context.Context, in *DeleteGroupRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/DeleteGroup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *groupServiceClient) ListGroupMembers(ctx context.Context, in *ListGroupMembersRequest, opts ...grpc.CallOption) (*ListGroupMembersResponse, error) { - out := new(ListGroupMembersResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.GroupService/ListGroupMembers", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// GroupServiceServer is the server API for GroupService service. -type GroupServiceServer interface { - // Lists the existing groups. - ListGroups(context.Context, *ListGroupsRequest) (*ListGroupsResponse, error) - // Gets a single group. - GetGroup(context.Context, *GetGroupRequest) (*Group, error) - // Creates a new group. - CreateGroup(context.Context, *CreateGroupRequest) (*Group, error) - // Updates an existing group. - // You can change any group attributes except `name`. - UpdateGroup(context.Context, *UpdateGroupRequest) (*Group, error) - // Deletes an existing group. - DeleteGroup(context.Context, *DeleteGroupRequest) (*empty.Empty, error) - // Lists the monitored resources that are members of a group. - ListGroupMembers(context.Context, *ListGroupMembersRequest) (*ListGroupMembersResponse, error) -} - -// UnimplementedGroupServiceServer can be embedded to have forward compatible implementations. -type UnimplementedGroupServiceServer struct { -} - -func (*UnimplementedGroupServiceServer) ListGroups(ctx context.Context, req *ListGroupsRequest) (*ListGroupsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListGroups not implemented") -} -func (*UnimplementedGroupServiceServer) GetGroup(ctx context.Context, req *GetGroupRequest) (*Group, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetGroup not implemented") -} -func (*UnimplementedGroupServiceServer) CreateGroup(ctx context.Context, req *CreateGroupRequest) (*Group, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateGroup not implemented") -} -func (*UnimplementedGroupServiceServer) UpdateGroup(ctx context.Context, req *UpdateGroupRequest) (*Group, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateGroup not implemented") -} -func (*UnimplementedGroupServiceServer) DeleteGroup(ctx context.Context, req *DeleteGroupRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteGroup not implemented") -} -func (*UnimplementedGroupServiceServer) ListGroupMembers(ctx context.Context, req *ListGroupMembersRequest) (*ListGroupMembersResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListGroupMembers not implemented") -} - -func RegisterGroupServiceServer(s *grpc.Server, srv GroupServiceServer) { - s.RegisterService(&_GroupService_serviceDesc, srv) -} - -func _GroupService_ListGroups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListGroupsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).ListGroups(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/ListGroups", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).ListGroups(ctx, req.(*ListGroupsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _GroupService_GetGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetGroupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).GetGroup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/GetGroup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).GetGroup(ctx, req.(*GetGroupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _GroupService_CreateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateGroupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).CreateGroup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/CreateGroup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).CreateGroup(ctx, req.(*CreateGroupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _GroupService_UpdateGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateGroupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).UpdateGroup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/UpdateGroup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).UpdateGroup(ctx, req.(*UpdateGroupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _GroupService_DeleteGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteGroupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).DeleteGroup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/DeleteGroup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).DeleteGroup(ctx, req.(*DeleteGroupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _GroupService_ListGroupMembers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListGroupMembersRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GroupServiceServer).ListGroupMembers(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.GroupService/ListGroupMembers", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GroupServiceServer).ListGroupMembers(ctx, req.(*ListGroupMembersRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _GroupService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.GroupService", - HandlerType: (*GroupServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListGroups", - Handler: _GroupService_ListGroups_Handler, - }, - { - MethodName: "GetGroup", - Handler: _GroupService_GetGroup_Handler, - }, - { - MethodName: "CreateGroup", - Handler: _GroupService_CreateGroup_Handler, - }, - { - MethodName: "UpdateGroup", - Handler: _GroupService_UpdateGroup_Handler, - }, - { - MethodName: "DeleteGroup", - Handler: _GroupService_DeleteGroup_Handler, - }, - { - MethodName: "ListGroupMembers", - Handler: _GroupService_ListGroupMembers_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/group_service.proto", -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/metric.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/metric.pb.go deleted file mode 100644 index be83f6d02..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/metric.pb.go +++ /dev/null @@ -1,236 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/metric.proto - -package monitoring - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - _ "google.golang.org/genproto/googleapis/api/distribution" - _ "google.golang.org/genproto/googleapis/api/label" - metric "google.golang.org/genproto/googleapis/api/metric" - monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// A single data point in a time series. -type Point struct { - // The time interval to which the data point applies. For `GAUGE` metrics, - // the start time is optional, but if it is supplied, it must equal the - // end time. For `DELTA` metrics, the start - // and end time should specify a non-zero interval, with subsequent points - // specifying contiguous and non-overlapping intervals. For `CUMULATIVE` - // metrics, the start and end time should specify a non-zero interval, with - // subsequent points specifying the same start time and increasing end times, - // until an event resets the cumulative value to zero and sets a new start - // time for the following points. - Interval *TimeInterval `protobuf:"bytes,1,opt,name=interval,proto3" json:"interval,omitempty"` - // The value of the data point. - Value *TypedValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Point) Reset() { *m = Point{} } -func (m *Point) String() string { return proto.CompactTextString(m) } -func (*Point) ProtoMessage() {} -func (*Point) Descriptor() ([]byte, []int) { - return fileDescriptor_c76199a3d2c4c21e, []int{0} -} - -func (m *Point) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Point.Unmarshal(m, b) -} -func (m *Point) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Point.Marshal(b, m, deterministic) -} -func (m *Point) XXX_Merge(src proto.Message) { - xxx_messageInfo_Point.Merge(m, src) -} -func (m *Point) XXX_Size() int { - return xxx_messageInfo_Point.Size(m) -} -func (m *Point) XXX_DiscardUnknown() { - xxx_messageInfo_Point.DiscardUnknown(m) -} - -var xxx_messageInfo_Point proto.InternalMessageInfo - -func (m *Point) GetInterval() *TimeInterval { - if m != nil { - return m.Interval - } - return nil -} - -func (m *Point) GetValue() *TypedValue { - if m != nil { - return m.Value - } - return nil -} - -// A collection of data points that describes the time-varying values -// of a metric. A time series is identified by a combination of a -// fully-specified monitored resource and a fully-specified metric. -// This type is used for both listing and creating time series. -type TimeSeries struct { - // The associated metric. A fully-specified metric used to identify the time - // series. - Metric *metric.Metric `protobuf:"bytes,1,opt,name=metric,proto3" json:"metric,omitempty"` - // The associated monitored resource. Custom metrics can use only certain - // monitored resource types in their time series data. - Resource *monitoredres.MonitoredResource `protobuf:"bytes,2,opt,name=resource,proto3" json:"resource,omitempty"` - // Output only. The associated monitored resource metadata. When reading a - // a timeseries, this field will include metadata labels that are explicitly - // named in the reduction. When creating a timeseries, this field is ignored. - Metadata *monitoredres.MonitoredResourceMetadata `protobuf:"bytes,7,opt,name=metadata,proto3" json:"metadata,omitempty"` - // The metric kind of the time series. When listing time series, this metric - // kind might be different from the metric kind of the associated metric if - // this time series is an alignment or reduction of other time series. - // - // When creating a time series, this field is optional. If present, it must be - // the same as the metric kind of the associated metric. If the associated - // metric's descriptor must be auto-created, then this field specifies the - // metric kind of the new descriptor and must be either `GAUGE` (the default) - // or `CUMULATIVE`. - MetricKind metric.MetricDescriptor_MetricKind `protobuf:"varint,3,opt,name=metric_kind,json=metricKind,proto3,enum=google.api.MetricDescriptor_MetricKind" json:"metric_kind,omitempty"` - // The value type of the time series. When listing time series, this value - // type might be different from the value type of the associated metric if - // this time series is an alignment or reduction of other time series. - // - // When creating a time series, this field is optional. If present, it must be - // the same as the type of the data in the `points` field. - ValueType metric.MetricDescriptor_ValueType `protobuf:"varint,4,opt,name=value_type,json=valueType,proto3,enum=google.api.MetricDescriptor_ValueType" json:"value_type,omitempty"` - // The data points of this time series. When listing time series, points are - // returned in reverse time order. - // - // When creating a time series, this field must contain exactly one point and - // the point's type must be the same as the value type of the associated - // metric. If the associated metric's descriptor must be auto-created, then - // the value type of the descriptor is determined by the point's type, which - // must be `BOOL`, `INT64`, `DOUBLE`, or `DISTRIBUTION`. - Points []*Point `protobuf:"bytes,5,rep,name=points,proto3" json:"points,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TimeSeries) Reset() { *m = TimeSeries{} } -func (m *TimeSeries) String() string { return proto.CompactTextString(m) } -func (*TimeSeries) ProtoMessage() {} -func (*TimeSeries) Descriptor() ([]byte, []int) { - return fileDescriptor_c76199a3d2c4c21e, []int{1} -} - -func (m *TimeSeries) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_TimeSeries.Unmarshal(m, b) -} -func (m *TimeSeries) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_TimeSeries.Marshal(b, m, deterministic) -} -func (m *TimeSeries) XXX_Merge(src proto.Message) { - xxx_messageInfo_TimeSeries.Merge(m, src) -} -func (m *TimeSeries) XXX_Size() int { - return xxx_messageInfo_TimeSeries.Size(m) -} -func (m *TimeSeries) XXX_DiscardUnknown() { - xxx_messageInfo_TimeSeries.DiscardUnknown(m) -} - -var xxx_messageInfo_TimeSeries proto.InternalMessageInfo - -func (m *TimeSeries) GetMetric() *metric.Metric { - if m != nil { - return m.Metric - } - return nil -} - -func (m *TimeSeries) GetResource() *monitoredres.MonitoredResource { - if m != nil { - return m.Resource - } - return nil -} - -func (m *TimeSeries) GetMetadata() *monitoredres.MonitoredResourceMetadata { - if m != nil { - return m.Metadata - } - return nil -} - -func (m *TimeSeries) GetMetricKind() metric.MetricDescriptor_MetricKind { - if m != nil { - return m.MetricKind - } - return metric.MetricDescriptor_METRIC_KIND_UNSPECIFIED -} - -func (m *TimeSeries) GetValueType() metric.MetricDescriptor_ValueType { - if m != nil { - return m.ValueType - } - return metric.MetricDescriptor_VALUE_TYPE_UNSPECIFIED -} - -func (m *TimeSeries) GetPoints() []*Point { - if m != nil { - return m.Points - } - return nil -} - -func init() { - proto.RegisterType((*Point)(nil), "google.monitoring.v3.Point") - proto.RegisterType((*TimeSeries)(nil), "google.monitoring.v3.TimeSeries") -} - -func init() { proto.RegisterFile("google/monitoring/v3/metric.proto", fileDescriptor_c76199a3d2c4c21e) } - -var fileDescriptor_c76199a3d2c4c21e = []byte{ - // 441 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x92, 0xdf, 0x8a, 0xd3, 0x40, - 0x14, 0xc6, 0x49, 0xd7, 0xd6, 0x3a, 0x05, 0x2f, 0x06, 0xd1, 0x50, 0x59, 0xa8, 0x15, 0xb5, 0x78, - 0x91, 0x40, 0x03, 0x82, 0x08, 0x0b, 0xae, 0x8a, 0x8a, 0x2c, 0x94, 0x51, 0x7a, 0x21, 0x85, 0x32, - 0x4d, 0x0e, 0xe1, 0x60, 0xe6, 0x0f, 0x93, 0x69, 0x60, 0xaf, 0x7c, 0x18, 0xef, 0x7c, 0x14, 0x9f, - 0xc9, 0x0b, 0xc9, 0xcc, 0xa4, 0xed, 0x62, 0xb7, 0x77, 0xc9, 0x7c, 0xbf, 0xef, 0x7c, 0x67, 0xce, - 0x1c, 0xf2, 0xa4, 0x54, 0xaa, 0xac, 0x20, 0x15, 0x4a, 0xa2, 0x55, 0x06, 0x65, 0x99, 0x36, 0x59, - 0x2a, 0xc0, 0x1a, 0xcc, 0x13, 0x6d, 0x94, 0x55, 0xf4, 0x81, 0x47, 0x92, 0x3d, 0x92, 0x34, 0xd9, - 0xf8, 0x3c, 0x18, 0xb9, 0xc6, 0xb4, 0xc0, 0xda, 0x1a, 0xdc, 0x6c, 0x2d, 0x2a, 0xe9, 0x4d, 0xe3, - 0x87, 0x07, 0x72, 0xc5, 0x37, 0x50, 0x85, 0xf3, 0x47, 0x07, 0xe7, 0x87, 0x29, 0xe3, 0xa7, 0x87, - 0x82, 0x4f, 0x82, 0x62, 0x6d, 0xa0, 0x56, 0x5b, 0x93, 0x43, 0x80, 0x8e, 0x77, 0x9b, 0x2b, 0x21, - 0xba, 0xe0, 0xe9, 0x4f, 0xd2, 0x5f, 0x28, 0x94, 0x96, 0x5e, 0x90, 0x21, 0x4a, 0x0b, 0xa6, 0xe1, - 0x55, 0x1c, 0x4d, 0xa2, 0xd9, 0x68, 0x3e, 0x4d, 0x8e, 0xdd, 0x24, 0xf9, 0x86, 0x02, 0x3e, 0x07, - 0x92, 0xed, 0x3c, 0xf4, 0x15, 0xe9, 0x37, 0xbc, 0xda, 0x42, 0xdc, 0x73, 0xe6, 0xc9, 0x2d, 0xe6, - 0x6b, 0x0d, 0xc5, 0xb2, 0xe5, 0x98, 0xc7, 0xa7, 0x7f, 0x7b, 0x84, 0xb4, 0x25, 0xbf, 0x82, 0x41, - 0xa8, 0xe9, 0x4b, 0x32, 0xf0, 0xf7, 0x0c, 0x4d, 0xd0, 0xae, 0x0e, 0xd7, 0x98, 0x5c, 0x39, 0x85, - 0x05, 0x82, 0xbe, 0x26, 0xc3, 0xee, 0xc2, 0x21, 0xf5, 0xfc, 0x06, 0xdd, 0x8d, 0x85, 0x05, 0x88, - 0xed, 0x70, 0xfa, 0x96, 0x0c, 0x05, 0x58, 0x5e, 0x70, 0xcb, 0xe3, 0xbb, 0xce, 0xfa, 0xec, 0xa4, - 0xf5, 0x2a, 0xc0, 0x6c, 0x67, 0xa3, 0x9f, 0xc8, 0xc8, 0xf7, 0xb1, 0xfe, 0x81, 0xb2, 0x88, 0xcf, - 0x26, 0xd1, 0xec, 0xfe, 0xfc, 0xc5, 0xff, 0xed, 0xbe, 0x87, 0x3a, 0x37, 0xa8, 0xad, 0x32, 0xe1, - 0xe0, 0x0b, 0xca, 0x82, 0x11, 0xb1, 0xfb, 0xa6, 0x1f, 0x08, 0x71, 0xb3, 0x58, 0xdb, 0x6b, 0x0d, - 0xf1, 0x1d, 0x57, 0xe8, 0xf9, 0xc9, 0x42, 0x6e, 0x82, 0xed, 0x2c, 0xd9, 0xbd, 0xa6, 0xfb, 0xa4, - 0x19, 0x19, 0xe8, 0xf6, 0x29, 0xeb, 0xb8, 0x3f, 0x39, 0x9b, 0x8d, 0xe6, 0x8f, 0x8f, 0x3f, 0x81, - 0x7b, 0x6e, 0x16, 0xd0, 0xcb, 0x5f, 0x11, 0x89, 0x73, 0x25, 0x8e, 0xa2, 0x97, 0x23, 0x1f, 0xbc, - 0x68, 0x37, 0x65, 0x11, 0x7d, 0xbf, 0x08, 0x50, 0xa9, 0x2a, 0x2e, 0xcb, 0x44, 0x99, 0x32, 0x2d, - 0x41, 0xba, 0x3d, 0x4a, 0xbd, 0xc4, 0x35, 0xd6, 0x37, 0xb7, 0xed, 0xcd, 0xfe, 0xef, 0x77, 0x6f, - 0xfc, 0xd1, 0x17, 0x78, 0x57, 0xa9, 0x6d, 0xd1, 0x0d, 0xb9, 0xcd, 0x5a, 0x66, 0x7f, 0x3a, 0x71, - 0xe5, 0xc4, 0xd5, 0x5e, 0x5c, 0x2d, 0xb3, 0xcd, 0xc0, 0x85, 0x64, 0xff, 0x02, 0x00, 0x00, 0xff, - 0xff, 0x06, 0x37, 0xbb, 0x92, 0x7f, 0x03, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/metric_service.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/metric_service.pb.go deleted file mode 100644 index 3f972bed6..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/metric_service.pb.go +++ /dev/null @@ -1,1406 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/metric_service.proto - -package monitoring - -import ( - context "context" - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - _ "github.com/golang/protobuf/ptypes/duration" - empty "github.com/golang/protobuf/ptypes/empty" - _ "google.golang.org/genproto/googleapis/api/annotations" - metric "google.golang.org/genproto/googleapis/api/metric" - monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" - status "google.golang.org/genproto/googleapis/rpc/status" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status1 "google.golang.org/grpc/status" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// Controls which fields are returned by `ListTimeSeries`. -type ListTimeSeriesRequest_TimeSeriesView int32 - -const ( - // Returns the identity of the metric(s), the time series, - // and the time series data. - ListTimeSeriesRequest_FULL ListTimeSeriesRequest_TimeSeriesView = 0 - // Returns the identity of the metric and the time series resource, - // but not the time series data. - ListTimeSeriesRequest_HEADERS ListTimeSeriesRequest_TimeSeriesView = 1 -) - -var ListTimeSeriesRequest_TimeSeriesView_name = map[int32]string{ - 0: "FULL", - 1: "HEADERS", -} - -var ListTimeSeriesRequest_TimeSeriesView_value = map[string]int32{ - "FULL": 0, - "HEADERS": 1, -} - -func (x ListTimeSeriesRequest_TimeSeriesView) String() string { - return proto.EnumName(ListTimeSeriesRequest_TimeSeriesView_name, int32(x)) -} - -func (ListTimeSeriesRequest_TimeSeriesView) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{8, 0} -} - -// The `ListMonitoredResourceDescriptors` request. -type ListMonitoredResourceDescriptorsRequest struct { - // Required. The project on which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER] - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - // An optional [filter](https://cloud.google.com/monitoring/api/v3/filters) - // describing the descriptors to be returned. The filter can reference the - // descriptor's type and labels. For example, the following filter returns - // only Google Compute Engine descriptors that have an `id` label: - // - // resource.type = starts_with("gce_") AND resource.label:id - Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` - // A positive number that is the maximum number of results to return. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If this field is not empty then it must contain the `nextPageToken` value - // returned by a previous call to this method. Using this field causes the - // method to return additional results from the previous method call. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListMonitoredResourceDescriptorsRequest) Reset() { - *m = ListMonitoredResourceDescriptorsRequest{} -} -func (m *ListMonitoredResourceDescriptorsRequest) String() string { return proto.CompactTextString(m) } -func (*ListMonitoredResourceDescriptorsRequest) ProtoMessage() {} -func (*ListMonitoredResourceDescriptorsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{0} -} - -func (m *ListMonitoredResourceDescriptorsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListMonitoredResourceDescriptorsRequest.Unmarshal(m, b) -} -func (m *ListMonitoredResourceDescriptorsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListMonitoredResourceDescriptorsRequest.Marshal(b, m, deterministic) -} -func (m *ListMonitoredResourceDescriptorsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListMonitoredResourceDescriptorsRequest.Merge(m, src) -} -func (m *ListMonitoredResourceDescriptorsRequest) XXX_Size() int { - return xxx_messageInfo_ListMonitoredResourceDescriptorsRequest.Size(m) -} -func (m *ListMonitoredResourceDescriptorsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListMonitoredResourceDescriptorsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListMonitoredResourceDescriptorsRequest proto.InternalMessageInfo - -func (m *ListMonitoredResourceDescriptorsRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ListMonitoredResourceDescriptorsRequest) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *ListMonitoredResourceDescriptorsRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListMonitoredResourceDescriptorsRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -// The `ListMonitoredResourceDescriptors` response. -type ListMonitoredResourceDescriptorsResponse struct { - // The monitored resource descriptors that are available to this project - // and that match `filter`, if present. - ResourceDescriptors []*monitoredres.MonitoredResourceDescriptor `protobuf:"bytes,1,rep,name=resource_descriptors,json=resourceDescriptors,proto3" json:"resource_descriptors,omitempty"` - // If there are more results than have been returned, then this field is set - // to a non-empty value. To see the additional results, - // use that value as `page_token` in the next call to this method. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListMonitoredResourceDescriptorsResponse) Reset() { - *m = ListMonitoredResourceDescriptorsResponse{} -} -func (m *ListMonitoredResourceDescriptorsResponse) String() string { return proto.CompactTextString(m) } -func (*ListMonitoredResourceDescriptorsResponse) ProtoMessage() {} -func (*ListMonitoredResourceDescriptorsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{1} -} - -func (m *ListMonitoredResourceDescriptorsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListMonitoredResourceDescriptorsResponse.Unmarshal(m, b) -} -func (m *ListMonitoredResourceDescriptorsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListMonitoredResourceDescriptorsResponse.Marshal(b, m, deterministic) -} -func (m *ListMonitoredResourceDescriptorsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListMonitoredResourceDescriptorsResponse.Merge(m, src) -} -func (m *ListMonitoredResourceDescriptorsResponse) XXX_Size() int { - return xxx_messageInfo_ListMonitoredResourceDescriptorsResponse.Size(m) -} -func (m *ListMonitoredResourceDescriptorsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListMonitoredResourceDescriptorsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListMonitoredResourceDescriptorsResponse proto.InternalMessageInfo - -func (m *ListMonitoredResourceDescriptorsResponse) GetResourceDescriptors() []*monitoredres.MonitoredResourceDescriptor { - if m != nil { - return m.ResourceDescriptors - } - return nil -} - -func (m *ListMonitoredResourceDescriptorsResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -// The `GetMonitoredResourceDescriptor` request. -type GetMonitoredResourceDescriptorRequest struct { - // Required. The monitored resource descriptor to get. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/monitoredResourceDescriptors/[RESOURCE_TYPE] - // - // The `[RESOURCE_TYPE]` is a predefined type, such as - // `cloudsql_database`. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetMonitoredResourceDescriptorRequest) Reset() { *m = GetMonitoredResourceDescriptorRequest{} } -func (m *GetMonitoredResourceDescriptorRequest) String() string { return proto.CompactTextString(m) } -func (*GetMonitoredResourceDescriptorRequest) ProtoMessage() {} -func (*GetMonitoredResourceDescriptorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{2} -} - -func (m *GetMonitoredResourceDescriptorRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetMonitoredResourceDescriptorRequest.Unmarshal(m, b) -} -func (m *GetMonitoredResourceDescriptorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetMonitoredResourceDescriptorRequest.Marshal(b, m, deterministic) -} -func (m *GetMonitoredResourceDescriptorRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetMonitoredResourceDescriptorRequest.Merge(m, src) -} -func (m *GetMonitoredResourceDescriptorRequest) XXX_Size() int { - return xxx_messageInfo_GetMonitoredResourceDescriptorRequest.Size(m) -} -func (m *GetMonitoredResourceDescriptorRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetMonitoredResourceDescriptorRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetMonitoredResourceDescriptorRequest proto.InternalMessageInfo - -func (m *GetMonitoredResourceDescriptorRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The `ListMetricDescriptors` request. -type ListMetricDescriptorsRequest struct { - // Required. The project on which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER] - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - // If this field is empty, all custom and - // system-defined metric descriptors are returned. - // Otherwise, the [filter](https://cloud.google.com/monitoring/api/v3/filters) - // specifies which metric descriptors are to be - // returned. For example, the following filter matches all - // [custom metrics](https://cloud.google.com/monitoring/custom-metrics): - // - // metric.type = starts_with("custom.googleapis.com/") - Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` - // A positive number that is the maximum number of results to return. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If this field is not empty then it must contain the `nextPageToken` value - // returned by a previous call to this method. Using this field causes the - // method to return additional results from the previous method call. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListMetricDescriptorsRequest) Reset() { *m = ListMetricDescriptorsRequest{} } -func (m *ListMetricDescriptorsRequest) String() string { return proto.CompactTextString(m) } -func (*ListMetricDescriptorsRequest) ProtoMessage() {} -func (*ListMetricDescriptorsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{3} -} - -func (m *ListMetricDescriptorsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListMetricDescriptorsRequest.Unmarshal(m, b) -} -func (m *ListMetricDescriptorsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListMetricDescriptorsRequest.Marshal(b, m, deterministic) -} -func (m *ListMetricDescriptorsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListMetricDescriptorsRequest.Merge(m, src) -} -func (m *ListMetricDescriptorsRequest) XXX_Size() int { - return xxx_messageInfo_ListMetricDescriptorsRequest.Size(m) -} -func (m *ListMetricDescriptorsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListMetricDescriptorsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListMetricDescriptorsRequest proto.InternalMessageInfo - -func (m *ListMetricDescriptorsRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ListMetricDescriptorsRequest) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *ListMetricDescriptorsRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListMetricDescriptorsRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -// The `ListMetricDescriptors` response. -type ListMetricDescriptorsResponse struct { - // The metric descriptors that are available to the project - // and that match the value of `filter`, if present. - MetricDescriptors []*metric.MetricDescriptor `protobuf:"bytes,1,rep,name=metric_descriptors,json=metricDescriptors,proto3" json:"metric_descriptors,omitempty"` - // If there are more results than have been returned, then this field is set - // to a non-empty value. To see the additional results, - // use that value as `page_token` in the next call to this method. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListMetricDescriptorsResponse) Reset() { *m = ListMetricDescriptorsResponse{} } -func (m *ListMetricDescriptorsResponse) String() string { return proto.CompactTextString(m) } -func (*ListMetricDescriptorsResponse) ProtoMessage() {} -func (*ListMetricDescriptorsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{4} -} - -func (m *ListMetricDescriptorsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListMetricDescriptorsResponse.Unmarshal(m, b) -} -func (m *ListMetricDescriptorsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListMetricDescriptorsResponse.Marshal(b, m, deterministic) -} -func (m *ListMetricDescriptorsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListMetricDescriptorsResponse.Merge(m, src) -} -func (m *ListMetricDescriptorsResponse) XXX_Size() int { - return xxx_messageInfo_ListMetricDescriptorsResponse.Size(m) -} -func (m *ListMetricDescriptorsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListMetricDescriptorsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListMetricDescriptorsResponse proto.InternalMessageInfo - -func (m *ListMetricDescriptorsResponse) GetMetricDescriptors() []*metric.MetricDescriptor { - if m != nil { - return m.MetricDescriptors - } - return nil -} - -func (m *ListMetricDescriptorsResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -// The `GetMetricDescriptor` request. -type GetMetricDescriptorRequest struct { - // Required. The metric descriptor on which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/metricDescriptors/[METRIC_ID] - // - // An example value of `[METRIC_ID]` is - // `"compute.googleapis.com/instance/disk/read_bytes_count"`. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetMetricDescriptorRequest) Reset() { *m = GetMetricDescriptorRequest{} } -func (m *GetMetricDescriptorRequest) String() string { return proto.CompactTextString(m) } -func (*GetMetricDescriptorRequest) ProtoMessage() {} -func (*GetMetricDescriptorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{5} -} - -func (m *GetMetricDescriptorRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetMetricDescriptorRequest.Unmarshal(m, b) -} -func (m *GetMetricDescriptorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetMetricDescriptorRequest.Marshal(b, m, deterministic) -} -func (m *GetMetricDescriptorRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetMetricDescriptorRequest.Merge(m, src) -} -func (m *GetMetricDescriptorRequest) XXX_Size() int { - return xxx_messageInfo_GetMetricDescriptorRequest.Size(m) -} -func (m *GetMetricDescriptorRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetMetricDescriptorRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetMetricDescriptorRequest proto.InternalMessageInfo - -func (m *GetMetricDescriptorRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The `CreateMetricDescriptor` request. -type CreateMetricDescriptorRequest struct { - // Required. The project on which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER] - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - // Required. The new [custom metric](https://cloud.google.com/monitoring/custom-metrics) - // descriptor. - MetricDescriptor *metric.MetricDescriptor `protobuf:"bytes,2,opt,name=metric_descriptor,json=metricDescriptor,proto3" json:"metric_descriptor,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateMetricDescriptorRequest) Reset() { *m = CreateMetricDescriptorRequest{} } -func (m *CreateMetricDescriptorRequest) String() string { return proto.CompactTextString(m) } -func (*CreateMetricDescriptorRequest) ProtoMessage() {} -func (*CreateMetricDescriptorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{6} -} - -func (m *CreateMetricDescriptorRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateMetricDescriptorRequest.Unmarshal(m, b) -} -func (m *CreateMetricDescriptorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateMetricDescriptorRequest.Marshal(b, m, deterministic) -} -func (m *CreateMetricDescriptorRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateMetricDescriptorRequest.Merge(m, src) -} -func (m *CreateMetricDescriptorRequest) XXX_Size() int { - return xxx_messageInfo_CreateMetricDescriptorRequest.Size(m) -} -func (m *CreateMetricDescriptorRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateMetricDescriptorRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateMetricDescriptorRequest proto.InternalMessageInfo - -func (m *CreateMetricDescriptorRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *CreateMetricDescriptorRequest) GetMetricDescriptor() *metric.MetricDescriptor { - if m != nil { - return m.MetricDescriptor - } - return nil -} - -// The `DeleteMetricDescriptor` request. -type DeleteMetricDescriptorRequest struct { - // Required. The metric descriptor on which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/metricDescriptors/[METRIC_ID] - // - // An example of `[METRIC_ID]` is: - // `"custom.googleapis.com/my_test_metric"`. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteMetricDescriptorRequest) Reset() { *m = DeleteMetricDescriptorRequest{} } -func (m *DeleteMetricDescriptorRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteMetricDescriptorRequest) ProtoMessage() {} -func (*DeleteMetricDescriptorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{7} -} - -func (m *DeleteMetricDescriptorRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteMetricDescriptorRequest.Unmarshal(m, b) -} -func (m *DeleteMetricDescriptorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteMetricDescriptorRequest.Marshal(b, m, deterministic) -} -func (m *DeleteMetricDescriptorRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteMetricDescriptorRequest.Merge(m, src) -} -func (m *DeleteMetricDescriptorRequest) XXX_Size() int { - return xxx_messageInfo_DeleteMetricDescriptorRequest.Size(m) -} -func (m *DeleteMetricDescriptorRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteMetricDescriptorRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteMetricDescriptorRequest proto.InternalMessageInfo - -func (m *DeleteMetricDescriptorRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The `ListTimeSeries` request. -type ListTimeSeriesRequest struct { - // Required. The project on which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER] - Name string `protobuf:"bytes,10,opt,name=name,proto3" json:"name,omitempty"` - // Required. A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) - // that specifies which time series should be returned. The filter must - // specify a single metric type, and can additionally specify metric labels - // and other information. For example: - // - // metric.type = "compute.googleapis.com/instance/cpu/usage_time" AND - // metric.labels.instance_name = "my-instance-name" - Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` - // Required. The time interval for which results should be returned. Only time series - // that contain data points in the specified interval are included - // in the response. - Interval *TimeInterval `protobuf:"bytes,4,opt,name=interval,proto3" json:"interval,omitempty"` - // Specifies the alignment of data points in individual time series as - // well as how to combine the retrieved time series across specified labels. - // - // By default (if no `aggregation` is explicitly specified), the raw time - // series data is returned. - Aggregation *Aggregation `protobuf:"bytes,5,opt,name=aggregation,proto3" json:"aggregation,omitempty"` - // Unsupported: must be left blank. The points in each time series are - // currently returned in reverse time order (most recent to oldest). - OrderBy string `protobuf:"bytes,6,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` - // Required. Specifies which information is returned about the time series. - View ListTimeSeriesRequest_TimeSeriesView `protobuf:"varint,7,opt,name=view,proto3,enum=google.monitoring.v3.ListTimeSeriesRequest_TimeSeriesView" json:"view,omitempty"` - // A positive number that is the maximum number of results to return. If - // `page_size` is empty or more than 100,000 results, the effective - // `page_size` is 100,000 results. If `view` is set to `FULL`, this is the - // maximum number of `Points` returned. If `view` is set to `HEADERS`, this is - // the maximum number of `TimeSeries` returned. - PageSize int32 `protobuf:"varint,8,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If this field is not empty then it must contain the `nextPageToken` value - // returned by a previous call to this method. Using this field causes the - // method to return additional results from the previous method call. - PageToken string `protobuf:"bytes,9,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListTimeSeriesRequest) Reset() { *m = ListTimeSeriesRequest{} } -func (m *ListTimeSeriesRequest) String() string { return proto.CompactTextString(m) } -func (*ListTimeSeriesRequest) ProtoMessage() {} -func (*ListTimeSeriesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{8} -} - -func (m *ListTimeSeriesRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListTimeSeriesRequest.Unmarshal(m, b) -} -func (m *ListTimeSeriesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListTimeSeriesRequest.Marshal(b, m, deterministic) -} -func (m *ListTimeSeriesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListTimeSeriesRequest.Merge(m, src) -} -func (m *ListTimeSeriesRequest) XXX_Size() int { - return xxx_messageInfo_ListTimeSeriesRequest.Size(m) -} -func (m *ListTimeSeriesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListTimeSeriesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListTimeSeriesRequest proto.InternalMessageInfo - -func (m *ListTimeSeriesRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ListTimeSeriesRequest) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *ListTimeSeriesRequest) GetInterval() *TimeInterval { - if m != nil { - return m.Interval - } - return nil -} - -func (m *ListTimeSeriesRequest) GetAggregation() *Aggregation { - if m != nil { - return m.Aggregation - } - return nil -} - -func (m *ListTimeSeriesRequest) GetOrderBy() string { - if m != nil { - return m.OrderBy - } - return "" -} - -func (m *ListTimeSeriesRequest) GetView() ListTimeSeriesRequest_TimeSeriesView { - if m != nil { - return m.View - } - return ListTimeSeriesRequest_FULL -} - -func (m *ListTimeSeriesRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListTimeSeriesRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -// The `ListTimeSeries` response. -type ListTimeSeriesResponse struct { - // One or more time series that match the filter included in the request. - TimeSeries []*TimeSeries `protobuf:"bytes,1,rep,name=time_series,json=timeSeries,proto3" json:"time_series,omitempty"` - // If there are more results than have been returned, then this field is set - // to a non-empty value. To see the additional results, - // use that value as `page_token` in the next call to this method. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - // Query execution errors that may have caused the time series data returned - // to be incomplete. - ExecutionErrors []*status.Status `protobuf:"bytes,3,rep,name=execution_errors,json=executionErrors,proto3" json:"execution_errors,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListTimeSeriesResponse) Reset() { *m = ListTimeSeriesResponse{} } -func (m *ListTimeSeriesResponse) String() string { return proto.CompactTextString(m) } -func (*ListTimeSeriesResponse) ProtoMessage() {} -func (*ListTimeSeriesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{9} -} - -func (m *ListTimeSeriesResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListTimeSeriesResponse.Unmarshal(m, b) -} -func (m *ListTimeSeriesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListTimeSeriesResponse.Marshal(b, m, deterministic) -} -func (m *ListTimeSeriesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListTimeSeriesResponse.Merge(m, src) -} -func (m *ListTimeSeriesResponse) XXX_Size() int { - return xxx_messageInfo_ListTimeSeriesResponse.Size(m) -} -func (m *ListTimeSeriesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListTimeSeriesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListTimeSeriesResponse proto.InternalMessageInfo - -func (m *ListTimeSeriesResponse) GetTimeSeries() []*TimeSeries { - if m != nil { - return m.TimeSeries - } - return nil -} - -func (m *ListTimeSeriesResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -func (m *ListTimeSeriesResponse) GetExecutionErrors() []*status.Status { - if m != nil { - return m.ExecutionErrors - } - return nil -} - -// The `CreateTimeSeries` request. -type CreateTimeSeriesRequest struct { - // Required. The project on which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER] - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - // Required. The new data to be added to a list of time series. - // Adds at most one data point to each of several time series. The new data - // point must be more recent than any other point in its time series. Each - // `TimeSeries` value must fully specify a unique time series by supplying - // all label values for the metric and the monitored resource. - // - // The maximum number of `TimeSeries` objects per `Create` request is 200. - TimeSeries []*TimeSeries `protobuf:"bytes,2,rep,name=time_series,json=timeSeries,proto3" json:"time_series,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateTimeSeriesRequest) Reset() { *m = CreateTimeSeriesRequest{} } -func (m *CreateTimeSeriesRequest) String() string { return proto.CompactTextString(m) } -func (*CreateTimeSeriesRequest) ProtoMessage() {} -func (*CreateTimeSeriesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{10} -} - -func (m *CreateTimeSeriesRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateTimeSeriesRequest.Unmarshal(m, b) -} -func (m *CreateTimeSeriesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateTimeSeriesRequest.Marshal(b, m, deterministic) -} -func (m *CreateTimeSeriesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateTimeSeriesRequest.Merge(m, src) -} -func (m *CreateTimeSeriesRequest) XXX_Size() int { - return xxx_messageInfo_CreateTimeSeriesRequest.Size(m) -} -func (m *CreateTimeSeriesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateTimeSeriesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateTimeSeriesRequest proto.InternalMessageInfo - -func (m *CreateTimeSeriesRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *CreateTimeSeriesRequest) GetTimeSeries() []*TimeSeries { - if m != nil { - return m.TimeSeries - } - return nil -} - -// DEPRECATED. Used to hold per-time-series error status. -type CreateTimeSeriesError struct { - // DEPRECATED. Time series ID that resulted in the `status` error. - TimeSeries *TimeSeries `protobuf:"bytes,1,opt,name=time_series,json=timeSeries,proto3" json:"time_series,omitempty"` // Deprecated: Do not use. - // DEPRECATED. The status of the requested write operation for `time_series`. - Status *status.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // Deprecated: Do not use. - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateTimeSeriesError) Reset() { *m = CreateTimeSeriesError{} } -func (m *CreateTimeSeriesError) String() string { return proto.CompactTextString(m) } -func (*CreateTimeSeriesError) ProtoMessage() {} -func (*CreateTimeSeriesError) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{11} -} - -func (m *CreateTimeSeriesError) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateTimeSeriesError.Unmarshal(m, b) -} -func (m *CreateTimeSeriesError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateTimeSeriesError.Marshal(b, m, deterministic) -} -func (m *CreateTimeSeriesError) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateTimeSeriesError.Merge(m, src) -} -func (m *CreateTimeSeriesError) XXX_Size() int { - return xxx_messageInfo_CreateTimeSeriesError.Size(m) -} -func (m *CreateTimeSeriesError) XXX_DiscardUnknown() { - xxx_messageInfo_CreateTimeSeriesError.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateTimeSeriesError proto.InternalMessageInfo - -// Deprecated: Do not use. -func (m *CreateTimeSeriesError) GetTimeSeries() *TimeSeries { - if m != nil { - return m.TimeSeries - } - return nil -} - -// Deprecated: Do not use. -func (m *CreateTimeSeriesError) GetStatus() *status.Status { - if m != nil { - return m.Status - } - return nil -} - -// Summary of the result of a failed request to write data to a time series. -type CreateTimeSeriesSummary struct { - // The number of points in the request. - TotalPointCount int32 `protobuf:"varint,1,opt,name=total_point_count,json=totalPointCount,proto3" json:"total_point_count,omitempty"` - // The number of points that were successfully written. - SuccessPointCount int32 `protobuf:"varint,2,opt,name=success_point_count,json=successPointCount,proto3" json:"success_point_count,omitempty"` - // The number of points that failed to be written. Order is not guaranteed. - Errors []*CreateTimeSeriesSummary_Error `protobuf:"bytes,3,rep,name=errors,proto3" json:"errors,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateTimeSeriesSummary) Reset() { *m = CreateTimeSeriesSummary{} } -func (m *CreateTimeSeriesSummary) String() string { return proto.CompactTextString(m) } -func (*CreateTimeSeriesSummary) ProtoMessage() {} -func (*CreateTimeSeriesSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{12} -} - -func (m *CreateTimeSeriesSummary) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateTimeSeriesSummary.Unmarshal(m, b) -} -func (m *CreateTimeSeriesSummary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateTimeSeriesSummary.Marshal(b, m, deterministic) -} -func (m *CreateTimeSeriesSummary) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateTimeSeriesSummary.Merge(m, src) -} -func (m *CreateTimeSeriesSummary) XXX_Size() int { - return xxx_messageInfo_CreateTimeSeriesSummary.Size(m) -} -func (m *CreateTimeSeriesSummary) XXX_DiscardUnknown() { - xxx_messageInfo_CreateTimeSeriesSummary.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateTimeSeriesSummary proto.InternalMessageInfo - -func (m *CreateTimeSeriesSummary) GetTotalPointCount() int32 { - if m != nil { - return m.TotalPointCount - } - return 0 -} - -func (m *CreateTimeSeriesSummary) GetSuccessPointCount() int32 { - if m != nil { - return m.SuccessPointCount - } - return 0 -} - -func (m *CreateTimeSeriesSummary) GetErrors() []*CreateTimeSeriesSummary_Error { - if m != nil { - return m.Errors - } - return nil -} - -// Detailed information about an error category. -type CreateTimeSeriesSummary_Error struct { - // The status of the requested write operation. - Status *status.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` - // The number of points that couldn't be written because of `status`. - PointCount int32 `protobuf:"varint,2,opt,name=point_count,json=pointCount,proto3" json:"point_count,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateTimeSeriesSummary_Error) Reset() { *m = CreateTimeSeriesSummary_Error{} } -func (m *CreateTimeSeriesSummary_Error) String() string { return proto.CompactTextString(m) } -func (*CreateTimeSeriesSummary_Error) ProtoMessage() {} -func (*CreateTimeSeriesSummary_Error) Descriptor() ([]byte, []int) { - return fileDescriptor_7b3d47b45a293957, []int{12, 0} -} - -func (m *CreateTimeSeriesSummary_Error) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateTimeSeriesSummary_Error.Unmarshal(m, b) -} -func (m *CreateTimeSeriesSummary_Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateTimeSeriesSummary_Error.Marshal(b, m, deterministic) -} -func (m *CreateTimeSeriesSummary_Error) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateTimeSeriesSummary_Error.Merge(m, src) -} -func (m *CreateTimeSeriesSummary_Error) XXX_Size() int { - return xxx_messageInfo_CreateTimeSeriesSummary_Error.Size(m) -} -func (m *CreateTimeSeriesSummary_Error) XXX_DiscardUnknown() { - xxx_messageInfo_CreateTimeSeriesSummary_Error.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateTimeSeriesSummary_Error proto.InternalMessageInfo - -func (m *CreateTimeSeriesSummary_Error) GetStatus() *status.Status { - if m != nil { - return m.Status - } - return nil -} - -func (m *CreateTimeSeriesSummary_Error) GetPointCount() int32 { - if m != nil { - return m.PointCount - } - return 0 -} - -func init() { - proto.RegisterEnum("google.monitoring.v3.ListTimeSeriesRequest_TimeSeriesView", ListTimeSeriesRequest_TimeSeriesView_name, ListTimeSeriesRequest_TimeSeriesView_value) - proto.RegisterType((*ListMonitoredResourceDescriptorsRequest)(nil), "google.monitoring.v3.ListMonitoredResourceDescriptorsRequest") - proto.RegisterType((*ListMonitoredResourceDescriptorsResponse)(nil), "google.monitoring.v3.ListMonitoredResourceDescriptorsResponse") - proto.RegisterType((*GetMonitoredResourceDescriptorRequest)(nil), "google.monitoring.v3.GetMonitoredResourceDescriptorRequest") - proto.RegisterType((*ListMetricDescriptorsRequest)(nil), "google.monitoring.v3.ListMetricDescriptorsRequest") - proto.RegisterType((*ListMetricDescriptorsResponse)(nil), "google.monitoring.v3.ListMetricDescriptorsResponse") - proto.RegisterType((*GetMetricDescriptorRequest)(nil), "google.monitoring.v3.GetMetricDescriptorRequest") - proto.RegisterType((*CreateMetricDescriptorRequest)(nil), "google.monitoring.v3.CreateMetricDescriptorRequest") - proto.RegisterType((*DeleteMetricDescriptorRequest)(nil), "google.monitoring.v3.DeleteMetricDescriptorRequest") - proto.RegisterType((*ListTimeSeriesRequest)(nil), "google.monitoring.v3.ListTimeSeriesRequest") - proto.RegisterType((*ListTimeSeriesResponse)(nil), "google.monitoring.v3.ListTimeSeriesResponse") - proto.RegisterType((*CreateTimeSeriesRequest)(nil), "google.monitoring.v3.CreateTimeSeriesRequest") - proto.RegisterType((*CreateTimeSeriesError)(nil), "google.monitoring.v3.CreateTimeSeriesError") - proto.RegisterType((*CreateTimeSeriesSummary)(nil), "google.monitoring.v3.CreateTimeSeriesSummary") - proto.RegisterType((*CreateTimeSeriesSummary_Error)(nil), "google.monitoring.v3.CreateTimeSeriesSummary.Error") -} - -func init() { - proto.RegisterFile("google/monitoring/v3/metric_service.proto", fileDescriptor_7b3d47b45a293957) -} - -var fileDescriptor_7b3d47b45a293957 = []byte{ - // 1483 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0xcf, 0x73, 0xd3, 0xc6, - 0x17, 0xff, 0xae, 0x9d, 0x84, 0xb0, 0x1e, 0x20, 0x59, 0x20, 0x38, 0x86, 0x80, 0xd1, 0x77, 0x68, - 0x82, 0x31, 0x52, 0xc7, 0x2e, 0x65, 0x08, 0x0d, 0x33, 0xca, 0x0f, 0x68, 0x07, 0x68, 0x53, 0x9b, - 0x32, 0x53, 0xca, 0x8c, 0x47, 0x91, 0x37, 0x62, 0x5b, 0x4b, 0xab, 0xae, 0xd6, 0x09, 0x49, 0x86, - 0x4b, 0xff, 0x80, 0x5e, 0xda, 0x43, 0x7b, 0xeb, 0x99, 0x43, 0x67, 0x7a, 0xa2, 0xc3, 0xa1, 0x87, - 0x9e, 0x3a, 0x4c, 0x0f, 0x9d, 0xf6, 0xd4, 0x4c, 0x0f, 0x1c, 0x38, 0x71, 0xea, 0xb9, 0xa7, 0x8e, - 0x56, 0x92, 0x2d, 0xc9, 0xb2, 0x62, 0x27, 0xd3, 0x9b, 0xa5, 0xf7, 0xf6, 0xbd, 0xcf, 0xfb, 0xbc, - 0x7d, 0xbb, 0x1f, 0x0b, 0x5e, 0x34, 0x28, 0x35, 0x5a, 0x58, 0x31, 0xa9, 0x45, 0x38, 0x65, 0xc4, - 0x32, 0x94, 0x8d, 0xaa, 0x62, 0x62, 0xce, 0x88, 0xde, 0x70, 0x30, 0xdb, 0x20, 0x3a, 0x96, 0x6d, - 0x46, 0x39, 0x45, 0x27, 0x3c, 0x57, 0xb9, 0xeb, 0x2a, 0x6f, 0x54, 0x0b, 0x67, 0xfc, 0x00, 0x9a, - 0x4d, 0x14, 0xcd, 0xb2, 0x28, 0xd7, 0x38, 0xa1, 0x96, 0xe3, 0xad, 0x29, 0x9c, 0x0a, 0x59, 0xf5, - 0x16, 0xc1, 0x16, 0xf7, 0x0d, 0xe7, 0x42, 0x86, 0x75, 0x82, 0x5b, 0xcd, 0xc6, 0x1a, 0x7e, 0xa4, - 0x6d, 0x10, 0xca, 0x12, 0x56, 0x7a, 0x70, 0x7c, 0xc3, 0xff, 0xc3, 0x06, 0x0f, 0x0a, 0x6e, 0x36, - 0x18, 0x76, 0x68, 0x9b, 0x05, 0x58, 0x0b, 0xd3, 0x21, 0xa7, 0x98, 0xa9, 0x98, 0x58, 0xb1, 0xd6, - 0xc2, 0x2c, 0xc0, 0x76, 0x3e, 0xd1, 0x43, 0xa7, 0xa6, 0x49, 0xad, 0x54, 0x97, 0x08, 0xce, 0xb3, - 0xbe, 0x8b, 0x78, 0x5a, 0x6b, 0xaf, 0x2b, 0xcd, 0x36, 0x13, 0xdc, 0xf8, 0xf6, 0xd3, 0x71, 0x3b, - 0x36, 0x6d, 0xbe, 0x15, 0xab, 0x9e, 0xd9, 0xba, 0xe2, 0x70, 0x8d, 0xb7, 0x7d, 0x42, 0xa5, 0xdf, - 0x00, 0x9c, 0xbd, 0x43, 0x1c, 0x7e, 0x37, 0xa8, 0xbc, 0xe6, 0x57, 0xb7, 0x8c, 0x1d, 0x9d, 0x11, - 0x9b, 0x53, 0xe6, 0xd4, 0xf0, 0xe7, 0x6d, 0xec, 0x70, 0xf4, 0x21, 0x1c, 0xb1, 0x34, 0x13, 0xe7, - 0x47, 0x8b, 0x60, 0xee, 0xf0, 0xe2, 0xc2, 0x4b, 0x35, 0xf3, 0x8f, 0x7a, 0x15, 0x5d, 0x09, 0xf5, - 0xcf, 0xcb, 0xa2, 0xd9, 0xc4, 0x91, 0x75, 0x6a, 0x2a, 0x29, 0x41, 0x6b, 0x22, 0x14, 0x9a, 0x82, - 0x63, 0xeb, 0xa4, 0xc5, 0x31, 0xcb, 0x67, 0xdc, 0xa0, 0x35, 0xff, 0x09, 0x9d, 0x86, 0x87, 0x6d, - 0xcd, 0xc0, 0x0d, 0x87, 0x6c, 0xe3, 0x7c, 0xb6, 0x08, 0xe6, 0x46, 0x6b, 0xe3, 0xee, 0x8b, 0x3a, - 0xd9, 0xc6, 0x68, 0x06, 0x42, 0x61, 0xe4, 0xf4, 0x33, 0x6c, 0xe5, 0x47, 0xc4, 0x42, 0xe1, 0x7e, - 0xcf, 0x7d, 0x21, 0x7d, 0x0f, 0xe0, 0xdc, 0xde, 0x25, 0x39, 0x36, 0xb5, 0x1c, 0x8c, 0x1e, 0xc0, - 0x13, 0x41, 0x3f, 0x1b, 0xcd, 0xae, 0x3d, 0x0f, 0x8a, 0xd9, 0xb9, 0x5c, 0x65, 0xd6, 0xaf, 0x48, - 0xd6, 0x6c, 0x22, 0xa7, 0x55, 0x73, 0x9c, 0xf5, 0xe6, 0x40, 0x6f, 0xc0, 0x63, 0x16, 0x7e, 0xcc, - 0x1b, 0x21, 0xb0, 0x5e, 0x95, 0x47, 0xdc, 0xd7, 0xab, 0x1d, 0xc0, 0xdb, 0xf0, 0xc2, 0x2d, 0x9c, - 0x06, 0x37, 0xde, 0x80, 0x6c, 0xb8, 0x01, 0xf0, 0x20, 0x0d, 0x90, 0x9e, 0x03, 0x78, 0x46, 0x90, - 0x25, 0xb6, 0x5a, 0x42, 0xd3, 0x6f, 0x46, 0x9a, 0x5e, 0x11, 0x39, 0xcb, 0xa8, 0x94, 0x92, 0x33, - 0x16, 0xe9, 0x3f, 0xec, 0xf4, 0xd7, 0x00, 0xce, 0xf4, 0x01, 0xef, 0xb7, 0xf7, 0x36, 0x44, 0xfe, - 0xd9, 0xd3, 0xdb, 0xdc, 0x33, 0x91, 0xe6, 0xc6, 0x51, 0x4f, 0x9a, 0xf1, 0xa0, 0x03, 0xf7, 0xb3, - 0x09, 0x0b, 0x6e, 0x3f, 0xe3, 0x11, 0x63, 0x84, 0x66, 0xc3, 0x84, 0xc2, 0xa1, 0x09, 0x95, 0x9e, - 0x01, 0x38, 0xb3, 0xc4, 0xb0, 0xc6, 0xf1, 0x50, 0x99, 0xf6, 0xd1, 0xba, 0xf7, 0xe1, 0x64, 0x0f, - 0x89, 0xa2, 0xf2, 0x3d, 0x38, 0x5c, 0xcc, 0xbe, 0x54, 0x33, 0xb5, 0x89, 0x38, 0x91, 0x92, 0x01, - 0x67, 0x96, 0x71, 0x0b, 0x0f, 0x09, 0x7c, 0x1f, 0x14, 0xfd, 0x95, 0x85, 0x27, 0xdd, 0xfd, 0x71, - 0x8f, 0x98, 0xb8, 0x8e, 0x19, 0xc1, 0x9d, 0x5d, 0x7d, 0xcb, 0xcf, 0x00, 0x45, 0x86, 0xaa, 0xc8, - 0x70, 0x19, 0x5e, 0xd2, 0x5b, 0xb4, 0xdd, 0x0c, 0x46, 0xd9, 0xd4, 0x2c, 0xcd, 0xc0, 0x2c, 0x9e, - 0x6b, 0x95, 0xd1, 0x4f, 0xb1, 0xce, 0x7d, 0x6e, 0x4e, 0x47, 0xb7, 0xb5, 0x57, 0x72, 0xb0, 0xb7, - 0x97, 0xe0, 0x38, 0xb1, 0x38, 0x66, 0x1b, 0x5a, 0x4b, 0x6c, 0xde, 0x5c, 0x45, 0x92, 0x93, 0x2e, - 0x3d, 0xd9, 0x05, 0xf8, 0x9e, 0xef, 0xe9, 0x85, 0xe8, 0x2c, 0x44, 0x4b, 0x30, 0xa7, 0x19, 0x06, - 0xc3, 0x86, 0x38, 0xec, 0xc5, 0x1c, 0xe6, 0x2a, 0xe7, 0x93, 0xe3, 0xa8, 0x5d, 0xc7, 0x5a, 0x78, - 0x15, 0x9a, 0x86, 0xe3, 0x94, 0x35, 0x31, 0x6b, 0xac, 0x6d, 0xe5, 0xc7, 0xc4, 0x9e, 0x3d, 0x24, - 0x9e, 0x17, 0xb7, 0x50, 0x1d, 0x8e, 0x6c, 0x10, 0xbc, 0x99, 0x3f, 0x54, 0x04, 0x73, 0x47, 0x2b, - 0xf3, 0xc9, 0x81, 0x13, 0x59, 0x94, 0xbb, 0x6f, 0xee, 0x13, 0xbc, 0xe9, 0x01, 0x17, 0xc1, 0xa2, - 0x53, 0x3d, 0x9e, 0x3a, 0xd5, 0x87, 0xe3, 0x53, 0x3d, 0x0b, 0x8f, 0x46, 0x03, 0xa3, 0x71, 0x38, - 0x72, 0xf3, 0xa3, 0x3b, 0x77, 0x26, 0xfe, 0x87, 0x72, 0xf0, 0xd0, 0xbb, 0x2b, 0xea, 0xf2, 0x4a, - 0xad, 0x3e, 0x01, 0xa4, 0x9f, 0x01, 0x9c, 0x8a, 0x03, 0xf3, 0xe7, 0x5e, 0x85, 0x39, 0x4e, 0x4c, - 0xec, 0x2a, 0x0e, 0x82, 0x83, 0x81, 0x2f, 0xf6, 0x27, 0xdf, 0x5f, 0x0e, 0x79, 0xe7, 0xf7, 0xa0, - 0xd3, 0x8e, 0x16, 0xe0, 0x04, 0x7e, 0x8c, 0xf5, 0xb6, 0xcb, 0x73, 0x03, 0x33, 0xe6, 0x1e, 0x30, - 0x59, 0x91, 0x0f, 0x05, 0xf9, 0x98, 0xad, 0xcb, 0x75, 0x71, 0xeb, 0xd6, 0x8e, 0x75, 0x7c, 0x57, - 0x84, 0xab, 0xf4, 0x14, 0xc0, 0x53, 0xde, 0x18, 0xf7, 0xdf, 0xa5, 0xd9, 0x83, 0xee, 0xd2, 0x9b, - 0x51, 0x3a, 0x32, 0x83, 0xd1, 0xe1, 0x35, 0x34, 0xc4, 0x89, 0xf4, 0x25, 0x80, 0x27, 0xe3, 0x60, - 0x45, 0x1d, 0x68, 0x25, 0x4e, 0x38, 0x18, 0x28, 0x43, 0x26, 0x0f, 0x22, 0xa4, 0xcb, 0x70, 0xcc, - 0x93, 0x27, 0xfe, 0xf9, 0x92, 0x40, 0xa1, 0x58, 0xe3, 0x7b, 0x49, 0xdf, 0x64, 0x7a, 0xd9, 0xab, - 0xb7, 0x4d, 0x53, 0x63, 0x5b, 0xa8, 0x04, 0x27, 0x39, 0xe5, 0x5a, 0xab, 0x61, 0x53, 0x62, 0xf1, - 0x86, 0x4e, 0xdb, 0x16, 0x17, 0xc0, 0x46, 0x6b, 0xc7, 0x84, 0x61, 0xd5, 0x7d, 0xbf, 0xe4, 0xbe, - 0x46, 0x32, 0x3c, 0xee, 0xb4, 0x75, 0x1d, 0x3b, 0x4e, 0xc4, 0x3b, 0x23, 0xbc, 0x27, 0x7d, 0x53, - 0xc8, 0xff, 0x36, 0x1c, 0x8b, 0xb4, 0xba, 0x9a, 0x5c, 0x69, 0x1f, 0x68, 0xb2, 0xe0, 0xac, 0xe6, - 0x87, 0x28, 0xdc, 0x83, 0xa3, 0x1e, 0x89, 0xa5, 0x4e, 0xf5, 0xa0, 0x5f, 0xf5, 0x41, 0xe5, 0xe8, - 0x1c, 0xcc, 0xf5, 0x22, 0x85, 0x76, 0x07, 0x62, 0xe5, 0xa7, 0x23, 0xf0, 0x88, 0x77, 0x2e, 0xd6, - 0x3d, 0xd9, 0x8d, 0x5e, 0x01, 0x58, 0xdc, 0x4b, 0x18, 0xa1, 0x85, 0xfe, 0x07, 0xc0, 0x00, 0x1a, - 0xb1, 0x70, 0x63, 0xbf, 0xcb, 0xbd, 0xc1, 0x95, 0xd4, 0x5d, 0x55, 0x6c, 0xd9, 0x2f, 0xfe, 0x78, - 0xf5, 0x55, 0xe6, 0x2d, 0x54, 0x71, 0x65, 0xf0, 0x8e, 0xfb, 0x62, 0xc1, 0xf6, 0x76, 0xb4, 0xa3, - 0x94, 0x9e, 0x74, 0x75, 0x7a, 0x52, 0x05, 0xbf, 0x02, 0x78, 0x36, 0x5d, 0x4f, 0xa1, 0xeb, 0xc9, - 0x28, 0x07, 0x52, 0x61, 0x85, 0x41, 0x45, 0xa1, 0xb4, 0x1c, 0xae, 0xe5, 0x2a, 0xba, 0x92, 0x54, - 0x4b, 0x6a, 0x29, 0x4a, 0xa9, 0xf4, 0x04, 0xfd, 0x08, 0xbc, 0x4b, 0xac, 0x47, 0xe4, 0xa0, 0x4a, - 0x0a, 0xd7, 0x7d, 0xe4, 0x5c, 0xa1, 0x3a, 0xd4, 0x1a, 0xbf, 0x29, 0x6f, 0x87, 0x0b, 0xb9, 0x88, - 0x66, 0xfb, 0x34, 0xa5, 0x07, 0xe0, 0x77, 0x00, 0x1e, 0x4f, 0x50, 0x42, 0xe8, 0xcd, 0xfe, 0xf4, - 0x27, 0x2b, 0x82, 0x42, 0xaa, 0xce, 0x90, 0xae, 0x85, 0xf1, 0x95, 0x51, 0x29, 0x99, 0xe8, 0x38, - 0x3c, 0xc1, 0xee, 0x2f, 0x00, 0x4e, 0x25, 0xab, 0x28, 0x94, 0x3a, 0xd3, 0xfb, 0x03, 0xfa, 0xc9, - 0xae, 0x3a, 0xe5, 0xe2, 0x2a, 0xf7, 0xe8, 0x29, 0x01, 0xfd, 0x1d, 0x69, 0x50, 0x6a, 0xe7, 0x7b, - 0x15, 0x99, 0xcb, 0xf6, 0x54, 0xb2, 0xae, 0xea, 0x57, 0x4a, 0xaa, 0x0a, 0x2b, 0x4c, 0x05, 0x8b, - 0x82, 0x7f, 0x94, 0xf2, 0x8a, 0xfb, 0x8f, 0x32, 0xc6, 0x76, 0x69, 0x18, 0xb6, 0x7f, 0x00, 0xf0, - 0x68, 0xf4, 0xc6, 0x46, 0x97, 0x86, 0x10, 0x1c, 0x85, 0xf2, 0x60, 0xce, 0xfe, 0xb6, 0x5d, 0xde, - 0x55, 0xa7, 0x05, 0xdb, 0x9e, 0x1c, 0x2b, 0x07, 0x92, 0xaa, 0xec, 0x4a, 0x14, 0x81, 0x5e, 0x42, - 0xc5, 0x64, 0xc2, 0x43, 0x57, 0xd2, 0xb7, 0x00, 0x4e, 0xc4, 0xcf, 0x71, 0x74, 0x79, 0xb0, 0xf3, - 0x7e, 0x2f, 0x2a, 0x6f, 0xec, 0xaa, 0x13, 0x02, 0x61, 0xe8, 0xee, 0x14, 0xc0, 0x2e, 0x48, 0x7b, - 0x02, 0x9b, 0x07, 0xa5, 0xc2, 0x2e, 0x78, 0xa1, 0x4e, 0xf7, 0x95, 0xc5, 0xbf, 0xab, 0xcf, 0xc1, - 0x23, 0xce, 0x6d, 0x67, 0x5e, 0x51, 0x36, 0x37, 0x37, 0xe3, 0x12, 0x41, 0x6b, 0xf3, 0x47, 0x8a, - 0xd0, 0x12, 0x97, 0xed, 0x96, 0xc6, 0xd7, 0x29, 0x33, 0xcb, 0x7b, 0xb9, 0x77, 0x73, 0x0d, 0xe1, - 0x2a, 0x33, 0xac, 0x35, 0x87, 0xf1, 0xdf, 0x64, 0x84, 0xe3, 0xc5, 0x3f, 0x47, 0x5f, 0xab, 0x7f, - 0x83, 0x61, 0x64, 0x3f, 0xba, 0xde, 0xa1, 0x6a, 0xc7, 0xff, 0x95, 0x30, 0x3b, 0xca, 0x4e, 0xcf, - 0xec, 0x2c, 0xb8, 0x9b, 0x73, 0x85, 0x32, 0x43, 0xb3, 0xc8, 0xb6, 0xf7, 0xc1, 0x49, 0xd9, 0x09, - 0x3f, 0x0e, 0x11, 0xe6, 0xda, 0x3a, 0x6d, 0x35, 0xb1, 0x6b, 0xf7, 0x7e, 0x0c, 0xb1, 0x14, 0x94, - 0x8a, 0xe0, 0xb5, 0xfa, 0x2c, 0xb3, 0xcf, 0xbf, 0xf4, 0xe8, 0x83, 0xa4, 0xf2, 0xd3, 0xee, 0x97, - 0x9d, 0xde, 0x0f, 0x5e, 0x21, 0x4c, 0x4f, 0xd0, 0xc7, 0xe9, 0x94, 0x1c, 0x24, 0xf4, 0xdd, 0x5e, - 0x9a, 0x0e, 0x12, 0xce, 0xa5, 0x0e, 0xe6, 0x75, 0x6a, 0x26, 0x0e, 0xe6, 0x22, 0x8a, 0x28, 0xa1, - 0x55, 0x77, 0x0a, 0x57, 0xc1, 0x83, 0x1b, 0xbe, 0xaf, 0x41, 0x5b, 0x9a, 0x65, 0xc8, 0x94, 0x19, - 0x8a, 0x81, 0x2d, 0x31, 0xa3, 0x4a, 0x97, 0xf6, 0xe8, 0x47, 0xb9, 0xeb, 0xdd, 0xa7, 0xa7, 0x99, - 0xc2, 0x2d, 0x2f, 0xc0, 0x92, 0x3b, 0x45, 0x81, 0x16, 0x70, 0x53, 0xde, 0xaf, 0xbe, 0x08, 0x8c, - 0x0f, 0x85, 0xf1, 0x61, 0xd7, 0xf8, 0xf0, 0x7e, 0x75, 0x6d, 0x4c, 0x24, 0xa9, 0xfe, 0x1b, 0x00, - 0x00, 0xff, 0xff, 0xf4, 0x33, 0x56, 0x15, 0x2f, 0x15, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// MetricServiceClient is the client API for MetricService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type MetricServiceClient interface { - // Lists monitored resource descriptors that match a filter. This method does not require a Stackdriver account. - ListMonitoredResourceDescriptors(ctx context.Context, in *ListMonitoredResourceDescriptorsRequest, opts ...grpc.CallOption) (*ListMonitoredResourceDescriptorsResponse, error) - // Gets a single monitored resource descriptor. This method does not require a Stackdriver account. - GetMonitoredResourceDescriptor(ctx context.Context, in *GetMonitoredResourceDescriptorRequest, opts ...grpc.CallOption) (*monitoredres.MonitoredResourceDescriptor, error) - // Lists metric descriptors that match a filter. This method does not require a Stackdriver account. - ListMetricDescriptors(ctx context.Context, in *ListMetricDescriptorsRequest, opts ...grpc.CallOption) (*ListMetricDescriptorsResponse, error) - // Gets a single metric descriptor. This method does not require a Stackdriver account. - GetMetricDescriptor(ctx context.Context, in *GetMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) - // Creates a new metric descriptor. - // User-created metric descriptors define - // [custom metrics](https://cloud.google.com/monitoring/custom-metrics). - CreateMetricDescriptor(ctx context.Context, in *CreateMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) - // Deletes a metric descriptor. Only user-created - // [custom metrics](https://cloud.google.com/monitoring/custom-metrics) can be - // deleted. - DeleteMetricDescriptor(ctx context.Context, in *DeleteMetricDescriptorRequest, opts ...grpc.CallOption) (*empty.Empty, error) - // Lists time series that match a filter. This method does not require a Stackdriver account. - ListTimeSeries(ctx context.Context, in *ListTimeSeriesRequest, opts ...grpc.CallOption) (*ListTimeSeriesResponse, error) - // Creates or adds data to one or more time series. - // The response is empty if all time series in the request were written. - // If any time series could not be written, a corresponding failure message is - // included in the error response. - CreateTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*empty.Empty, error) -} - -type metricServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewMetricServiceClient(cc grpc.ClientConnInterface) MetricServiceClient { - return &metricServiceClient{cc} -} - -func (c *metricServiceClient) ListMonitoredResourceDescriptors(ctx context.Context, in *ListMonitoredResourceDescriptorsRequest, opts ...grpc.CallOption) (*ListMonitoredResourceDescriptorsResponse, error) { - out := new(ListMonitoredResourceDescriptorsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/ListMonitoredResourceDescriptors", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) GetMonitoredResourceDescriptor(ctx context.Context, in *GetMonitoredResourceDescriptorRequest, opts ...grpc.CallOption) (*monitoredres.MonitoredResourceDescriptor, error) { - out := new(monitoredres.MonitoredResourceDescriptor) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/GetMonitoredResourceDescriptor", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) ListMetricDescriptors(ctx context.Context, in *ListMetricDescriptorsRequest, opts ...grpc.CallOption) (*ListMetricDescriptorsResponse, error) { - out := new(ListMetricDescriptorsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/ListMetricDescriptors", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) GetMetricDescriptor(ctx context.Context, in *GetMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) { - out := new(metric.MetricDescriptor) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/GetMetricDescriptor", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) CreateMetricDescriptor(ctx context.Context, in *CreateMetricDescriptorRequest, opts ...grpc.CallOption) (*metric.MetricDescriptor, error) { - out := new(metric.MetricDescriptor) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/CreateMetricDescriptor", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) DeleteMetricDescriptor(ctx context.Context, in *DeleteMetricDescriptorRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/DeleteMetricDescriptor", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) ListTimeSeries(ctx context.Context, in *ListTimeSeriesRequest, opts ...grpc.CallOption) (*ListTimeSeriesResponse, error) { - out := new(ListTimeSeriesResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/ListTimeSeries", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *metricServiceClient) CreateTimeSeries(ctx context.Context, in *CreateTimeSeriesRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.MetricService/CreateTimeSeries", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MetricServiceServer is the server API for MetricService service. -type MetricServiceServer interface { - // Lists monitored resource descriptors that match a filter. This method does not require a Stackdriver account. - ListMonitoredResourceDescriptors(context.Context, *ListMonitoredResourceDescriptorsRequest) (*ListMonitoredResourceDescriptorsResponse, error) - // Gets a single monitored resource descriptor. This method does not require a Stackdriver account. - GetMonitoredResourceDescriptor(context.Context, *GetMonitoredResourceDescriptorRequest) (*monitoredres.MonitoredResourceDescriptor, error) - // Lists metric descriptors that match a filter. This method does not require a Stackdriver account. - ListMetricDescriptors(context.Context, *ListMetricDescriptorsRequest) (*ListMetricDescriptorsResponse, error) - // Gets a single metric descriptor. This method does not require a Stackdriver account. - GetMetricDescriptor(context.Context, *GetMetricDescriptorRequest) (*metric.MetricDescriptor, error) - // Creates a new metric descriptor. - // User-created metric descriptors define - // [custom metrics](https://cloud.google.com/monitoring/custom-metrics). - CreateMetricDescriptor(context.Context, *CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error) - // Deletes a metric descriptor. Only user-created - // [custom metrics](https://cloud.google.com/monitoring/custom-metrics) can be - // deleted. - DeleteMetricDescriptor(context.Context, *DeleteMetricDescriptorRequest) (*empty.Empty, error) - // Lists time series that match a filter. This method does not require a Stackdriver account. - ListTimeSeries(context.Context, *ListTimeSeriesRequest) (*ListTimeSeriesResponse, error) - // Creates or adds data to one or more time series. - // The response is empty if all time series in the request were written. - // If any time series could not be written, a corresponding failure message is - // included in the error response. - CreateTimeSeries(context.Context, *CreateTimeSeriesRequest) (*empty.Empty, error) -} - -// UnimplementedMetricServiceServer can be embedded to have forward compatible implementations. -type UnimplementedMetricServiceServer struct { -} - -func (*UnimplementedMetricServiceServer) ListMonitoredResourceDescriptors(ctx context.Context, req *ListMonitoredResourceDescriptorsRequest) (*ListMonitoredResourceDescriptorsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListMonitoredResourceDescriptors not implemented") -} -func (*UnimplementedMetricServiceServer) GetMonitoredResourceDescriptor(ctx context.Context, req *GetMonitoredResourceDescriptorRequest) (*monitoredres.MonitoredResourceDescriptor, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetMonitoredResourceDescriptor not implemented") -} -func (*UnimplementedMetricServiceServer) ListMetricDescriptors(ctx context.Context, req *ListMetricDescriptorsRequest) (*ListMetricDescriptorsResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListMetricDescriptors not implemented") -} -func (*UnimplementedMetricServiceServer) GetMetricDescriptor(ctx context.Context, req *GetMetricDescriptorRequest) (*metric.MetricDescriptor, error) { - return nil, status1.Errorf(codes.Unimplemented, "method GetMetricDescriptor not implemented") -} -func (*UnimplementedMetricServiceServer) CreateMetricDescriptor(ctx context.Context, req *CreateMetricDescriptorRequest) (*metric.MetricDescriptor, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CreateMetricDescriptor not implemented") -} -func (*UnimplementedMetricServiceServer) DeleteMetricDescriptor(ctx context.Context, req *DeleteMetricDescriptorRequest) (*empty.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method DeleteMetricDescriptor not implemented") -} -func (*UnimplementedMetricServiceServer) ListTimeSeries(ctx context.Context, req *ListTimeSeriesRequest) (*ListTimeSeriesResponse, error) { - return nil, status1.Errorf(codes.Unimplemented, "method ListTimeSeries not implemented") -} -func (*UnimplementedMetricServiceServer) CreateTimeSeries(ctx context.Context, req *CreateTimeSeriesRequest) (*empty.Empty, error) { - return nil, status1.Errorf(codes.Unimplemented, "method CreateTimeSeries not implemented") -} - -func RegisterMetricServiceServer(s *grpc.Server, srv MetricServiceServer) { - s.RegisterService(&_MetricService_serviceDesc, srv) -} - -func _MetricService_ListMonitoredResourceDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListMonitoredResourceDescriptorsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).ListMonitoredResourceDescriptors(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/ListMonitoredResourceDescriptors", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).ListMonitoredResourceDescriptors(ctx, req.(*ListMonitoredResourceDescriptorsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_GetMonitoredResourceDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetMonitoredResourceDescriptorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).GetMonitoredResourceDescriptor(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/GetMonitoredResourceDescriptor", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).GetMonitoredResourceDescriptor(ctx, req.(*GetMonitoredResourceDescriptorRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_ListMetricDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListMetricDescriptorsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).ListMetricDescriptors(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/ListMetricDescriptors", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).ListMetricDescriptors(ctx, req.(*ListMetricDescriptorsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_GetMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetMetricDescriptorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).GetMetricDescriptor(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/GetMetricDescriptor", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).GetMetricDescriptor(ctx, req.(*GetMetricDescriptorRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_CreateMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateMetricDescriptorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).CreateMetricDescriptor(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/CreateMetricDescriptor", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).CreateMetricDescriptor(ctx, req.(*CreateMetricDescriptorRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_DeleteMetricDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteMetricDescriptorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).DeleteMetricDescriptor(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/DeleteMetricDescriptor", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).DeleteMetricDescriptor(ctx, req.(*DeleteMetricDescriptorRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_ListTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListTimeSeriesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).ListTimeSeries(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/ListTimeSeries", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).ListTimeSeries(ctx, req.(*ListTimeSeriesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _MetricService_CreateTimeSeries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateTimeSeriesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MetricServiceServer).CreateTimeSeries(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.MetricService/CreateTimeSeries", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MetricServiceServer).CreateTimeSeries(ctx, req.(*CreateTimeSeriesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _MetricService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.MetricService", - HandlerType: (*MetricServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListMonitoredResourceDescriptors", - Handler: _MetricService_ListMonitoredResourceDescriptors_Handler, - }, - { - MethodName: "GetMonitoredResourceDescriptor", - Handler: _MetricService_GetMonitoredResourceDescriptor_Handler, - }, - { - MethodName: "ListMetricDescriptors", - Handler: _MetricService_ListMetricDescriptors_Handler, - }, - { - MethodName: "GetMetricDescriptor", - Handler: _MetricService_GetMetricDescriptor_Handler, - }, - { - MethodName: "CreateMetricDescriptor", - Handler: _MetricService_CreateMetricDescriptor_Handler, - }, - { - MethodName: "DeleteMetricDescriptor", - Handler: _MetricService_DeleteMetricDescriptor_Handler, - }, - { - MethodName: "ListTimeSeries", - Handler: _MetricService_ListTimeSeries_Handler, - }, - { - MethodName: "CreateTimeSeries", - Handler: _MetricService_CreateTimeSeries_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/metric_service.proto", -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/mutation_record.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/mutation_record.pb.go deleted file mode 100644 index 95c3fd93b..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/mutation_record.pb.go +++ /dev/null @@ -1,101 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/mutation_record.proto - -package monitoring - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - timestamp "github.com/golang/protobuf/ptypes/timestamp" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// Describes a change made to a configuration. -type MutationRecord struct { - // When the change occurred. - MutateTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=mutate_time,json=mutateTime,proto3" json:"mutate_time,omitempty"` - // The email address of the user making the change. - MutatedBy string `protobuf:"bytes,2,opt,name=mutated_by,json=mutatedBy,proto3" json:"mutated_by,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MutationRecord) Reset() { *m = MutationRecord{} } -func (m *MutationRecord) String() string { return proto.CompactTextString(m) } -func (*MutationRecord) ProtoMessage() {} -func (*MutationRecord) Descriptor() ([]byte, []int) { - return fileDescriptor_83c24e690bdb9101, []int{0} -} - -func (m *MutationRecord) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MutationRecord.Unmarshal(m, b) -} -func (m *MutationRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MutationRecord.Marshal(b, m, deterministic) -} -func (m *MutationRecord) XXX_Merge(src proto.Message) { - xxx_messageInfo_MutationRecord.Merge(m, src) -} -func (m *MutationRecord) XXX_Size() int { - return xxx_messageInfo_MutationRecord.Size(m) -} -func (m *MutationRecord) XXX_DiscardUnknown() { - xxx_messageInfo_MutationRecord.DiscardUnknown(m) -} - -var xxx_messageInfo_MutationRecord proto.InternalMessageInfo - -func (m *MutationRecord) GetMutateTime() *timestamp.Timestamp { - if m != nil { - return m.MutateTime - } - return nil -} - -func (m *MutationRecord) GetMutatedBy() string { - if m != nil { - return m.MutatedBy - } - return "" -} - -func init() { - proto.RegisterType((*MutationRecord)(nil), "google.monitoring.v3.MutationRecord") -} - -func init() { - proto.RegisterFile("google/monitoring/v3/mutation_record.proto", fileDescriptor_83c24e690bdb9101) -} - -var fileDescriptor_83c24e690bdb9101 = []byte{ - // 251 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x4a, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0xcf, 0xcd, 0xcf, 0xcb, 0x2c, 0xc9, 0x2f, 0xca, 0xcc, 0x4b, 0xd7, 0x2f, 0x33, - 0xd6, 0xcf, 0x2d, 0x2d, 0x49, 0x2c, 0xc9, 0xcc, 0xcf, 0x8b, 0x2f, 0x4a, 0x4d, 0xce, 0x2f, 0x4a, - 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x81, 0xa8, 0xd5, 0x43, 0xa8, 0xd5, 0x2b, 0x33, - 0x96, 0x92, 0x87, 0x9a, 0x00, 0x56, 0x93, 0x54, 0x9a, 0xa6, 0x5f, 0x92, 0x99, 0x9b, 0x5a, 0x5c, - 0x92, 0x98, 0x5b, 0x00, 0xd1, 0xa6, 0x94, 0xc3, 0xc5, 0xe7, 0x0b, 0x35, 0x2f, 0x08, 0x6c, 0x9c, - 0x90, 0x35, 0x17, 0x37, 0xd8, 0x86, 0xd4, 0x78, 0x90, 0x5a, 0x09, 0x46, 0x05, 0x46, 0x0d, 0x6e, - 0x23, 0x29, 0x3d, 0xa8, 0xf1, 0x30, 0x83, 0xf4, 0x42, 0x60, 0x06, 0x05, 0x71, 0x41, 0x94, 0x83, - 0x04, 0x84, 0x64, 0xb9, 0xa0, 0xbc, 0x94, 0xf8, 0xa4, 0x4a, 0x09, 0x26, 0x05, 0x46, 0x0d, 0xce, - 0x20, 0x4e, 0xa8, 0x88, 0x53, 0xa5, 0xd3, 0x6a, 0x46, 0x2e, 0x89, 0xe4, 0xfc, 0x5c, 0x3d, 0x6c, - 0x6e, 0x75, 0x12, 0x46, 0x75, 0x48, 0x00, 0xc8, 0xa6, 0x00, 0xc6, 0x28, 0x3b, 0xa8, 0xe2, 0xf4, - 0xfc, 0x9c, 0xc4, 0xbc, 0x74, 0xbd, 0xfc, 0xa2, 0x74, 0xfd, 0xf4, 0xd4, 0x3c, 0xb0, 0x3b, 0xf4, - 0x21, 0x52, 0x89, 0x05, 0x99, 0xc5, 0xa8, 0x61, 0x64, 0x8d, 0xe0, 0xad, 0x62, 0x92, 0x72, 0x87, - 0x18, 0xe0, 0x9c, 0x93, 0x5f, 0x9a, 0xa2, 0xe7, 0x8b, 0xb0, 0x33, 0xcc, 0xf8, 0x14, 0x4c, 0x32, - 0x06, 0x2c, 0x19, 0x83, 0x90, 0x8c, 0x09, 0x33, 0x4e, 0x62, 0x03, 0x5b, 0x62, 0x0c, 0x08, 0x00, - 0x00, 0xff, 0xff, 0x95, 0xa7, 0xf3, 0xbd, 0x87, 0x01, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/notification.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/notification.pb.go deleted file mode 100644 index 3935ddb46..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/notification.pb.go +++ /dev/null @@ -1,395 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/notification.proto - -package monitoring - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - wrappers "github.com/golang/protobuf/ptypes/wrappers" - api "google.golang.org/genproto/googleapis/api" - _ "google.golang.org/genproto/googleapis/api/annotations" - label "google.golang.org/genproto/googleapis/api/label" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// Indicates whether the channel has been verified or not. It is illegal -// to specify this field in a -// [`CreateNotificationChannel`][google.monitoring.v3.NotificationChannelService.CreateNotificationChannel] -// or an -// [`UpdateNotificationChannel`][google.monitoring.v3.NotificationChannelService.UpdateNotificationChannel] -// operation. -type NotificationChannel_VerificationStatus int32 - -const ( - // Sentinel value used to indicate that the state is unknown, omitted, or - // is not applicable (as in the case of channels that neither support - // nor require verification in order to function). - NotificationChannel_VERIFICATION_STATUS_UNSPECIFIED NotificationChannel_VerificationStatus = 0 - // The channel has yet to be verified and requires verification to function. - // Note that this state also applies to the case where the verification - // process has been initiated by sending a verification code but where - // the verification code has not been submitted to complete the process. - NotificationChannel_UNVERIFIED NotificationChannel_VerificationStatus = 1 - // It has been proven that notifications can be received on this - // notification channel and that someone on the project has access - // to messages that are delivered to that channel. - NotificationChannel_VERIFIED NotificationChannel_VerificationStatus = 2 -) - -var NotificationChannel_VerificationStatus_name = map[int32]string{ - 0: "VERIFICATION_STATUS_UNSPECIFIED", - 1: "UNVERIFIED", - 2: "VERIFIED", -} - -var NotificationChannel_VerificationStatus_value = map[string]int32{ - "VERIFICATION_STATUS_UNSPECIFIED": 0, - "UNVERIFIED": 1, - "VERIFIED": 2, -} - -func (x NotificationChannel_VerificationStatus) String() string { - return proto.EnumName(NotificationChannel_VerificationStatus_name, int32(x)) -} - -func (NotificationChannel_VerificationStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_4399f1e4bc1a75ef, []int{1, 0} -} - -// A description of a notification channel. The descriptor includes -// the properties of the channel and the set of labels or fields that -// must be specified to configure channels of a given type. -type NotificationChannelDescriptor struct { - // The full REST resource name for this descriptor. The syntax is: - // - // projects/[PROJECT_ID]/notificationChannelDescriptors/[TYPE] - // - // In the above, `[TYPE]` is the value of the `type` field. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - // The type of notification channel, such as "email", "sms", etc. - // Notification channel types are globally unique. - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - // A human-readable name for the notification channel type. This - // form of the name is suitable for a user interface. - DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // A human-readable description of the notification channel - // type. The description may include a description of the properties - // of the channel and pointers to external documentation. - Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` - // The set of labels that must be defined to identify a particular - // channel of the corresponding type. Each label includes a - // description for how that field should be populated. - Labels []*label.LabelDescriptor `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` - // The tiers that support this notification channel; the project service tier - // must be one of the supported_tiers. - SupportedTiers []ServiceTier `protobuf:"varint,5,rep,packed,name=supported_tiers,json=supportedTiers,proto3,enum=google.monitoring.v3.ServiceTier" json:"supported_tiers,omitempty"` // Deprecated: Do not use. - // The product launch stage for channels of this type. - LaunchStage api.LaunchStage `protobuf:"varint,7,opt,name=launch_stage,json=launchStage,proto3,enum=google.api.LaunchStage" json:"launch_stage,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NotificationChannelDescriptor) Reset() { *m = NotificationChannelDescriptor{} } -func (m *NotificationChannelDescriptor) String() string { return proto.CompactTextString(m) } -func (*NotificationChannelDescriptor) ProtoMessage() {} -func (*NotificationChannelDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_4399f1e4bc1a75ef, []int{0} -} - -func (m *NotificationChannelDescriptor) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NotificationChannelDescriptor.Unmarshal(m, b) -} -func (m *NotificationChannelDescriptor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NotificationChannelDescriptor.Marshal(b, m, deterministic) -} -func (m *NotificationChannelDescriptor) XXX_Merge(src proto.Message) { - xxx_messageInfo_NotificationChannelDescriptor.Merge(m, src) -} -func (m *NotificationChannelDescriptor) XXX_Size() int { - return xxx_messageInfo_NotificationChannelDescriptor.Size(m) -} -func (m *NotificationChannelDescriptor) XXX_DiscardUnknown() { - xxx_messageInfo_NotificationChannelDescriptor.DiscardUnknown(m) -} - -var xxx_messageInfo_NotificationChannelDescriptor proto.InternalMessageInfo - -func (m *NotificationChannelDescriptor) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NotificationChannelDescriptor) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *NotificationChannelDescriptor) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -func (m *NotificationChannelDescriptor) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *NotificationChannelDescriptor) GetLabels() []*label.LabelDescriptor { - if m != nil { - return m.Labels - } - return nil -} - -// Deprecated: Do not use. -func (m *NotificationChannelDescriptor) GetSupportedTiers() []ServiceTier { - if m != nil { - return m.SupportedTiers - } - return nil -} - -func (m *NotificationChannelDescriptor) GetLaunchStage() api.LaunchStage { - if m != nil { - return m.LaunchStage - } - return api.LaunchStage_LAUNCH_STAGE_UNSPECIFIED -} - -// A `NotificationChannel` is a medium through which an alert is -// delivered when a policy violation is detected. Examples of channels -// include email, SMS, and third-party messaging applications. Fields -// containing sensitive information like authentication tokens or -// contact info are only partially populated on retrieval. -type NotificationChannel struct { - // The type of the notification channel. This field matches the - // value of the [NotificationChannelDescriptor.type][google.monitoring.v3.NotificationChannelDescriptor.type] field. - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - // The full REST resource name for this channel. The syntax is: - // - // projects/[PROJECT_ID]/notificationChannels/[CHANNEL_ID] - // - // The `[CHANNEL_ID]` is automatically assigned by the server on creation. - Name string `protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"` - // An optional human-readable name for this notification channel. It is - // recommended that you specify a non-empty and unique name in order to - // make it easier to identify the channels in your project, though this is - // not enforced. The display name is limited to 512 Unicode characters. - DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // An optional human-readable description of this notification channel. This - // description may provide additional details, beyond the display - // name, for the channel. This may not exceed 1024 Unicode characters. - Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - // Configuration fields that define the channel and its behavior. The - // permissible and required labels are specified in the - // [NotificationChannelDescriptor.labels][google.monitoring.v3.NotificationChannelDescriptor.labels] of the - // `NotificationChannelDescriptor` corresponding to the `type` field. - Labels map[string]string `protobuf:"bytes,5,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // User-supplied key/value data that does not need to conform to - // the corresponding `NotificationChannelDescriptor`'s schema, unlike - // the `labels` field. This field is intended to be used for organizing - // and identifying the `NotificationChannel` objects. - // - // The field can contain up to 64 entries. Each key and value is limited to - // 63 Unicode characters or 128 bytes, whichever is smaller. Labels and - // values can contain only lowercase letters, numerals, underscores, and - // dashes. Keys must begin with a letter. - UserLabels map[string]string `protobuf:"bytes,8,rep,name=user_labels,json=userLabels,proto3" json:"user_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Indicates whether this channel has been verified or not. On a - // [`ListNotificationChannels`][google.monitoring.v3.NotificationChannelService.ListNotificationChannels] - // or - // [`GetNotificationChannel`][google.monitoring.v3.NotificationChannelService.GetNotificationChannel] - // operation, this field is expected to be populated. - // - // If the value is `UNVERIFIED`, then it indicates that the channel is - // non-functioning (it both requires verification and lacks verification); - // otherwise, it is assumed that the channel works. - // - // If the channel is neither `VERIFIED` nor `UNVERIFIED`, it implies that - // the channel is of a type that does not require verification or that - // this specific channel has been exempted from verification because it was - // created prior to verification being required for channels of this type. - // - // This field cannot be modified using a standard - // [`UpdateNotificationChannel`][google.monitoring.v3.NotificationChannelService.UpdateNotificationChannel] - // operation. To change the value of this field, you must call - // [`VerifyNotificationChannel`][google.monitoring.v3.NotificationChannelService.VerifyNotificationChannel]. - VerificationStatus NotificationChannel_VerificationStatus `protobuf:"varint,9,opt,name=verification_status,json=verificationStatus,proto3,enum=google.monitoring.v3.NotificationChannel_VerificationStatus" json:"verification_status,omitempty"` - // Whether notifications are forwarded to the described channel. This makes - // it possible to disable delivery of notifications to a particular channel - // without removing the channel from all alerting policies that reference - // the channel. This is a more convenient approach when the change is - // temporary and you want to receive notifications from the same set - // of alerting policies on the channel at some point in the future. - Enabled *wrappers.BoolValue `protobuf:"bytes,11,opt,name=enabled,proto3" json:"enabled,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NotificationChannel) Reset() { *m = NotificationChannel{} } -func (m *NotificationChannel) String() string { return proto.CompactTextString(m) } -func (*NotificationChannel) ProtoMessage() {} -func (*NotificationChannel) Descriptor() ([]byte, []int) { - return fileDescriptor_4399f1e4bc1a75ef, []int{1} -} - -func (m *NotificationChannel) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NotificationChannel.Unmarshal(m, b) -} -func (m *NotificationChannel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NotificationChannel.Marshal(b, m, deterministic) -} -func (m *NotificationChannel) XXX_Merge(src proto.Message) { - xxx_messageInfo_NotificationChannel.Merge(m, src) -} -func (m *NotificationChannel) XXX_Size() int { - return xxx_messageInfo_NotificationChannel.Size(m) -} -func (m *NotificationChannel) XXX_DiscardUnknown() { - xxx_messageInfo_NotificationChannel.DiscardUnknown(m) -} - -var xxx_messageInfo_NotificationChannel proto.InternalMessageInfo - -func (m *NotificationChannel) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *NotificationChannel) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NotificationChannel) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -func (m *NotificationChannel) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *NotificationChannel) GetLabels() map[string]string { - if m != nil { - return m.Labels - } - return nil -} - -func (m *NotificationChannel) GetUserLabels() map[string]string { - if m != nil { - return m.UserLabels - } - return nil -} - -func (m *NotificationChannel) GetVerificationStatus() NotificationChannel_VerificationStatus { - if m != nil { - return m.VerificationStatus - } - return NotificationChannel_VERIFICATION_STATUS_UNSPECIFIED -} - -func (m *NotificationChannel) GetEnabled() *wrappers.BoolValue { - if m != nil { - return m.Enabled - } - return nil -} - -func init() { - proto.RegisterEnum("google.monitoring.v3.NotificationChannel_VerificationStatus", NotificationChannel_VerificationStatus_name, NotificationChannel_VerificationStatus_value) - proto.RegisterType((*NotificationChannelDescriptor)(nil), "google.monitoring.v3.NotificationChannelDescriptor") - proto.RegisterType((*NotificationChannel)(nil), "google.monitoring.v3.NotificationChannel") - proto.RegisterMapType((map[string]string)(nil), "google.monitoring.v3.NotificationChannel.LabelsEntry") - proto.RegisterMapType((map[string]string)(nil), "google.monitoring.v3.NotificationChannel.UserLabelsEntry") -} - -func init() { - proto.RegisterFile("google/monitoring/v3/notification.proto", fileDescriptor_4399f1e4bc1a75ef) -} - -var fileDescriptor_4399f1e4bc1a75ef = []byte{ - // 759 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xcb, 0x6e, 0xd3, 0x40, - 0x14, 0xc5, 0x49, 0xfa, 0x1a, 0x57, 0x69, 0x99, 0x56, 0x60, 0x82, 0x0a, 0x69, 0x59, 0x10, 0x55, - 0xc2, 0x96, 0x12, 0x10, 0x34, 0x94, 0x4a, 0x79, 0x15, 0x22, 0xd1, 0x10, 0xe5, 0x85, 0x54, 0x55, - 0xb2, 0x1c, 0x67, 0xea, 0x0e, 0x38, 0x1e, 0x6b, 0xc6, 0x0e, 0x0a, 0x51, 0xff, 0x84, 0x05, 0x2b, - 0x24, 0xf8, 0x14, 0x3e, 0xa5, 0x2b, 0xd6, 0x2c, 0x10, 0xf2, 0x23, 0xb1, 0xd3, 0xb8, 0x90, 0x76, - 0x37, 0xf7, 0x9c, 0x7b, 0xcf, 0xdc, 0x99, 0x39, 0xd7, 0x06, 0x8f, 0x35, 0x42, 0x34, 0x1d, 0x49, - 0x7d, 0x62, 0x60, 0x8b, 0x50, 0x6c, 0x68, 0xd2, 0x20, 0x27, 0x19, 0xc4, 0xc2, 0xa7, 0x58, 0x55, - 0x2c, 0x4c, 0x0c, 0xd1, 0xa4, 0xc4, 0x22, 0x70, 0xd3, 0x4b, 0x14, 0x83, 0x44, 0x71, 0x90, 0x4b, - 0xdd, 0xf1, 0xcb, 0x15, 0x13, 0x4b, 0xba, 0xd2, 0x45, 0xba, 0x97, 0x9d, 0xda, 0x9a, 0xc2, 0x6d, - 0x43, 0x3d, 0x93, 0x99, 0xa5, 0x68, 0xc8, 0xa7, 0xef, 0x85, 0x68, 0x8a, 0x18, 0xb1, 0xa9, 0x3a, - 0xa6, 0xb6, 0x23, 0x1b, 0x52, 0x49, 0xbf, 0x3f, 0x6e, 0x25, 0xf5, 0xc0, 0x4f, 0x71, 0xa3, 0xae, - 0x7d, 0x2a, 0x7d, 0xa2, 0x8a, 0x69, 0x22, 0xca, 0x3c, 0x7e, 0xe7, 0x57, 0x02, 0x6c, 0xd5, 0x42, - 0x27, 0x28, 0x9d, 0x29, 0x86, 0x81, 0xf4, 0x32, 0x62, 0x2a, 0xc5, 0xa6, 0x45, 0x28, 0x84, 0x20, - 0x61, 0x28, 0x7d, 0x24, 0x2c, 0xa6, 0xb9, 0xcc, 0x4a, 0xc3, 0x5d, 0x3b, 0x98, 0x35, 0x34, 0x91, - 0xc0, 0x79, 0x98, 0xb3, 0x86, 0xdb, 0x60, 0xb5, 0x87, 0x99, 0xa9, 0x2b, 0x43, 0xd9, 0xcd, 0x8f, - 0xb9, 0x1c, 0xef, 0x63, 0x35, 0xa7, 0x2c, 0x0d, 0xf8, 0x9e, 0x2f, 0x8c, 0x89, 0x21, 0xc4, 0xfd, - 0x8c, 0x00, 0x82, 0x39, 0xb0, 0xe8, 0x5e, 0x0d, 0x13, 0x12, 0xe9, 0x78, 0x86, 0xcf, 0xde, 0x17, - 0xfd, 0xab, 0x54, 0x4c, 0x2c, 0xbe, 0x75, 0x98, 0xa0, 0xb3, 0x86, 0x9f, 0x0a, 0x6b, 0x60, 0x8d, - 0xd9, 0xa6, 0x49, 0xa8, 0x85, 0x7a, 0xb2, 0x85, 0x11, 0x65, 0xc2, 0x42, 0x3a, 0x9e, 0x49, 0x66, - 0xb7, 0xc5, 0xa8, 0x87, 0x10, 0x9b, 0x88, 0x0e, 0xb0, 0x8a, 0x5a, 0x18, 0xd1, 0x62, 0x4c, 0xe0, - 0x1a, 0xc9, 0x49, 0xb5, 0x03, 0x31, 0x98, 0x07, 0xab, 0xe1, 0x77, 0x10, 0x96, 0xd2, 0x5c, 0x26, - 0x99, 0xbd, 0x3b, 0xdd, 0x8a, 0xc3, 0x37, 0x1d, 0xba, 0xc1, 0xeb, 0x41, 0x90, 0xff, 0x1a, 0xbb, - 0x28, 0x7c, 0x89, 0x81, 0xe7, 0xa1, 0x1d, 0xbd, 0x32, 0xc5, 0xc4, 0x4c, 0x54, 0x49, 0x5f, 0xfa, - 0xf7, 0x6d, 0x1f, 0x9a, 0x94, 0x7c, 0x40, 0xaa, 0xc5, 0xa4, 0x91, 0xbf, 0x3a, 0x9f, 0x72, 0xd8, - 0x4c, 0x05, 0x93, 0x46, 0xaa, 0x87, 0xc9, 0xbd, 0x09, 0x78, 0x0e, 0xeb, 0x84, 0x6a, 0x8a, 0x81, - 0x3f, 0xbb, 0x45, 0x4c, 0x1a, 0x85, 0xc3, 0x9b, 0x29, 0x96, 0x4f, 0x89, 0xde, 0x43, 0x0e, 0xeb, - 0x2d, 0x6e, 0xa6, 0xc2, 0xed, 0xee, 0x7c, 0x5b, 0x02, 0x1b, 0x11, 0x97, 0x10, 0x69, 0xaa, 0x28, - 0xf3, 0x5d, 0x36, 0x5a, 0xfc, 0xbf, 0x46, 0x4b, 0xcc, 0x1a, 0xed, 0x68, 0x62, 0xb4, 0x05, 0xd7, - 0x68, 0xcf, 0xa2, 0xad, 0x12, 0xd1, 0xa7, 0x67, 0x43, 0x56, 0x31, 0x2c, 0x3a, 0x9c, 0x58, 0xf0, - 0x18, 0xf0, 0x36, 0x43, 0x54, 0xf6, 0x35, 0x97, 0x5d, 0xcd, 0xbd, 0xf9, 0x35, 0xdb, 0x0c, 0xd1, - 0xb0, 0x2e, 0xb0, 0x27, 0x00, 0xec, 0x83, 0x8d, 0x01, 0xa2, 0x93, 0x12, 0xc7, 0x94, 0x96, 0xcd, - 0x84, 0x15, 0xd7, 0x95, 0xfb, 0xf3, 0xef, 0xd1, 0x09, 0x89, 0x34, 0x5d, 0x8d, 0x06, 0x1c, 0xcc, - 0x60, 0xf0, 0x29, 0x58, 0x42, 0x86, 0xd2, 0xd5, 0x51, 0x4f, 0xe0, 0xd3, 0x5c, 0x86, 0xcf, 0xa6, - 0xc6, 0x5b, 0x8c, 0xbf, 0x21, 0x62, 0x91, 0x10, 0xbd, 0xa3, 0xe8, 0x36, 0x6a, 0x8c, 0x53, 0x53, - 0x7b, 0x80, 0x0f, 0xf5, 0x0f, 0xd7, 0x41, 0xfc, 0x23, 0x1a, 0xfa, 0x4f, 0xe9, 0x2c, 0xe1, 0x26, - 0x58, 0x18, 0x38, 0x25, 0xfe, 0x77, 0xc1, 0x0b, 0xf2, 0xb1, 0x17, 0x5c, 0xea, 0x15, 0x58, 0xbb, - 0x74, 0xfc, 0xeb, 0x94, 0xef, 0xbc, 0x07, 0x70, 0xf6, 0x64, 0xf0, 0x11, 0x78, 0xd8, 0xa9, 0x34, - 0xaa, 0x87, 0xd5, 0x52, 0xa1, 0x55, 0x7d, 0x57, 0x93, 0x9b, 0xad, 0x42, 0xab, 0xdd, 0x94, 0xdb, - 0xb5, 0x66, 0xbd, 0x52, 0xaa, 0x1e, 0x56, 0x2b, 0xe5, 0xf5, 0x5b, 0x30, 0x09, 0x40, 0xbb, 0xe6, - 0xa5, 0x55, 0xca, 0xeb, 0x1c, 0x5c, 0x05, 0xcb, 0x93, 0x28, 0x96, 0xff, 0xc3, 0x5d, 0x14, 0x7e, - 0x73, 0xe0, 0xc9, 0xb5, 0x46, 0x19, 0x1e, 0xcc, 0x37, 0xc0, 0x4c, 0x1a, 0x85, 0x51, 0xd9, 0x9f, - 0x95, 0x73, 0xf8, 0xe6, 0xba, 0x83, 0x7b, 0xa5, 0xd2, 0xfe, 0x3c, 0x03, 0x7b, 0x65, 0x35, 0xb7, - 0x5b, 0xfc, 0xce, 0x01, 0x41, 0x25, 0xfd, 0x48, 0x87, 0x15, 0x6f, 0x87, 0x0f, 0x5f, 0x77, 0x9c, - 0x51, 0xe7, 0x8e, 0x0f, 0xfc, 0x54, 0x8d, 0xe8, 0x8a, 0xa1, 0x89, 0x84, 0x6a, 0x92, 0x86, 0x0c, - 0xd7, 0x37, 0x52, 0x70, 0x77, 0xd3, 0xff, 0xab, 0x97, 0x41, 0xf4, 0x23, 0x96, 0x7a, 0xed, 0x09, - 0x94, 0x74, 0x62, 0xf7, 0xc4, 0xa3, 0x60, 0xc7, 0x4e, 0xee, 0xe7, 0x98, 0x3c, 0x71, 0xc9, 0x93, - 0x80, 0x3c, 0xe9, 0xe4, 0xba, 0x8b, 0xee, 0x26, 0xb9, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa0, - 0xba, 0x27, 0x74, 0xa4, 0x07, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/notification_service.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/notification_service.pb.go deleted file mode 100644 index 9cff82794..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/notification_service.pb.go +++ /dev/null @@ -1,1377 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/notification_service.proto - -package monitoring - -import ( - context "context" - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - empty "github.com/golang/protobuf/ptypes/empty" - _ "github.com/golang/protobuf/ptypes/struct" - timestamp "github.com/golang/protobuf/ptypes/timestamp" - _ "google.golang.org/genproto/googleapis/api/annotations" - field_mask "google.golang.org/genproto/protobuf/field_mask" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The `ListNotificationChannelDescriptors` request. -type ListNotificationChannelDescriptorsRequest struct { - // Required. The REST resource name of the parent from which to retrieve - // the notification channel descriptors. The expected syntax is: - // - // projects/[PROJECT_ID_OR_NUMBER] - // - // Note that this names the parent container in which to look for the - // descriptors; to retrieve a single descriptor by name, use the - // [GetNotificationChannelDescriptor][google.monitoring.v3.NotificationChannelService.GetNotificationChannelDescriptor] - // operation, instead. - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - // The maximum number of results to return in a single response. If - // not set to a positive number, a reasonable value will be chosen by the - // service. - PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If non-empty, `page_token` must contain a value returned as the - // `next_page_token` in a previous response to request the next set - // of results. - PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListNotificationChannelDescriptorsRequest) Reset() { - *m = ListNotificationChannelDescriptorsRequest{} -} -func (m *ListNotificationChannelDescriptorsRequest) String() string { return proto.CompactTextString(m) } -func (*ListNotificationChannelDescriptorsRequest) ProtoMessage() {} -func (*ListNotificationChannelDescriptorsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{0} -} - -func (m *ListNotificationChannelDescriptorsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListNotificationChannelDescriptorsRequest.Unmarshal(m, b) -} -func (m *ListNotificationChannelDescriptorsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListNotificationChannelDescriptorsRequest.Marshal(b, m, deterministic) -} -func (m *ListNotificationChannelDescriptorsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListNotificationChannelDescriptorsRequest.Merge(m, src) -} -func (m *ListNotificationChannelDescriptorsRequest) XXX_Size() int { - return xxx_messageInfo_ListNotificationChannelDescriptorsRequest.Size(m) -} -func (m *ListNotificationChannelDescriptorsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListNotificationChannelDescriptorsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListNotificationChannelDescriptorsRequest proto.InternalMessageInfo - -func (m *ListNotificationChannelDescriptorsRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ListNotificationChannelDescriptorsRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListNotificationChannelDescriptorsRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -// The `ListNotificationChannelDescriptors` response. -type ListNotificationChannelDescriptorsResponse struct { - // The monitored resource descriptors supported for the specified - // project, optionally filtered. - ChannelDescriptors []*NotificationChannelDescriptor `protobuf:"bytes,1,rep,name=channel_descriptors,json=channelDescriptors,proto3" json:"channel_descriptors,omitempty"` - // If not empty, indicates that there may be more results that match - // the request. Use the value in the `page_token` field in a - // subsequent request to fetch the next set of results. If empty, - // all results have been returned. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListNotificationChannelDescriptorsResponse) Reset() { - *m = ListNotificationChannelDescriptorsResponse{} -} -func (m *ListNotificationChannelDescriptorsResponse) String() string { - return proto.CompactTextString(m) -} -func (*ListNotificationChannelDescriptorsResponse) ProtoMessage() {} -func (*ListNotificationChannelDescriptorsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{1} -} - -func (m *ListNotificationChannelDescriptorsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListNotificationChannelDescriptorsResponse.Unmarshal(m, b) -} -func (m *ListNotificationChannelDescriptorsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListNotificationChannelDescriptorsResponse.Marshal(b, m, deterministic) -} -func (m *ListNotificationChannelDescriptorsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListNotificationChannelDescriptorsResponse.Merge(m, src) -} -func (m *ListNotificationChannelDescriptorsResponse) XXX_Size() int { - return xxx_messageInfo_ListNotificationChannelDescriptorsResponse.Size(m) -} -func (m *ListNotificationChannelDescriptorsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListNotificationChannelDescriptorsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListNotificationChannelDescriptorsResponse proto.InternalMessageInfo - -func (m *ListNotificationChannelDescriptorsResponse) GetChannelDescriptors() []*NotificationChannelDescriptor { - if m != nil { - return m.ChannelDescriptors - } - return nil -} - -func (m *ListNotificationChannelDescriptorsResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -// The `GetNotificationChannelDescriptor` response. -type GetNotificationChannelDescriptorRequest struct { - // Required. The channel type for which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/notificationChannelDescriptors/[CHANNEL_TYPE] - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetNotificationChannelDescriptorRequest) Reset() { - *m = GetNotificationChannelDescriptorRequest{} -} -func (m *GetNotificationChannelDescriptorRequest) String() string { return proto.CompactTextString(m) } -func (*GetNotificationChannelDescriptorRequest) ProtoMessage() {} -func (*GetNotificationChannelDescriptorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{2} -} - -func (m *GetNotificationChannelDescriptorRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetNotificationChannelDescriptorRequest.Unmarshal(m, b) -} -func (m *GetNotificationChannelDescriptorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetNotificationChannelDescriptorRequest.Marshal(b, m, deterministic) -} -func (m *GetNotificationChannelDescriptorRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetNotificationChannelDescriptorRequest.Merge(m, src) -} -func (m *GetNotificationChannelDescriptorRequest) XXX_Size() int { - return xxx_messageInfo_GetNotificationChannelDescriptorRequest.Size(m) -} -func (m *GetNotificationChannelDescriptorRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetNotificationChannelDescriptorRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetNotificationChannelDescriptorRequest proto.InternalMessageInfo - -func (m *GetNotificationChannelDescriptorRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The `CreateNotificationChannel` request. -type CreateNotificationChannelRequest struct { - // Required. The project on which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER] - // - // This names the container into which the channel will be - // written, this does not name the newly created channel. The resulting - // channel's name will have a normalized version of this field as a prefix, - // but will add `/notificationChannels/[CHANNEL_ID]` to identify the channel. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - // Required. The definition of the `NotificationChannel` to create. - NotificationChannel *NotificationChannel `protobuf:"bytes,2,opt,name=notification_channel,json=notificationChannel,proto3" json:"notification_channel,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateNotificationChannelRequest) Reset() { *m = CreateNotificationChannelRequest{} } -func (m *CreateNotificationChannelRequest) String() string { return proto.CompactTextString(m) } -func (*CreateNotificationChannelRequest) ProtoMessage() {} -func (*CreateNotificationChannelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{3} -} - -func (m *CreateNotificationChannelRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateNotificationChannelRequest.Unmarshal(m, b) -} -func (m *CreateNotificationChannelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateNotificationChannelRequest.Marshal(b, m, deterministic) -} -func (m *CreateNotificationChannelRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateNotificationChannelRequest.Merge(m, src) -} -func (m *CreateNotificationChannelRequest) XXX_Size() int { - return xxx_messageInfo_CreateNotificationChannelRequest.Size(m) -} -func (m *CreateNotificationChannelRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateNotificationChannelRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateNotificationChannelRequest proto.InternalMessageInfo - -func (m *CreateNotificationChannelRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *CreateNotificationChannelRequest) GetNotificationChannel() *NotificationChannel { - if m != nil { - return m.NotificationChannel - } - return nil -} - -// The `ListNotificationChannels` request. -type ListNotificationChannelsRequest struct { - // Required. The project on which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER] - // - // This names the container - // in which to look for the notification channels; it does not name a - // specific channel. To query a specific channel by REST resource name, use - // the - // [`GetNotificationChannel`][google.monitoring.v3.NotificationChannelService.GetNotificationChannel] - // operation. - Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` - // If provided, this field specifies the criteria that must be met by - // notification channels to be included in the response. - // - // For more details, see [sorting and - // filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering). - Filter string `protobuf:"bytes,6,opt,name=filter,proto3" json:"filter,omitempty"` - // A comma-separated list of fields by which to sort the result. Supports - // the same set of fields as in `filter`. Entries can be prefixed with - // a minus sign to sort in descending rather than ascending order. - // - // For more details, see [sorting and - // filtering](https://cloud.google.com/monitoring/api/v3/sorting-and-filtering). - OrderBy string `protobuf:"bytes,7,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` - // The maximum number of results to return in a single response. If - // not set to a positive number, a reasonable value will be chosen by the - // service. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If non-empty, `page_token` must contain a value returned as the - // `next_page_token` in a previous response to request the next set - // of results. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListNotificationChannelsRequest) Reset() { *m = ListNotificationChannelsRequest{} } -func (m *ListNotificationChannelsRequest) String() string { return proto.CompactTextString(m) } -func (*ListNotificationChannelsRequest) ProtoMessage() {} -func (*ListNotificationChannelsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{4} -} - -func (m *ListNotificationChannelsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListNotificationChannelsRequest.Unmarshal(m, b) -} -func (m *ListNotificationChannelsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListNotificationChannelsRequest.Marshal(b, m, deterministic) -} -func (m *ListNotificationChannelsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListNotificationChannelsRequest.Merge(m, src) -} -func (m *ListNotificationChannelsRequest) XXX_Size() int { - return xxx_messageInfo_ListNotificationChannelsRequest.Size(m) -} -func (m *ListNotificationChannelsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListNotificationChannelsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListNotificationChannelsRequest proto.InternalMessageInfo - -func (m *ListNotificationChannelsRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ListNotificationChannelsRequest) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *ListNotificationChannelsRequest) GetOrderBy() string { - if m != nil { - return m.OrderBy - } - return "" -} - -func (m *ListNotificationChannelsRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListNotificationChannelsRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -// The `ListNotificationChannels` response. -type ListNotificationChannelsResponse struct { - // The notification channels defined for the specified project. - NotificationChannels []*NotificationChannel `protobuf:"bytes,3,rep,name=notification_channels,json=notificationChannels,proto3" json:"notification_channels,omitempty"` - // If not empty, indicates that there may be more results that match - // the request. Use the value in the `page_token` field in a - // subsequent request to fetch the next set of results. If empty, - // all results have been returned. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListNotificationChannelsResponse) Reset() { *m = ListNotificationChannelsResponse{} } -func (m *ListNotificationChannelsResponse) String() string { return proto.CompactTextString(m) } -func (*ListNotificationChannelsResponse) ProtoMessage() {} -func (*ListNotificationChannelsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{5} -} - -func (m *ListNotificationChannelsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListNotificationChannelsResponse.Unmarshal(m, b) -} -func (m *ListNotificationChannelsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListNotificationChannelsResponse.Marshal(b, m, deterministic) -} -func (m *ListNotificationChannelsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListNotificationChannelsResponse.Merge(m, src) -} -func (m *ListNotificationChannelsResponse) XXX_Size() int { - return xxx_messageInfo_ListNotificationChannelsResponse.Size(m) -} -func (m *ListNotificationChannelsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListNotificationChannelsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListNotificationChannelsResponse proto.InternalMessageInfo - -func (m *ListNotificationChannelsResponse) GetNotificationChannels() []*NotificationChannel { - if m != nil { - return m.NotificationChannels - } - return nil -} - -func (m *ListNotificationChannelsResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -// The `GetNotificationChannel` request. -type GetNotificationChannelRequest struct { - // Required. The channel for which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID] - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetNotificationChannelRequest) Reset() { *m = GetNotificationChannelRequest{} } -func (m *GetNotificationChannelRequest) String() string { return proto.CompactTextString(m) } -func (*GetNotificationChannelRequest) ProtoMessage() {} -func (*GetNotificationChannelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{6} -} - -func (m *GetNotificationChannelRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetNotificationChannelRequest.Unmarshal(m, b) -} -func (m *GetNotificationChannelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetNotificationChannelRequest.Marshal(b, m, deterministic) -} -func (m *GetNotificationChannelRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetNotificationChannelRequest.Merge(m, src) -} -func (m *GetNotificationChannelRequest) XXX_Size() int { - return xxx_messageInfo_GetNotificationChannelRequest.Size(m) -} -func (m *GetNotificationChannelRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetNotificationChannelRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetNotificationChannelRequest proto.InternalMessageInfo - -func (m *GetNotificationChannelRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The `UpdateNotificationChannel` request. -type UpdateNotificationChannelRequest struct { - // The fields to update. - UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` - // Required. A description of the changes to be applied to the specified - // notification channel. The description must provide a definition for - // fields to be updated; the names of these fields should also be - // included in the `update_mask`. - NotificationChannel *NotificationChannel `protobuf:"bytes,3,opt,name=notification_channel,json=notificationChannel,proto3" json:"notification_channel,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UpdateNotificationChannelRequest) Reset() { *m = UpdateNotificationChannelRequest{} } -func (m *UpdateNotificationChannelRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateNotificationChannelRequest) ProtoMessage() {} -func (*UpdateNotificationChannelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{7} -} - -func (m *UpdateNotificationChannelRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UpdateNotificationChannelRequest.Unmarshal(m, b) -} -func (m *UpdateNotificationChannelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UpdateNotificationChannelRequest.Marshal(b, m, deterministic) -} -func (m *UpdateNotificationChannelRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateNotificationChannelRequest.Merge(m, src) -} -func (m *UpdateNotificationChannelRequest) XXX_Size() int { - return xxx_messageInfo_UpdateNotificationChannelRequest.Size(m) -} -func (m *UpdateNotificationChannelRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateNotificationChannelRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_UpdateNotificationChannelRequest proto.InternalMessageInfo - -func (m *UpdateNotificationChannelRequest) GetUpdateMask() *field_mask.FieldMask { - if m != nil { - return m.UpdateMask - } - return nil -} - -func (m *UpdateNotificationChannelRequest) GetNotificationChannel() *NotificationChannel { - if m != nil { - return m.NotificationChannel - } - return nil -} - -// The `DeleteNotificationChannel` request. -type DeleteNotificationChannelRequest struct { - // Required. The channel for which to execute the request. The format is: - // - // projects/[PROJECT_ID_OR_NUMBER]/notificationChannels/[CHANNEL_ID] - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - // If true, the notification channel will be deleted regardless of its - // use in alert policies (the policies will be updated to remove the - // channel). If false, channels that are still referenced by an existing - // alerting policy will fail to be deleted in a delete operation. - Force bool `protobuf:"varint,5,opt,name=force,proto3" json:"force,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteNotificationChannelRequest) Reset() { *m = DeleteNotificationChannelRequest{} } -func (m *DeleteNotificationChannelRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteNotificationChannelRequest) ProtoMessage() {} -func (*DeleteNotificationChannelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{8} -} - -func (m *DeleteNotificationChannelRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteNotificationChannelRequest.Unmarshal(m, b) -} -func (m *DeleteNotificationChannelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteNotificationChannelRequest.Marshal(b, m, deterministic) -} -func (m *DeleteNotificationChannelRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteNotificationChannelRequest.Merge(m, src) -} -func (m *DeleteNotificationChannelRequest) XXX_Size() int { - return xxx_messageInfo_DeleteNotificationChannelRequest.Size(m) -} -func (m *DeleteNotificationChannelRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteNotificationChannelRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteNotificationChannelRequest proto.InternalMessageInfo - -func (m *DeleteNotificationChannelRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *DeleteNotificationChannelRequest) GetForce() bool { - if m != nil { - return m.Force - } - return false -} - -// The `SendNotificationChannelVerificationCode` request. -type SendNotificationChannelVerificationCodeRequest struct { - // Required. The notification channel to which to send a verification code. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SendNotificationChannelVerificationCodeRequest) Reset() { - *m = SendNotificationChannelVerificationCodeRequest{} -} -func (m *SendNotificationChannelVerificationCodeRequest) String() string { - return proto.CompactTextString(m) -} -func (*SendNotificationChannelVerificationCodeRequest) ProtoMessage() {} -func (*SendNotificationChannelVerificationCodeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{9} -} - -func (m *SendNotificationChannelVerificationCodeRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SendNotificationChannelVerificationCodeRequest.Unmarshal(m, b) -} -func (m *SendNotificationChannelVerificationCodeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SendNotificationChannelVerificationCodeRequest.Marshal(b, m, deterministic) -} -func (m *SendNotificationChannelVerificationCodeRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SendNotificationChannelVerificationCodeRequest.Merge(m, src) -} -func (m *SendNotificationChannelVerificationCodeRequest) XXX_Size() int { - return xxx_messageInfo_SendNotificationChannelVerificationCodeRequest.Size(m) -} -func (m *SendNotificationChannelVerificationCodeRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SendNotificationChannelVerificationCodeRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SendNotificationChannelVerificationCodeRequest proto.InternalMessageInfo - -func (m *SendNotificationChannelVerificationCodeRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The `GetNotificationChannelVerificationCode` request. -type GetNotificationChannelVerificationCodeRequest struct { - // Required. The notification channel for which a verification code is to be generated - // and retrieved. This must name a channel that is already verified; if - // the specified channel is not verified, the request will fail. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The desired expiration time. If specified, the API will guarantee that - // the returned code will not be valid after the specified timestamp; - // however, the API cannot guarantee that the returned code will be - // valid for at least as long as the requested time (the API puts an upper - // bound on the amount of time for which a code may be valid). If omitted, - // a default expiration will be used, which may be less than the max - // permissible expiration (so specifying an expiration may extend the - // code's lifetime over omitting an expiration, even though the API does - // impose an upper limit on the maximum expiration that is permitted). - ExpireTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetNotificationChannelVerificationCodeRequest) Reset() { - *m = GetNotificationChannelVerificationCodeRequest{} -} -func (m *GetNotificationChannelVerificationCodeRequest) String() string { - return proto.CompactTextString(m) -} -func (*GetNotificationChannelVerificationCodeRequest) ProtoMessage() {} -func (*GetNotificationChannelVerificationCodeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{10} -} - -func (m *GetNotificationChannelVerificationCodeRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetNotificationChannelVerificationCodeRequest.Unmarshal(m, b) -} -func (m *GetNotificationChannelVerificationCodeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetNotificationChannelVerificationCodeRequest.Marshal(b, m, deterministic) -} -func (m *GetNotificationChannelVerificationCodeRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetNotificationChannelVerificationCodeRequest.Merge(m, src) -} -func (m *GetNotificationChannelVerificationCodeRequest) XXX_Size() int { - return xxx_messageInfo_GetNotificationChannelVerificationCodeRequest.Size(m) -} -func (m *GetNotificationChannelVerificationCodeRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetNotificationChannelVerificationCodeRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetNotificationChannelVerificationCodeRequest proto.InternalMessageInfo - -func (m *GetNotificationChannelVerificationCodeRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *GetNotificationChannelVerificationCodeRequest) GetExpireTime() *timestamp.Timestamp { - if m != nil { - return m.ExpireTime - } - return nil -} - -// The `GetNotificationChannelVerificationCode` request. -type GetNotificationChannelVerificationCodeResponse struct { - // The verification code, which may be used to verify other channels - // that have an equivalent identity (i.e. other channels of the same - // type with the same fingerprint such as other email channels with - // the same email address or other sms channels with the same number). - Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` - // The expiration time associated with the code that was returned. If - // an expiration was provided in the request, this is the minimum of the - // requested expiration in the request and the max permitted expiration. - ExpireTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetNotificationChannelVerificationCodeResponse) Reset() { - *m = GetNotificationChannelVerificationCodeResponse{} -} -func (m *GetNotificationChannelVerificationCodeResponse) String() string { - return proto.CompactTextString(m) -} -func (*GetNotificationChannelVerificationCodeResponse) ProtoMessage() {} -func (*GetNotificationChannelVerificationCodeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{11} -} - -func (m *GetNotificationChannelVerificationCodeResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetNotificationChannelVerificationCodeResponse.Unmarshal(m, b) -} -func (m *GetNotificationChannelVerificationCodeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetNotificationChannelVerificationCodeResponse.Marshal(b, m, deterministic) -} -func (m *GetNotificationChannelVerificationCodeResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetNotificationChannelVerificationCodeResponse.Merge(m, src) -} -func (m *GetNotificationChannelVerificationCodeResponse) XXX_Size() int { - return xxx_messageInfo_GetNotificationChannelVerificationCodeResponse.Size(m) -} -func (m *GetNotificationChannelVerificationCodeResponse) XXX_DiscardUnknown() { - xxx_messageInfo_GetNotificationChannelVerificationCodeResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_GetNotificationChannelVerificationCodeResponse proto.InternalMessageInfo - -func (m *GetNotificationChannelVerificationCodeResponse) GetCode() string { - if m != nil { - return m.Code - } - return "" -} - -func (m *GetNotificationChannelVerificationCodeResponse) GetExpireTime() *timestamp.Timestamp { - if m != nil { - return m.ExpireTime - } - return nil -} - -// The `VerifyNotificationChannel` request. -type VerifyNotificationChannelRequest struct { - // Required. The notification channel to verify. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Required. The verification code that was delivered to the channel as - // a result of invoking the `SendNotificationChannelVerificationCode` API - // method or that was retrieved from a verified channel via - // `GetNotificationChannelVerificationCode`. For example, one might have - // "G-123456" or "TKNZGhhd2EyN3I1MnRnMjRv" (in general, one is only - // guaranteed that the code is valid UTF-8; one should not - // make any assumptions regarding the structure or format of the code). - Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *VerifyNotificationChannelRequest) Reset() { *m = VerifyNotificationChannelRequest{} } -func (m *VerifyNotificationChannelRequest) String() string { return proto.CompactTextString(m) } -func (*VerifyNotificationChannelRequest) ProtoMessage() {} -func (*VerifyNotificationChannelRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7e2bcd7194b305fe, []int{12} -} - -func (m *VerifyNotificationChannelRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_VerifyNotificationChannelRequest.Unmarshal(m, b) -} -func (m *VerifyNotificationChannelRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_VerifyNotificationChannelRequest.Marshal(b, m, deterministic) -} -func (m *VerifyNotificationChannelRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_VerifyNotificationChannelRequest.Merge(m, src) -} -func (m *VerifyNotificationChannelRequest) XXX_Size() int { - return xxx_messageInfo_VerifyNotificationChannelRequest.Size(m) -} -func (m *VerifyNotificationChannelRequest) XXX_DiscardUnknown() { - xxx_messageInfo_VerifyNotificationChannelRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_VerifyNotificationChannelRequest proto.InternalMessageInfo - -func (m *VerifyNotificationChannelRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *VerifyNotificationChannelRequest) GetCode() string { - if m != nil { - return m.Code - } - return "" -} - -func init() { - proto.RegisterType((*ListNotificationChannelDescriptorsRequest)(nil), "google.monitoring.v3.ListNotificationChannelDescriptorsRequest") - proto.RegisterType((*ListNotificationChannelDescriptorsResponse)(nil), "google.monitoring.v3.ListNotificationChannelDescriptorsResponse") - proto.RegisterType((*GetNotificationChannelDescriptorRequest)(nil), "google.monitoring.v3.GetNotificationChannelDescriptorRequest") - proto.RegisterType((*CreateNotificationChannelRequest)(nil), "google.monitoring.v3.CreateNotificationChannelRequest") - proto.RegisterType((*ListNotificationChannelsRequest)(nil), "google.monitoring.v3.ListNotificationChannelsRequest") - proto.RegisterType((*ListNotificationChannelsResponse)(nil), "google.monitoring.v3.ListNotificationChannelsResponse") - proto.RegisterType((*GetNotificationChannelRequest)(nil), "google.monitoring.v3.GetNotificationChannelRequest") - proto.RegisterType((*UpdateNotificationChannelRequest)(nil), "google.monitoring.v3.UpdateNotificationChannelRequest") - proto.RegisterType((*DeleteNotificationChannelRequest)(nil), "google.monitoring.v3.DeleteNotificationChannelRequest") - proto.RegisterType((*SendNotificationChannelVerificationCodeRequest)(nil), "google.monitoring.v3.SendNotificationChannelVerificationCodeRequest") - proto.RegisterType((*GetNotificationChannelVerificationCodeRequest)(nil), "google.monitoring.v3.GetNotificationChannelVerificationCodeRequest") - proto.RegisterType((*GetNotificationChannelVerificationCodeResponse)(nil), "google.monitoring.v3.GetNotificationChannelVerificationCodeResponse") - proto.RegisterType((*VerifyNotificationChannelRequest)(nil), "google.monitoring.v3.VerifyNotificationChannelRequest") -} - -func init() { - proto.RegisterFile("google/monitoring/v3/notification_service.proto", fileDescriptor_7e2bcd7194b305fe) -} - -var fileDescriptor_7e2bcd7194b305fe = []byte{ - // 1210 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x41, 0x6f, 0xdc, 0x44, - 0x14, 0xd6, 0xec, 0x26, 0x69, 0xf2, 0x22, 0x84, 0x34, 0x0d, 0xe9, 0xee, 0xb6, 0x55, 0x2d, 0x1f, - 0x9a, 0x74, 0x95, 0xd8, 0x52, 0x96, 0x06, 0x9a, 0xa8, 0xb4, 0xde, 0x24, 0xad, 0x40, 0x14, 0x45, - 0x4e, 0x89, 0x04, 0x8a, 0x58, 0x39, 0xf6, 0xec, 0xc6, 0xcd, 0xae, 0xc7, 0x78, 0x66, 0x93, 0xa6, - 0x55, 0x91, 0x68, 0x25, 0x10, 0x67, 0x7e, 0x05, 0x3d, 0x20, 0x2e, 0x08, 0x09, 0x71, 0x42, 0x9c, - 0x72, 0x42, 0x70, 0x0b, 0x20, 0xf5, 0xd0, 0x13, 0xe2, 0x17, 0x70, 0x42, 0x1e, 0x7b, 0xb3, 0xce, - 0xc6, 0xde, 0xb5, 0xb3, 0xe5, 0xb6, 0x9e, 0xf7, 0x66, 0xde, 0xfb, 0xbe, 0xf7, 0xcd, 0xbc, 0x97, - 0x80, 0xda, 0xa0, 0xb4, 0xd1, 0x24, 0x6a, 0x8b, 0x3a, 0x36, 0xa7, 0x9e, 0xed, 0x34, 0xd4, 0xbd, - 0x8a, 0xea, 0x50, 0x6e, 0xd7, 0x6d, 0xd3, 0xe0, 0x36, 0x75, 0x6a, 0x8c, 0x78, 0x7b, 0xb6, 0x49, - 0x14, 0xd7, 0xa3, 0x9c, 0xe2, 0xa9, 0x60, 0x83, 0xd2, 0xdd, 0xa0, 0xec, 0x55, 0x4a, 0x97, 0xc2, - 0x63, 0x0c, 0xd7, 0x56, 0x0d, 0xc7, 0xa1, 0x5c, 0x6c, 0x65, 0xc1, 0x9e, 0xd2, 0x85, 0x88, 0xd5, - 0x6c, 0xda, 0xc4, 0xe1, 0xa1, 0xe1, 0x4a, 0xc4, 0x50, 0xb7, 0x49, 0xd3, 0xaa, 0x6d, 0x93, 0x1d, - 0x63, 0xcf, 0xa6, 0x5e, 0xe8, 0x50, 0x8c, 0x38, 0x78, 0x84, 0xd1, 0xb6, 0xd7, 0x49, 0xa4, 0x34, - 0x33, 0x30, 0xf3, 0xd0, 0xf1, 0x62, 0xe8, 0x28, 0xbe, 0xb6, 0xdb, 0x75, 0x95, 0xb4, 0x5c, 0x7e, - 0x10, 0x1a, 0xa5, 0x5e, 0x63, 0x90, 0x46, 0xcb, 0x60, 0xbb, 0xa1, 0xc7, 0xa5, 0x5e, 0x0f, 0xc6, - 0xbd, 0xb6, 0xd9, 0x8b, 0xe0, 0xd8, 0xca, 0xed, 0x16, 0x61, 0xdc, 0x68, 0xb9, 0x81, 0x83, 0xfc, - 0x13, 0x82, 0x6b, 0xef, 0xdb, 0x8c, 0x7f, 0x10, 0x49, 0x6c, 0x65, 0xc7, 0x70, 0x1c, 0xd2, 0x5c, - 0x25, 0xcc, 0xf4, 0x6c, 0x97, 0x53, 0x8f, 0xe9, 0xe4, 0xd3, 0x36, 0x61, 0x1c, 0x6f, 0xc0, 0x88, - 0x63, 0xb4, 0x48, 0x61, 0x44, 0x42, 0xb3, 0x13, 0xd5, 0x5b, 0x2f, 0xb4, 0xdc, 0xbf, 0xda, 0x0d, - 0xfc, 0x56, 0x84, 0xec, 0x20, 0x9e, 0xe1, 0xda, 0x4c, 0x31, 0x69, 0x4b, 0xed, 0x7b, 0xac, 0x2e, - 0x0e, 0xc3, 0x17, 0x61, 0xc2, 0x35, 0x1a, 0xa4, 0xc6, 0xec, 0x47, 0xa4, 0x90, 0x93, 0xd0, 0xec, - 0xa8, 0x3e, 0xee, 0x2f, 0x6c, 0xd8, 0x8f, 0x08, 0xbe, 0x0c, 0x20, 0x8c, 0x9c, 0xee, 0x12, 0xa7, - 0x90, 0xf7, 0xe3, 0xea, 0xc2, 0xfd, 0xbe, 0xbf, 0x20, 0xff, 0x88, 0xa0, 0x9c, 0x26, 0x7d, 0xe6, - 0x52, 0x87, 0x11, 0x6c, 0xc1, 0x79, 0x33, 0xb0, 0xd6, 0xac, 0xae, 0xb9, 0x80, 0xa4, 0xfc, 0xec, - 0xe4, 0x42, 0x45, 0x89, 0xd3, 0x8e, 0xd2, 0x1f, 0x02, 0x36, 0x4f, 0x45, 0xc3, 0x57, 0xe1, 0x75, - 0x87, 0x3c, 0xe4, 0xb5, 0x48, 0xe2, 0x39, 0x91, 0xf8, 0x6b, 0xfe, 0xf2, 0xfa, 0x71, 0xf2, 0x9f, - 0xc1, 0xcc, 0x5d, 0xd2, 0x3f, 0xf5, 0x5e, 0xe2, 0xf3, 0x51, 0xe2, 0x61, 0x38, 0xe2, 0xe5, 0x5f, - 0x11, 0x48, 0x2b, 0x1e, 0x31, 0x38, 0x89, 0xf1, 0xee, 0x44, 0x7e, 0xf7, 0x44, 0xe4, 0xeb, 0x22, - 0xb2, 0x8a, 0xe7, 0x33, 0x45, 0x0e, 0x0b, 0x6d, 0xc0, 0xd4, 0x89, 0x9b, 0x1b, 0x52, 0x27, 0xc8, - 0x99, 0x5c, 0xb8, 0x96, 0x9a, 0xfe, 0x6a, 0xfe, 0x85, 0x96, 0xd3, 0xcf, 0x3b, 0xa7, 0x2d, 0xf2, - 0x1f, 0x08, 0xae, 0x24, 0xe8, 0x81, 0xf5, 0x22, 0x1a, 0x1d, 0x1e, 0xd1, 0x34, 0x8c, 0xd5, 0xed, - 0x26, 0x27, 0x5e, 0x61, 0x4c, 0x14, 0x38, 0xfc, 0xc2, 0x45, 0x18, 0xa7, 0x9e, 0x45, 0xbc, 0xda, - 0xf6, 0x41, 0xe1, 0x9c, 0xb0, 0x9c, 0x13, 0xdf, 0xd5, 0x83, 0x93, 0x6a, 0xcf, 0xf7, 0x55, 0xfb, - 0x48, 0xaf, 0xda, 0x9f, 0x23, 0x90, 0x92, 0xd1, 0x85, 0x1a, 0xff, 0x04, 0xde, 0x88, 0x63, 0x99, - 0x15, 0xf2, 0x42, 0xe5, 0xe9, 0x69, 0xd6, 0xa7, 0x62, 0x18, 0x4e, 0xaf, 0xee, 0x07, 0x70, 0x39, - 0x5e, 0xdd, 0x7d, 0x95, 0x05, 0x67, 0xa9, 0x83, 0xfc, 0x33, 0x02, 0xe9, 0x43, 0xd7, 0xea, 0xaf, - 0xe4, 0x65, 0x98, 0x6c, 0x0b, 0x1f, 0xf1, 0x7c, 0x86, 0xaa, 0x2b, 0x75, 0xe8, 0xe8, 0xbc, 0x90, - 0xca, 0x1d, 0xff, 0x85, 0xbd, 0x67, 0xb0, 0x5d, 0x1d, 0x02, 0x77, 0xff, 0x77, 0xa2, 0x76, 0xf3, - 0xaf, 0x4e, 0xbb, 0xcf, 0x10, 0x48, 0xab, 0xa4, 0x49, 0xb2, 0x5f, 0xc7, 0x33, 0x91, 0x86, 0xa7, - 0x60, 0xb4, 0x4e, 0x3d, 0x33, 0xb8, 0x08, 0xe3, 0x7a, 0xf0, 0x21, 0x3f, 0x06, 0x65, 0x83, 0x38, - 0x56, 0xcc, 0xb6, 0x4d, 0xe2, 0x75, 0x97, 0xa8, 0x45, 0x7a, 0x53, 0x42, 0xc3, 0xd7, 0xf1, 0x07, - 0x04, 0xf3, 0xf1, 0xa2, 0xf9, 0xff, 0x83, 0xfb, 0xfa, 0x20, 0x0f, 0x5d, 0xdb, 0x23, 0x35, 0xbf, - 0x49, 0x26, 0xea, 0xe3, 0x7e, 0xa7, 0x83, 0xea, 0x10, 0xb8, 0xfb, 0x0b, 0xf2, 0xe7, 0x08, 0x94, - 0xb4, 0x99, 0x87, 0x17, 0x15, 0xc3, 0x88, 0x49, 0xad, 0x30, 0x75, 0x5d, 0xfc, 0x1e, 0x2e, 0x87, - 0x2f, 0x10, 0x48, 0x22, 0xda, 0x41, 0x0a, 0x01, 0xbd, 0x02, 0xc2, 0x2e, 0x84, 0x00, 0xc4, 0xf5, - 0x0f, 0x84, 0x2d, 0x16, 0x16, 0xfe, 0xc6, 0x50, 0x8a, 0xd9, 0xb6, 0x11, 0x4c, 0x6a, 0xf8, 0x1f, - 0x04, 0xf2, 0xe0, 0xa6, 0x8d, 0x6f, 0xc5, 0x5f, 0xaa, 0xd4, 0xd3, 0x4a, 0xe9, 0xf6, 0xd9, 0x0f, - 0x08, 0x4a, 0x24, 0xaf, 0x1c, 0x69, 0x02, 0xea, 0xd3, 0xdf, 0x5f, 0x7e, 0x9d, 0x5b, 0xc4, 0x6f, - 0xfa, 0x23, 0xdc, 0x63, 0x7f, 0xe1, 0xa6, 0xeb, 0xd1, 0x07, 0xc4, 0xe4, 0x4c, 0x2d, 0x3f, 0x51, - 0x9d, 0xfe, 0x38, 0xfe, 0x42, 0x20, 0x0d, 0xea, 0xf3, 0xf8, 0x66, 0x7c, 0xae, 0x29, 0xe7, 0x83, - 0xd2, 0x59, 0x66, 0x17, 0x79, 0x2d, 0x8a, 0xee, 0x6d, 0xbc, 0x18, 0x87, 0x6e, 0x00, 0x38, 0xb5, - 0xfc, 0x04, 0xff, 0x82, 0xa0, 0x90, 0xd4, 0x95, 0xf0, 0xf5, 0x4c, 0x35, 0x38, 0x2e, 0xdd, 0x62, - 0xd6, 0x6d, 0x61, 0xc1, 0x6e, 0x44, 0x21, 0xcd, 0xe1, 0x72, 0xea, 0x82, 0x31, 0xfc, 0x3d, 0x82, - 0xe9, 0x78, 0xba, 0x71, 0x25, 0x4b, 0x71, 0x3a, 0x10, 0xd2, 0xf7, 0x04, 0x79, 0x39, 0x9a, 0xb5, - 0x82, 0xe7, 0xd2, 0x16, 0x42, 0xd0, 0xff, 0x12, 0x41, 0x31, 0x71, 0x8a, 0xc3, 0x09, 0x44, 0x0e, - 0x1a, 0xfb, 0xb2, 0x64, 0x6f, 0x1d, 0x69, 0x45, 0x3f, 0xd9, 0xb9, 0xb8, 0x06, 0x29, 0x20, 0x55, - 0xe5, 0x0c, 0x85, 0x58, 0x8a, 0x6d, 0xb4, 0xf8, 0x59, 0x0e, 0x8a, 0x89, 0x2d, 0x3e, 0x09, 0xe6, - 0xa0, 0x99, 0x20, 0x0b, 0xcc, 0xa7, 0xe8, 0x48, 0x93, 0x22, 0x03, 0x44, 0x32, 0xdc, 0x8f, 0x16, - 0xb4, 0x00, 0x6e, 0x8c, 0x83, 0x92, 0xb2, 0xac, 0x09, 0x2c, 0x7c, 0x8b, 0xa0, 0x98, 0x38, 0x23, - 0x24, 0xb1, 0x30, 0x68, 0xa8, 0x28, 0x4d, 0x9f, 0x6a, 0x30, 0x6b, 0xfe, 0xdf, 0xa0, 0xb2, 0x76, - 0xa4, 0x81, 0xa8, 0xac, 0x18, 0x0d, 0x02, 0x75, 0x96, 0xb3, 0xa9, 0xf3, 0x4f, 0x04, 0x33, 0x29, - 0xe7, 0x09, 0xbc, 0x1a, 0x9f, 0x7e, 0xb6, 0x71, 0x24, 0x11, 0xcc, 0x46, 0xf4, 0x92, 0xdd, 0x91, - 0xb5, 0x2c, 0x30, 0x96, 0x18, 0x71, 0xac, 0xde, 0x80, 0x4b, 0xa8, 0x8c, 0xbf, 0xcc, 0xc1, 0xd5, - 0x74, 0x6d, 0x1f, 0xaf, 0x64, 0x79, 0x44, 0x92, 0xc0, 0xad, 0x0e, 0x77, 0x48, 0xf8, 0x4a, 0xea, - 0x51, 0x2a, 0xd6, 0xe4, 0xdb, 0x99, 0xa8, 0x68, 0x10, 0x1e, 0xc7, 0xc4, 0x21, 0x82, 0x62, 0xe2, - 0xf0, 0x91, 0xa4, 0xcc, 0x41, 0xd3, 0x4a, 0x96, 0xfb, 0xf9, 0xde, 0x91, 0x36, 0x21, 0xc4, 0xea, - 0x8f, 0x20, 0x41, 0x4b, 0x93, 0x2b, 0x99, 0x90, 0xed, 0x89, 0x6c, 0x96, 0x50, 0xb9, 0xf4, 0x0d, - 0x3a, 0xd4, 0x8a, 0x89, 0x23, 0xd1, 0x6f, 0xda, 0x57, 0x68, 0x87, 0x73, 0x97, 0x2d, 0xa9, 0xea, - 0xfe, 0xfe, 0x7e, 0xef, 0xc0, 0x64, 0xb4, 0xf9, 0x8e, 0x6a, 0x36, 0x69, 0xdb, 0x9a, 0x77, 0x9b, - 0x06, 0xaf, 0x53, 0xaf, 0x35, 0x37, 0xc8, 0xbd, 0x1b, 0x2b, 0x83, 0xab, 0xe2, 0x11, 0xc3, 0xaa, - 0x7e, 0x87, 0xa0, 0x60, 0xd2, 0x56, 0x2c, 0x51, 0xd5, 0x42, 0x94, 0xa9, 0x70, 0xfe, 0x5a, 0xf7, - 0xef, 0xc5, 0x3a, 0xfa, 0xf8, 0x9d, 0x70, 0x47, 0x83, 0x36, 0x0d, 0xa7, 0xa1, 0x50, 0xaf, 0xa1, - 0x36, 0x88, 0x23, 0x6e, 0x8d, 0xda, 0x0d, 0x7c, 0xf2, 0x1f, 0x58, 0xcb, 0xdd, 0xaf, 0xe7, 0xb9, - 0xd2, 0xdd, 0xe0, 0x80, 0x15, 0x1f, 0xab, 0x72, 0xaf, 0x1b, 0x78, 0xb3, 0x72, 0xd8, 0x31, 0x6e, - 0x09, 0xe3, 0x56, 0xd7, 0xb8, 0xb5, 0x59, 0xd9, 0x1e, 0x13, 0x41, 0x2a, 0xff, 0x05, 0x00, 0x00, - 0xff, 0xff, 0x4f, 0x09, 0xed, 0xc9, 0xde, 0x13, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// NotificationChannelServiceClient is the client API for NotificationChannelService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type NotificationChannelServiceClient interface { - // Lists the descriptors for supported channel types. The use of descriptors - // makes it possible for new channel types to be dynamically added. - ListNotificationChannelDescriptors(ctx context.Context, in *ListNotificationChannelDescriptorsRequest, opts ...grpc.CallOption) (*ListNotificationChannelDescriptorsResponse, error) - // Gets a single channel descriptor. The descriptor indicates which fields - // are expected / permitted for a notification channel of the given type. - GetNotificationChannelDescriptor(ctx context.Context, in *GetNotificationChannelDescriptorRequest, opts ...grpc.CallOption) (*NotificationChannelDescriptor, error) - // Lists the notification channels that have been created for the project. - ListNotificationChannels(ctx context.Context, in *ListNotificationChannelsRequest, opts ...grpc.CallOption) (*ListNotificationChannelsResponse, error) - // Gets a single notification channel. The channel includes the relevant - // configuration details with which the channel was created. However, the - // response may truncate or omit passwords, API keys, or other private key - // matter and thus the response may not be 100% identical to the information - // that was supplied in the call to the create method. - GetNotificationChannel(ctx context.Context, in *GetNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) - // Creates a new notification channel, representing a single notification - // endpoint such as an email address, SMS number, or PagerDuty service. - CreateNotificationChannel(ctx context.Context, in *CreateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) - // Updates a notification channel. Fields not specified in the field mask - // remain unchanged. - UpdateNotificationChannel(ctx context.Context, in *UpdateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) - // Deletes a notification channel. - DeleteNotificationChannel(ctx context.Context, in *DeleteNotificationChannelRequest, opts ...grpc.CallOption) (*empty.Empty, error) - // Causes a verification code to be delivered to the channel. The code - // can then be supplied in `VerifyNotificationChannel` to verify the channel. - SendNotificationChannelVerificationCode(ctx context.Context, in *SendNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*empty.Empty, error) - // Requests a verification code for an already verified channel that can then - // be used in a call to VerifyNotificationChannel() on a different channel - // with an equivalent identity in the same or in a different project. This - // makes it possible to copy a channel between projects without requiring - // manual reverification of the channel. If the channel is not in the - // verified state, this method will fail (in other words, this may only be - // used if the SendNotificationChannelVerificationCode and - // VerifyNotificationChannel paths have already been used to put the given - // channel into the verified state). - // - // There is no guarantee that the verification codes returned by this method - // will be of a similar structure or form as the ones that are delivered - // to the channel via SendNotificationChannelVerificationCode; while - // VerifyNotificationChannel() will recognize both the codes delivered via - // SendNotificationChannelVerificationCode() and returned from - // GetNotificationChannelVerificationCode(), it is typically the case that - // the verification codes delivered via - // SendNotificationChannelVerificationCode() will be shorter and also - // have a shorter expiration (e.g. codes such as "G-123456") whereas - // GetVerificationCode() will typically return a much longer, websafe base - // 64 encoded string that has a longer expiration time. - GetNotificationChannelVerificationCode(ctx context.Context, in *GetNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*GetNotificationChannelVerificationCodeResponse, error) - // Verifies a `NotificationChannel` by proving receipt of the code - // delivered to the channel as a result of calling - // `SendNotificationChannelVerificationCode`. - VerifyNotificationChannel(ctx context.Context, in *VerifyNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) -} - -type notificationChannelServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewNotificationChannelServiceClient(cc grpc.ClientConnInterface) NotificationChannelServiceClient { - return ¬ificationChannelServiceClient{cc} -} - -func (c *notificationChannelServiceClient) ListNotificationChannelDescriptors(ctx context.Context, in *ListNotificationChannelDescriptorsRequest, opts ...grpc.CallOption) (*ListNotificationChannelDescriptorsResponse, error) { - out := new(ListNotificationChannelDescriptorsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/ListNotificationChannelDescriptors", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) GetNotificationChannelDescriptor(ctx context.Context, in *GetNotificationChannelDescriptorRequest, opts ...grpc.CallOption) (*NotificationChannelDescriptor, error) { - out := new(NotificationChannelDescriptor) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelDescriptor", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) ListNotificationChannels(ctx context.Context, in *ListNotificationChannelsRequest, opts ...grpc.CallOption) (*ListNotificationChannelsResponse, error) { - out := new(ListNotificationChannelsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/ListNotificationChannels", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) GetNotificationChannel(ctx context.Context, in *GetNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { - out := new(NotificationChannel) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/GetNotificationChannel", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) CreateNotificationChannel(ctx context.Context, in *CreateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { - out := new(NotificationChannel) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/CreateNotificationChannel", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) UpdateNotificationChannel(ctx context.Context, in *UpdateNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { - out := new(NotificationChannel) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/UpdateNotificationChannel", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) DeleteNotificationChannel(ctx context.Context, in *DeleteNotificationChannelRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/DeleteNotificationChannel", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) SendNotificationChannelVerificationCode(ctx context.Context, in *SendNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/SendNotificationChannelVerificationCode", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) GetNotificationChannelVerificationCode(ctx context.Context, in *GetNotificationChannelVerificationCodeRequest, opts ...grpc.CallOption) (*GetNotificationChannelVerificationCodeResponse, error) { - out := new(GetNotificationChannelVerificationCodeResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelVerificationCode", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *notificationChannelServiceClient) VerifyNotificationChannel(ctx context.Context, in *VerifyNotificationChannelRequest, opts ...grpc.CallOption) (*NotificationChannel, error) { - out := new(NotificationChannel) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.NotificationChannelService/VerifyNotificationChannel", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// NotificationChannelServiceServer is the server API for NotificationChannelService service. -type NotificationChannelServiceServer interface { - // Lists the descriptors for supported channel types. The use of descriptors - // makes it possible for new channel types to be dynamically added. - ListNotificationChannelDescriptors(context.Context, *ListNotificationChannelDescriptorsRequest) (*ListNotificationChannelDescriptorsResponse, error) - // Gets a single channel descriptor. The descriptor indicates which fields - // are expected / permitted for a notification channel of the given type. - GetNotificationChannelDescriptor(context.Context, *GetNotificationChannelDescriptorRequest) (*NotificationChannelDescriptor, error) - // Lists the notification channels that have been created for the project. - ListNotificationChannels(context.Context, *ListNotificationChannelsRequest) (*ListNotificationChannelsResponse, error) - // Gets a single notification channel. The channel includes the relevant - // configuration details with which the channel was created. However, the - // response may truncate or omit passwords, API keys, or other private key - // matter and thus the response may not be 100% identical to the information - // that was supplied in the call to the create method. - GetNotificationChannel(context.Context, *GetNotificationChannelRequest) (*NotificationChannel, error) - // Creates a new notification channel, representing a single notification - // endpoint such as an email address, SMS number, or PagerDuty service. - CreateNotificationChannel(context.Context, *CreateNotificationChannelRequest) (*NotificationChannel, error) - // Updates a notification channel. Fields not specified in the field mask - // remain unchanged. - UpdateNotificationChannel(context.Context, *UpdateNotificationChannelRequest) (*NotificationChannel, error) - // Deletes a notification channel. - DeleteNotificationChannel(context.Context, *DeleteNotificationChannelRequest) (*empty.Empty, error) - // Causes a verification code to be delivered to the channel. The code - // can then be supplied in `VerifyNotificationChannel` to verify the channel. - SendNotificationChannelVerificationCode(context.Context, *SendNotificationChannelVerificationCodeRequest) (*empty.Empty, error) - // Requests a verification code for an already verified channel that can then - // be used in a call to VerifyNotificationChannel() on a different channel - // with an equivalent identity in the same or in a different project. This - // makes it possible to copy a channel between projects without requiring - // manual reverification of the channel. If the channel is not in the - // verified state, this method will fail (in other words, this may only be - // used if the SendNotificationChannelVerificationCode and - // VerifyNotificationChannel paths have already been used to put the given - // channel into the verified state). - // - // There is no guarantee that the verification codes returned by this method - // will be of a similar structure or form as the ones that are delivered - // to the channel via SendNotificationChannelVerificationCode; while - // VerifyNotificationChannel() will recognize both the codes delivered via - // SendNotificationChannelVerificationCode() and returned from - // GetNotificationChannelVerificationCode(), it is typically the case that - // the verification codes delivered via - // SendNotificationChannelVerificationCode() will be shorter and also - // have a shorter expiration (e.g. codes such as "G-123456") whereas - // GetVerificationCode() will typically return a much longer, websafe base - // 64 encoded string that has a longer expiration time. - GetNotificationChannelVerificationCode(context.Context, *GetNotificationChannelVerificationCodeRequest) (*GetNotificationChannelVerificationCodeResponse, error) - // Verifies a `NotificationChannel` by proving receipt of the code - // delivered to the channel as a result of calling - // `SendNotificationChannelVerificationCode`. - VerifyNotificationChannel(context.Context, *VerifyNotificationChannelRequest) (*NotificationChannel, error) -} - -// UnimplementedNotificationChannelServiceServer can be embedded to have forward compatible implementations. -type UnimplementedNotificationChannelServiceServer struct { -} - -func (*UnimplementedNotificationChannelServiceServer) ListNotificationChannelDescriptors(ctx context.Context, req *ListNotificationChannelDescriptorsRequest) (*ListNotificationChannelDescriptorsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListNotificationChannelDescriptors not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) GetNotificationChannelDescriptor(ctx context.Context, req *GetNotificationChannelDescriptorRequest) (*NotificationChannelDescriptor, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannelDescriptor not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) ListNotificationChannels(ctx context.Context, req *ListNotificationChannelsRequest) (*ListNotificationChannelsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListNotificationChannels not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) GetNotificationChannel(ctx context.Context, req *GetNotificationChannelRequest) (*NotificationChannel, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannel not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) CreateNotificationChannel(ctx context.Context, req *CreateNotificationChannelRequest) (*NotificationChannel, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateNotificationChannel not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) UpdateNotificationChannel(ctx context.Context, req *UpdateNotificationChannelRequest) (*NotificationChannel, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateNotificationChannel not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) DeleteNotificationChannel(ctx context.Context, req *DeleteNotificationChannelRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteNotificationChannel not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) SendNotificationChannelVerificationCode(ctx context.Context, req *SendNotificationChannelVerificationCodeRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SendNotificationChannelVerificationCode not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) GetNotificationChannelVerificationCode(ctx context.Context, req *GetNotificationChannelVerificationCodeRequest) (*GetNotificationChannelVerificationCodeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetNotificationChannelVerificationCode not implemented") -} -func (*UnimplementedNotificationChannelServiceServer) VerifyNotificationChannel(ctx context.Context, req *VerifyNotificationChannelRequest) (*NotificationChannel, error) { - return nil, status.Errorf(codes.Unimplemented, "method VerifyNotificationChannel not implemented") -} - -func RegisterNotificationChannelServiceServer(s *grpc.Server, srv NotificationChannelServiceServer) { - s.RegisterService(&_NotificationChannelService_serviceDesc, srv) -} - -func _NotificationChannelService_ListNotificationChannelDescriptors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListNotificationChannelDescriptorsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).ListNotificationChannelDescriptors(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/ListNotificationChannelDescriptors", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).ListNotificationChannelDescriptors(ctx, req.(*ListNotificationChannelDescriptorsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_GetNotificationChannelDescriptor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetNotificationChannelDescriptorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).GetNotificationChannelDescriptor(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelDescriptor", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).GetNotificationChannelDescriptor(ctx, req.(*GetNotificationChannelDescriptorRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_ListNotificationChannels_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListNotificationChannelsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).ListNotificationChannels(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/ListNotificationChannels", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).ListNotificationChannels(ctx, req.(*ListNotificationChannelsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_GetNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetNotificationChannelRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).GetNotificationChannel(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/GetNotificationChannel", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).GetNotificationChannel(ctx, req.(*GetNotificationChannelRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_CreateNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateNotificationChannelRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).CreateNotificationChannel(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/CreateNotificationChannel", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).CreateNotificationChannel(ctx, req.(*CreateNotificationChannelRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_UpdateNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateNotificationChannelRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).UpdateNotificationChannel(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/UpdateNotificationChannel", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).UpdateNotificationChannel(ctx, req.(*UpdateNotificationChannelRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_DeleteNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteNotificationChannelRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).DeleteNotificationChannel(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/DeleteNotificationChannel", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).DeleteNotificationChannel(ctx, req.(*DeleteNotificationChannelRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_SendNotificationChannelVerificationCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SendNotificationChannelVerificationCodeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).SendNotificationChannelVerificationCode(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/SendNotificationChannelVerificationCode", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).SendNotificationChannelVerificationCode(ctx, req.(*SendNotificationChannelVerificationCodeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_GetNotificationChannelVerificationCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetNotificationChannelVerificationCodeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).GetNotificationChannelVerificationCode(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/GetNotificationChannelVerificationCode", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).GetNotificationChannelVerificationCode(ctx, req.(*GetNotificationChannelVerificationCodeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _NotificationChannelService_VerifyNotificationChannel_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(VerifyNotificationChannelRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(NotificationChannelServiceServer).VerifyNotificationChannel(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.NotificationChannelService/VerifyNotificationChannel", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(NotificationChannelServiceServer).VerifyNotificationChannel(ctx, req.(*VerifyNotificationChannelRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _NotificationChannelService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.NotificationChannelService", - HandlerType: (*NotificationChannelServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListNotificationChannelDescriptors", - Handler: _NotificationChannelService_ListNotificationChannelDescriptors_Handler, - }, - { - MethodName: "GetNotificationChannelDescriptor", - Handler: _NotificationChannelService_GetNotificationChannelDescriptor_Handler, - }, - { - MethodName: "ListNotificationChannels", - Handler: _NotificationChannelService_ListNotificationChannels_Handler, - }, - { - MethodName: "GetNotificationChannel", - Handler: _NotificationChannelService_GetNotificationChannel_Handler, - }, - { - MethodName: "CreateNotificationChannel", - Handler: _NotificationChannelService_CreateNotificationChannel_Handler, - }, - { - MethodName: "UpdateNotificationChannel", - Handler: _NotificationChannelService_UpdateNotificationChannel_Handler, - }, - { - MethodName: "DeleteNotificationChannel", - Handler: _NotificationChannelService_DeleteNotificationChannel_Handler, - }, - { - MethodName: "SendNotificationChannelVerificationCode", - Handler: _NotificationChannelService_SendNotificationChannelVerificationCode_Handler, - }, - { - MethodName: "GetNotificationChannelVerificationCode", - Handler: _NotificationChannelService_GetNotificationChannelVerificationCode_Handler, - }, - { - MethodName: "VerifyNotificationChannel", - Handler: _NotificationChannelService_VerifyNotificationChannel_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/notification_service.proto", -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/service.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/service.pb.go deleted file mode 100644 index 498a65f13..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/service.pb.go +++ /dev/null @@ -1,1553 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/service.proto - -package monitoring - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - duration "github.com/golang/protobuf/ptypes/duration" - _ "github.com/golang/protobuf/ptypes/timestamp" - _ "google.golang.org/genproto/googleapis/api/annotations" - _ "google.golang.org/genproto/googleapis/api/monitoredres" - calendarperiod "google.golang.org/genproto/googleapis/type/calendarperiod" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// `ServiceLevelObjective.View` determines what form of -// `ServiceLevelObjective` is returned from `GetServiceLevelObjective`, -// `ListServiceLevelObjectives`, and `ListServiceLevelObjectiveVersions` RPCs. -type ServiceLevelObjective_View int32 - -const ( - // Same as FULL. - ServiceLevelObjective_VIEW_UNSPECIFIED ServiceLevelObjective_View = 0 - // Return the embedded `ServiceLevelIndicator` in the form in which it was - // defined. If it was defined using a `BasicSli`, return that `BasicSli`. - ServiceLevelObjective_FULL ServiceLevelObjective_View = 2 - // For `ServiceLevelIndicator`s using `BasicSli` articulation, instead - // return the `ServiceLevelIndicator` with its mode of computation fully - // spelled out as a `RequestBasedSli`. For `ServiceLevelIndicator`s using - // `RequestBasedSli` or `WindowsBasedSli`, return the - // `ServiceLevelIndicator` as it was provided. - ServiceLevelObjective_EXPLICIT ServiceLevelObjective_View = 1 -) - -var ServiceLevelObjective_View_name = map[int32]string{ - 0: "VIEW_UNSPECIFIED", - 2: "FULL", - 1: "EXPLICIT", -} - -var ServiceLevelObjective_View_value = map[string]int32{ - "VIEW_UNSPECIFIED": 0, - "FULL": 2, - "EXPLICIT": 1, -} - -func (x ServiceLevelObjective_View) String() string { - return proto.EnumName(ServiceLevelObjective_View_name, int32(x)) -} - -func (ServiceLevelObjective_View) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{1, 0} -} - -// A `Service` is a discrete, autonomous, and network-accessible unit, designed -// to solve an individual concern -// ([Wikipedia](https://en.wikipedia.org/wiki/Service-orientation)). In -// Stackdriver Monitoring, a `Service` acts as the root resource under which -// operational aspects of the service are accessible. -type Service struct { - // Resource name for this Service. Of the form - // `projects/{project_id}/services/{service_id}`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Name used for UI elements listing this Service. - DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // REQUIRED. Service-identifying atoms specifying the underlying service. - // - // Types that are valid to be assigned to Identifier: - // *Service_Custom_ - // *Service_AppEngine_ - // *Service_CloudEndpoints_ - // *Service_ClusterIstio_ - Identifier isService_Identifier `protobuf_oneof:"identifier"` - // Configuration for how to query telemetry on a Service. - Telemetry *Service_Telemetry `protobuf:"bytes,13,opt,name=telemetry,proto3" json:"telemetry,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Service) Reset() { *m = Service{} } -func (m *Service) String() string { return proto.CompactTextString(m) } -func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{0} -} - -func (m *Service) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Service.Unmarshal(m, b) -} -func (m *Service) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Service.Marshal(b, m, deterministic) -} -func (m *Service) XXX_Merge(src proto.Message) { - xxx_messageInfo_Service.Merge(m, src) -} -func (m *Service) XXX_Size() int { - return xxx_messageInfo_Service.Size(m) -} -func (m *Service) XXX_DiscardUnknown() { - xxx_messageInfo_Service.DiscardUnknown(m) -} - -var xxx_messageInfo_Service proto.InternalMessageInfo - -func (m *Service) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Service) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -type isService_Identifier interface { - isService_Identifier() -} - -type Service_Custom_ struct { - Custom *Service_Custom `protobuf:"bytes,6,opt,name=custom,proto3,oneof"` -} - -type Service_AppEngine_ struct { - AppEngine *Service_AppEngine `protobuf:"bytes,7,opt,name=app_engine,json=appEngine,proto3,oneof"` -} - -type Service_CloudEndpoints_ struct { - CloudEndpoints *Service_CloudEndpoints `protobuf:"bytes,8,opt,name=cloud_endpoints,json=cloudEndpoints,proto3,oneof"` -} - -type Service_ClusterIstio_ struct { - ClusterIstio *Service_ClusterIstio `protobuf:"bytes,9,opt,name=cluster_istio,json=clusterIstio,proto3,oneof"` -} - -func (*Service_Custom_) isService_Identifier() {} - -func (*Service_AppEngine_) isService_Identifier() {} - -func (*Service_CloudEndpoints_) isService_Identifier() {} - -func (*Service_ClusterIstio_) isService_Identifier() {} - -func (m *Service) GetIdentifier() isService_Identifier { - if m != nil { - return m.Identifier - } - return nil -} - -func (m *Service) GetCustom() *Service_Custom { - if x, ok := m.GetIdentifier().(*Service_Custom_); ok { - return x.Custom - } - return nil -} - -func (m *Service) GetAppEngine() *Service_AppEngine { - if x, ok := m.GetIdentifier().(*Service_AppEngine_); ok { - return x.AppEngine - } - return nil -} - -func (m *Service) GetCloudEndpoints() *Service_CloudEndpoints { - if x, ok := m.GetIdentifier().(*Service_CloudEndpoints_); ok { - return x.CloudEndpoints - } - return nil -} - -func (m *Service) GetClusterIstio() *Service_ClusterIstio { - if x, ok := m.GetIdentifier().(*Service_ClusterIstio_); ok { - return x.ClusterIstio - } - return nil -} - -func (m *Service) GetTelemetry() *Service_Telemetry { - if m != nil { - return m.Telemetry - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Service) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Service_Custom_)(nil), - (*Service_AppEngine_)(nil), - (*Service_CloudEndpoints_)(nil), - (*Service_ClusterIstio_)(nil), - } -} - -// Custom view of service telemetry. Currently a place-holder pending final -// design. -type Service_Custom struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Service_Custom) Reset() { *m = Service_Custom{} } -func (m *Service_Custom) String() string { return proto.CompactTextString(m) } -func (*Service_Custom) ProtoMessage() {} -func (*Service_Custom) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{0, 0} -} - -func (m *Service_Custom) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Service_Custom.Unmarshal(m, b) -} -func (m *Service_Custom) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Service_Custom.Marshal(b, m, deterministic) -} -func (m *Service_Custom) XXX_Merge(src proto.Message) { - xxx_messageInfo_Service_Custom.Merge(m, src) -} -func (m *Service_Custom) XXX_Size() int { - return xxx_messageInfo_Service_Custom.Size(m) -} -func (m *Service_Custom) XXX_DiscardUnknown() { - xxx_messageInfo_Service_Custom.DiscardUnknown(m) -} - -var xxx_messageInfo_Service_Custom proto.InternalMessageInfo - -// App Engine service. Learn more at https://cloud.google.com/appengine. -type Service_AppEngine struct { - // The ID of the App Engine module underlying this service. Corresponds to - // the `module_id` resource label in the `gae_app` monitored resource: - // https://cloud.google.com/monitoring/api/resources#tag_gae_app - ModuleId string `protobuf:"bytes,1,opt,name=module_id,json=moduleId,proto3" json:"module_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Service_AppEngine) Reset() { *m = Service_AppEngine{} } -func (m *Service_AppEngine) String() string { return proto.CompactTextString(m) } -func (*Service_AppEngine) ProtoMessage() {} -func (*Service_AppEngine) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{0, 1} -} - -func (m *Service_AppEngine) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Service_AppEngine.Unmarshal(m, b) -} -func (m *Service_AppEngine) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Service_AppEngine.Marshal(b, m, deterministic) -} -func (m *Service_AppEngine) XXX_Merge(src proto.Message) { - xxx_messageInfo_Service_AppEngine.Merge(m, src) -} -func (m *Service_AppEngine) XXX_Size() int { - return xxx_messageInfo_Service_AppEngine.Size(m) -} -func (m *Service_AppEngine) XXX_DiscardUnknown() { - xxx_messageInfo_Service_AppEngine.DiscardUnknown(m) -} - -var xxx_messageInfo_Service_AppEngine proto.InternalMessageInfo - -func (m *Service_AppEngine) GetModuleId() string { - if m != nil { - return m.ModuleId - } - return "" -} - -// Cloud Endpoints service. Learn more at https://cloud.google.com/endpoints. -type Service_CloudEndpoints struct { - // The name of the Cloud Endpoints service underlying this service. - // Corresponds to the `service` resource label in the `api` monitored - // resource: https://cloud.google.com/monitoring/api/resources#tag_api - Service string `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Service_CloudEndpoints) Reset() { *m = Service_CloudEndpoints{} } -func (m *Service_CloudEndpoints) String() string { return proto.CompactTextString(m) } -func (*Service_CloudEndpoints) ProtoMessage() {} -func (*Service_CloudEndpoints) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{0, 2} -} - -func (m *Service_CloudEndpoints) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Service_CloudEndpoints.Unmarshal(m, b) -} -func (m *Service_CloudEndpoints) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Service_CloudEndpoints.Marshal(b, m, deterministic) -} -func (m *Service_CloudEndpoints) XXX_Merge(src proto.Message) { - xxx_messageInfo_Service_CloudEndpoints.Merge(m, src) -} -func (m *Service_CloudEndpoints) XXX_Size() int { - return xxx_messageInfo_Service_CloudEndpoints.Size(m) -} -func (m *Service_CloudEndpoints) XXX_DiscardUnknown() { - xxx_messageInfo_Service_CloudEndpoints.DiscardUnknown(m) -} - -var xxx_messageInfo_Service_CloudEndpoints proto.InternalMessageInfo - -func (m *Service_CloudEndpoints) GetService() string { - if m != nil { - return m.Service - } - return "" -} - -// Istio service. Learn more at http://istio.io. -type Service_ClusterIstio struct { - // The location of the Kubernetes cluster in which this Istio service is - // defined. Corresponds to the `location` resource label in `k8s_cluster` - // resources. - Location string `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"` - // The name of the Kubernetes cluster in which this Istio service is - // defined. Corresponds to the `cluster_name` resource label in - // `k8s_cluster` resources. - ClusterName string `protobuf:"bytes,2,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` - // The namespace of the Istio service underlying this service. Corresponds - // to the `destination_service_namespace` metric label in Istio metrics. - ServiceNamespace string `protobuf:"bytes,3,opt,name=service_namespace,json=serviceNamespace,proto3" json:"service_namespace,omitempty"` - // The name of the Istio service underlying this service. Corresponds to the - // `destination_service_name` metric label in Istio metrics. - ServiceName string `protobuf:"bytes,4,opt,name=service_name,json=serviceName,proto3" json:"service_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Service_ClusterIstio) Reset() { *m = Service_ClusterIstio{} } -func (m *Service_ClusterIstio) String() string { return proto.CompactTextString(m) } -func (*Service_ClusterIstio) ProtoMessage() {} -func (*Service_ClusterIstio) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{0, 3} -} - -func (m *Service_ClusterIstio) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Service_ClusterIstio.Unmarshal(m, b) -} -func (m *Service_ClusterIstio) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Service_ClusterIstio.Marshal(b, m, deterministic) -} -func (m *Service_ClusterIstio) XXX_Merge(src proto.Message) { - xxx_messageInfo_Service_ClusterIstio.Merge(m, src) -} -func (m *Service_ClusterIstio) XXX_Size() int { - return xxx_messageInfo_Service_ClusterIstio.Size(m) -} -func (m *Service_ClusterIstio) XXX_DiscardUnknown() { - xxx_messageInfo_Service_ClusterIstio.DiscardUnknown(m) -} - -var xxx_messageInfo_Service_ClusterIstio proto.InternalMessageInfo - -func (m *Service_ClusterIstio) GetLocation() string { - if m != nil { - return m.Location - } - return "" -} - -func (m *Service_ClusterIstio) GetClusterName() string { - if m != nil { - return m.ClusterName - } - return "" -} - -func (m *Service_ClusterIstio) GetServiceNamespace() string { - if m != nil { - return m.ServiceNamespace - } - return "" -} - -func (m *Service_ClusterIstio) GetServiceName() string { - if m != nil { - return m.ServiceName - } - return "" -} - -// Configuration for how to query telemetry on a Service. -type Service_Telemetry struct { - // The full name of the resource that defines this service. Formatted as - // described in https://cloud.google.com/apis/design/resource_names. - ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Service_Telemetry) Reset() { *m = Service_Telemetry{} } -func (m *Service_Telemetry) String() string { return proto.CompactTextString(m) } -func (*Service_Telemetry) ProtoMessage() {} -func (*Service_Telemetry) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{0, 4} -} - -func (m *Service_Telemetry) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Service_Telemetry.Unmarshal(m, b) -} -func (m *Service_Telemetry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Service_Telemetry.Marshal(b, m, deterministic) -} -func (m *Service_Telemetry) XXX_Merge(src proto.Message) { - xxx_messageInfo_Service_Telemetry.Merge(m, src) -} -func (m *Service_Telemetry) XXX_Size() int { - return xxx_messageInfo_Service_Telemetry.Size(m) -} -func (m *Service_Telemetry) XXX_DiscardUnknown() { - xxx_messageInfo_Service_Telemetry.DiscardUnknown(m) -} - -var xxx_messageInfo_Service_Telemetry proto.InternalMessageInfo - -func (m *Service_Telemetry) GetResourceName() string { - if m != nil { - return m.ResourceName - } - return "" -} - -// A Service-Level Objective (SLO) describes a level of desired good service. It -// consists of a service-level indicator (SLI), a performance goal, and a period -// over which the objective is to be evaluated against that goal. The SLO can -// use SLIs defined in a number of different manners. Typical SLOs might include -// "99% of requests in each rolling week have latency below 200 milliseconds" or -// "99.5% of requests in each calendar month return successfully." -type ServiceLevelObjective struct { - // Resource name for this `ServiceLevelObjective`. - // Of the form - // `projects/{project_id}/services/{service_id}/serviceLevelObjectives/{slo_name}`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Name used for UI elements listing this SLO. - DisplayName string `protobuf:"bytes,11,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // The definition of good service, used to measure and calculate the quality - // of the `Service`'s performance with respect to a single aspect of service - // quality. - ServiceLevelIndicator *ServiceLevelIndicator `protobuf:"bytes,3,opt,name=service_level_indicator,json=serviceLevelIndicator,proto3" json:"service_level_indicator,omitempty"` - // The fraction of service that must be good in order for this objective to be - // met. `0 < goal <= 0.999`. - Goal float64 `protobuf:"fixed64,4,opt,name=goal,proto3" json:"goal,omitempty"` - // The time period over which the objective will be evaluated. - // - // Types that are valid to be assigned to Period: - // *ServiceLevelObjective_RollingPeriod - // *ServiceLevelObjective_CalendarPeriod - Period isServiceLevelObjective_Period `protobuf_oneof:"period"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ServiceLevelObjective) Reset() { *m = ServiceLevelObjective{} } -func (m *ServiceLevelObjective) String() string { return proto.CompactTextString(m) } -func (*ServiceLevelObjective) ProtoMessage() {} -func (*ServiceLevelObjective) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{1} -} - -func (m *ServiceLevelObjective) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ServiceLevelObjective.Unmarshal(m, b) -} -func (m *ServiceLevelObjective) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ServiceLevelObjective.Marshal(b, m, deterministic) -} -func (m *ServiceLevelObjective) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceLevelObjective.Merge(m, src) -} -func (m *ServiceLevelObjective) XXX_Size() int { - return xxx_messageInfo_ServiceLevelObjective.Size(m) -} -func (m *ServiceLevelObjective) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceLevelObjective.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceLevelObjective proto.InternalMessageInfo - -func (m *ServiceLevelObjective) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ServiceLevelObjective) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -func (m *ServiceLevelObjective) GetServiceLevelIndicator() *ServiceLevelIndicator { - if m != nil { - return m.ServiceLevelIndicator - } - return nil -} - -func (m *ServiceLevelObjective) GetGoal() float64 { - if m != nil { - return m.Goal - } - return 0 -} - -type isServiceLevelObjective_Period interface { - isServiceLevelObjective_Period() -} - -type ServiceLevelObjective_RollingPeriod struct { - RollingPeriod *duration.Duration `protobuf:"bytes,5,opt,name=rolling_period,json=rollingPeriod,proto3,oneof"` -} - -type ServiceLevelObjective_CalendarPeriod struct { - CalendarPeriod calendarperiod.CalendarPeriod `protobuf:"varint,6,opt,name=calendar_period,json=calendarPeriod,proto3,enum=google.type.CalendarPeriod,oneof"` -} - -func (*ServiceLevelObjective_RollingPeriod) isServiceLevelObjective_Period() {} - -func (*ServiceLevelObjective_CalendarPeriod) isServiceLevelObjective_Period() {} - -func (m *ServiceLevelObjective) GetPeriod() isServiceLevelObjective_Period { - if m != nil { - return m.Period - } - return nil -} - -func (m *ServiceLevelObjective) GetRollingPeriod() *duration.Duration { - if x, ok := m.GetPeriod().(*ServiceLevelObjective_RollingPeriod); ok { - return x.RollingPeriod - } - return nil -} - -func (m *ServiceLevelObjective) GetCalendarPeriod() calendarperiod.CalendarPeriod { - if x, ok := m.GetPeriod().(*ServiceLevelObjective_CalendarPeriod); ok { - return x.CalendarPeriod - } - return calendarperiod.CalendarPeriod_CALENDAR_PERIOD_UNSPECIFIED -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*ServiceLevelObjective) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*ServiceLevelObjective_RollingPeriod)(nil), - (*ServiceLevelObjective_CalendarPeriod)(nil), - } -} - -// A Service-Level Indicator (SLI) describes the "performance" of a service. For -// some services, the SLI is well-defined. In such cases, the SLI can be -// described easily by referencing the well-known SLI and providing the needed -// parameters. Alternatively, a "custom" SLI can be defined with a query to the -// underlying metric store. An SLI is defined to be `good_service / -// total_service` over any queried time interval. The value of performance -// always falls into the range `0 <= performance <= 1`. A custom SLI describes -// how to compute this ratio, whether this is by dividing values from a pair of -// time series, cutting a `Distribution` into good and bad counts, or counting -// time windows in which the service complies with a criterion. For separation -// of concerns, a single Service-Level Indicator measures performance for only -// one aspect of service quality, such as fraction of successful queries or -// fast-enough queries. -type ServiceLevelIndicator struct { - // Service level indicators can be grouped by whether the "unit" of service - // being measured is based on counts of good requests or on counts of good - // time windows - // - // Types that are valid to be assigned to Type: - // *ServiceLevelIndicator_BasicSli - // *ServiceLevelIndicator_RequestBased - // *ServiceLevelIndicator_WindowsBased - Type isServiceLevelIndicator_Type `protobuf_oneof:"type"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ServiceLevelIndicator) Reset() { *m = ServiceLevelIndicator{} } -func (m *ServiceLevelIndicator) String() string { return proto.CompactTextString(m) } -func (*ServiceLevelIndicator) ProtoMessage() {} -func (*ServiceLevelIndicator) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{2} -} - -func (m *ServiceLevelIndicator) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ServiceLevelIndicator.Unmarshal(m, b) -} -func (m *ServiceLevelIndicator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ServiceLevelIndicator.Marshal(b, m, deterministic) -} -func (m *ServiceLevelIndicator) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServiceLevelIndicator.Merge(m, src) -} -func (m *ServiceLevelIndicator) XXX_Size() int { - return xxx_messageInfo_ServiceLevelIndicator.Size(m) -} -func (m *ServiceLevelIndicator) XXX_DiscardUnknown() { - xxx_messageInfo_ServiceLevelIndicator.DiscardUnknown(m) -} - -var xxx_messageInfo_ServiceLevelIndicator proto.InternalMessageInfo - -type isServiceLevelIndicator_Type interface { - isServiceLevelIndicator_Type() -} - -type ServiceLevelIndicator_BasicSli struct { - BasicSli *BasicSli `protobuf:"bytes,4,opt,name=basic_sli,json=basicSli,proto3,oneof"` -} - -type ServiceLevelIndicator_RequestBased struct { - RequestBased *RequestBasedSli `protobuf:"bytes,1,opt,name=request_based,json=requestBased,proto3,oneof"` -} - -type ServiceLevelIndicator_WindowsBased struct { - WindowsBased *WindowsBasedSli `protobuf:"bytes,2,opt,name=windows_based,json=windowsBased,proto3,oneof"` -} - -func (*ServiceLevelIndicator_BasicSli) isServiceLevelIndicator_Type() {} - -func (*ServiceLevelIndicator_RequestBased) isServiceLevelIndicator_Type() {} - -func (*ServiceLevelIndicator_WindowsBased) isServiceLevelIndicator_Type() {} - -func (m *ServiceLevelIndicator) GetType() isServiceLevelIndicator_Type { - if m != nil { - return m.Type - } - return nil -} - -func (m *ServiceLevelIndicator) GetBasicSli() *BasicSli { - if x, ok := m.GetType().(*ServiceLevelIndicator_BasicSli); ok { - return x.BasicSli - } - return nil -} - -func (m *ServiceLevelIndicator) GetRequestBased() *RequestBasedSli { - if x, ok := m.GetType().(*ServiceLevelIndicator_RequestBased); ok { - return x.RequestBased - } - return nil -} - -func (m *ServiceLevelIndicator) GetWindowsBased() *WindowsBasedSli { - if x, ok := m.GetType().(*ServiceLevelIndicator_WindowsBased); ok { - return x.WindowsBased - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*ServiceLevelIndicator) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*ServiceLevelIndicator_BasicSli)(nil), - (*ServiceLevelIndicator_RequestBased)(nil), - (*ServiceLevelIndicator_WindowsBased)(nil), - } -} - -// An SLI measuring performance on a well-known service type. Performance will -// be computed on the basis of pre-defined metrics. The type of the -// `service_resource` determines the metrics to use and the -// `service_resource.labels` and `metric_labels` are used to construct a -// monitoring filter to filter that metric down to just the data relevant to -// this service. -type BasicSli struct { - // OPTIONAL: The set of RPCs to which this SLI is relevant. Telemetry from - // other methods will not be used to calculate performance for this SLI. If - // omitted, this SLI applies to all the Service's methods. For service types - // that don't support breaking down by method, setting this field will result - // in an error. - Method []string `protobuf:"bytes,7,rep,name=method,proto3" json:"method,omitempty"` - // OPTIONAL: The set of locations to which this SLI is relevant. Telemetry - // from other locations will not be used to calculate performance for this - // SLI. If omitted, this SLI applies to all locations in which the Service has - // activity. For service types that don't support breaking down by location, - // setting this field will result in an error. - Location []string `protobuf:"bytes,8,rep,name=location,proto3" json:"location,omitempty"` - // OPTIONAL: The set of API versions to which this SLI is relevant. Telemetry - // from other API versions will not be used to calculate performance for this - // SLI. If omitted, this SLI applies to all API versions. For service types - // that don't support breaking down by version, setting this field will result - // in an error. - Version []string `protobuf:"bytes,9,rep,name=version,proto3" json:"version,omitempty"` - // This SLI can be evaluated on the basis of availability or latency. - // - // Types that are valid to be assigned to SliCriteria: - // *BasicSli_Availability - // *BasicSli_Latency - SliCriteria isBasicSli_SliCriteria `protobuf_oneof:"sli_criteria"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BasicSli) Reset() { *m = BasicSli{} } -func (m *BasicSli) String() string { return proto.CompactTextString(m) } -func (*BasicSli) ProtoMessage() {} -func (*BasicSli) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{3} -} - -func (m *BasicSli) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BasicSli.Unmarshal(m, b) -} -func (m *BasicSli) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BasicSli.Marshal(b, m, deterministic) -} -func (m *BasicSli) XXX_Merge(src proto.Message) { - xxx_messageInfo_BasicSli.Merge(m, src) -} -func (m *BasicSli) XXX_Size() int { - return xxx_messageInfo_BasicSli.Size(m) -} -func (m *BasicSli) XXX_DiscardUnknown() { - xxx_messageInfo_BasicSli.DiscardUnknown(m) -} - -var xxx_messageInfo_BasicSli proto.InternalMessageInfo - -func (m *BasicSli) GetMethod() []string { - if m != nil { - return m.Method - } - return nil -} - -func (m *BasicSli) GetLocation() []string { - if m != nil { - return m.Location - } - return nil -} - -func (m *BasicSli) GetVersion() []string { - if m != nil { - return m.Version - } - return nil -} - -type isBasicSli_SliCriteria interface { - isBasicSli_SliCriteria() -} - -type BasicSli_Availability struct { - Availability *BasicSli_AvailabilityCriteria `protobuf:"bytes,2,opt,name=availability,proto3,oneof"` -} - -type BasicSli_Latency struct { - Latency *BasicSli_LatencyCriteria `protobuf:"bytes,3,opt,name=latency,proto3,oneof"` -} - -func (*BasicSli_Availability) isBasicSli_SliCriteria() {} - -func (*BasicSli_Latency) isBasicSli_SliCriteria() {} - -func (m *BasicSli) GetSliCriteria() isBasicSli_SliCriteria { - if m != nil { - return m.SliCriteria - } - return nil -} - -func (m *BasicSli) GetAvailability() *BasicSli_AvailabilityCriteria { - if x, ok := m.GetSliCriteria().(*BasicSli_Availability); ok { - return x.Availability - } - return nil -} - -func (m *BasicSli) GetLatency() *BasicSli_LatencyCriteria { - if x, ok := m.GetSliCriteria().(*BasicSli_Latency); ok { - return x.Latency - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*BasicSli) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*BasicSli_Availability)(nil), - (*BasicSli_Latency)(nil), - } -} - -// Future parameters for the availability SLI. -type BasicSli_AvailabilityCriteria struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BasicSli_AvailabilityCriteria) Reset() { *m = BasicSli_AvailabilityCriteria{} } -func (m *BasicSli_AvailabilityCriteria) String() string { return proto.CompactTextString(m) } -func (*BasicSli_AvailabilityCriteria) ProtoMessage() {} -func (*BasicSli_AvailabilityCriteria) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{3, 0} -} - -func (m *BasicSli_AvailabilityCriteria) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BasicSli_AvailabilityCriteria.Unmarshal(m, b) -} -func (m *BasicSli_AvailabilityCriteria) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BasicSli_AvailabilityCriteria.Marshal(b, m, deterministic) -} -func (m *BasicSli_AvailabilityCriteria) XXX_Merge(src proto.Message) { - xxx_messageInfo_BasicSli_AvailabilityCriteria.Merge(m, src) -} -func (m *BasicSli_AvailabilityCriteria) XXX_Size() int { - return xxx_messageInfo_BasicSli_AvailabilityCriteria.Size(m) -} -func (m *BasicSli_AvailabilityCriteria) XXX_DiscardUnknown() { - xxx_messageInfo_BasicSli_AvailabilityCriteria.DiscardUnknown(m) -} - -var xxx_messageInfo_BasicSli_AvailabilityCriteria proto.InternalMessageInfo - -// Parameters for a latency threshold SLI. -type BasicSli_LatencyCriteria struct { - // Good service is defined to be the count of requests made to this service - // that return in no more than `threshold`. - Threshold *duration.Duration `protobuf:"bytes,3,opt,name=threshold,proto3" json:"threshold,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BasicSli_LatencyCriteria) Reset() { *m = BasicSli_LatencyCriteria{} } -func (m *BasicSli_LatencyCriteria) String() string { return proto.CompactTextString(m) } -func (*BasicSli_LatencyCriteria) ProtoMessage() {} -func (*BasicSli_LatencyCriteria) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{3, 1} -} - -func (m *BasicSli_LatencyCriteria) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BasicSli_LatencyCriteria.Unmarshal(m, b) -} -func (m *BasicSli_LatencyCriteria) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BasicSli_LatencyCriteria.Marshal(b, m, deterministic) -} -func (m *BasicSli_LatencyCriteria) XXX_Merge(src proto.Message) { - xxx_messageInfo_BasicSli_LatencyCriteria.Merge(m, src) -} -func (m *BasicSli_LatencyCriteria) XXX_Size() int { - return xxx_messageInfo_BasicSli_LatencyCriteria.Size(m) -} -func (m *BasicSli_LatencyCriteria) XXX_DiscardUnknown() { - xxx_messageInfo_BasicSli_LatencyCriteria.DiscardUnknown(m) -} - -var xxx_messageInfo_BasicSli_LatencyCriteria proto.InternalMessageInfo - -func (m *BasicSli_LatencyCriteria) GetThreshold() *duration.Duration { - if m != nil { - return m.Threshold - } - return nil -} - -// Range of numerical values, inclusive of `min` and exclusive of `max`. If the -// open range "< range.max" is desired, set `range.min = -infinity`. If the open -// range ">= range.min" is desired, set `range.max = infinity`. -type Range struct { - // Range minimum. - Min float64 `protobuf:"fixed64,1,opt,name=min,proto3" json:"min,omitempty"` - // Range maximum. - Max float64 `protobuf:"fixed64,2,opt,name=max,proto3" json:"max,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Range) Reset() { *m = Range{} } -func (m *Range) String() string { return proto.CompactTextString(m) } -func (*Range) ProtoMessage() {} -func (*Range) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{4} -} - -func (m *Range) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Range.Unmarshal(m, b) -} -func (m *Range) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Range.Marshal(b, m, deterministic) -} -func (m *Range) XXX_Merge(src proto.Message) { - xxx_messageInfo_Range.Merge(m, src) -} -func (m *Range) XXX_Size() int { - return xxx_messageInfo_Range.Size(m) -} -func (m *Range) XXX_DiscardUnknown() { - xxx_messageInfo_Range.DiscardUnknown(m) -} - -var xxx_messageInfo_Range proto.InternalMessageInfo - -func (m *Range) GetMin() float64 { - if m != nil { - return m.Min - } - return 0 -} - -func (m *Range) GetMax() float64 { - if m != nil { - return m.Max - } - return 0 -} - -// Service Level Indicators for which atomic units of service are counted -// directly. -type RequestBasedSli struct { - // The means to compute a ratio of `good_service` to `total_service`. - // - // Types that are valid to be assigned to Method: - // *RequestBasedSli_GoodTotalRatio - // *RequestBasedSli_DistributionCut - Method isRequestBasedSli_Method `protobuf_oneof:"method"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RequestBasedSli) Reset() { *m = RequestBasedSli{} } -func (m *RequestBasedSli) String() string { return proto.CompactTextString(m) } -func (*RequestBasedSli) ProtoMessage() {} -func (*RequestBasedSli) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{5} -} - -func (m *RequestBasedSli) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RequestBasedSli.Unmarshal(m, b) -} -func (m *RequestBasedSli) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RequestBasedSli.Marshal(b, m, deterministic) -} -func (m *RequestBasedSli) XXX_Merge(src proto.Message) { - xxx_messageInfo_RequestBasedSli.Merge(m, src) -} -func (m *RequestBasedSli) XXX_Size() int { - return xxx_messageInfo_RequestBasedSli.Size(m) -} -func (m *RequestBasedSli) XXX_DiscardUnknown() { - xxx_messageInfo_RequestBasedSli.DiscardUnknown(m) -} - -var xxx_messageInfo_RequestBasedSli proto.InternalMessageInfo - -type isRequestBasedSli_Method interface { - isRequestBasedSli_Method() -} - -type RequestBasedSli_GoodTotalRatio struct { - GoodTotalRatio *TimeSeriesRatio `protobuf:"bytes,1,opt,name=good_total_ratio,json=goodTotalRatio,proto3,oneof"` -} - -type RequestBasedSli_DistributionCut struct { - DistributionCut *DistributionCut `protobuf:"bytes,3,opt,name=distribution_cut,json=distributionCut,proto3,oneof"` -} - -func (*RequestBasedSli_GoodTotalRatio) isRequestBasedSli_Method() {} - -func (*RequestBasedSli_DistributionCut) isRequestBasedSli_Method() {} - -func (m *RequestBasedSli) GetMethod() isRequestBasedSli_Method { - if m != nil { - return m.Method - } - return nil -} - -func (m *RequestBasedSli) GetGoodTotalRatio() *TimeSeriesRatio { - if x, ok := m.GetMethod().(*RequestBasedSli_GoodTotalRatio); ok { - return x.GoodTotalRatio - } - return nil -} - -func (m *RequestBasedSli) GetDistributionCut() *DistributionCut { - if x, ok := m.GetMethod().(*RequestBasedSli_DistributionCut); ok { - return x.DistributionCut - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*RequestBasedSli) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*RequestBasedSli_GoodTotalRatio)(nil), - (*RequestBasedSli_DistributionCut)(nil), - } -} - -// A `TimeSeriesRatio` specifies two `TimeSeries` to use for computing the -// `good_service / total_service` ratio. The specified `TimeSeries` must have -// `ValueType = DOUBLE` or `ValueType = INT64` and must have `MetricKind = -// DELTA` or `MetricKind = CUMULATIVE`. The `TimeSeriesRatio` must specify -// exactly two of good, bad, and total, and the relationship `good_service + -// bad_service = total_service` will be assumed. -type TimeSeriesRatio struct { - // A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) - // specifying a `TimeSeries` quantifying good service provided. Must have - // `ValueType = DOUBLE` or `ValueType = INT64` and must have `MetricKind = - // DELTA` or `MetricKind = CUMULATIVE`. - GoodServiceFilter string `protobuf:"bytes,4,opt,name=good_service_filter,json=goodServiceFilter,proto3" json:"good_service_filter,omitempty"` - // A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) - // specifying a `TimeSeries` quantifying bad service, either demanded service - // that was not provided or demanded service that was of inadequate quality. - // Must have `ValueType = DOUBLE` or `ValueType = INT64` and must have - // `MetricKind = DELTA` or `MetricKind = CUMULATIVE`. - BadServiceFilter string `protobuf:"bytes,5,opt,name=bad_service_filter,json=badServiceFilter,proto3" json:"bad_service_filter,omitempty"` - // A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) - // specifying a `TimeSeries` quantifying total demanded service. Must have - // `ValueType = DOUBLE` or `ValueType = INT64` and must have `MetricKind = - // DELTA` or `MetricKind = CUMULATIVE`. - TotalServiceFilter string `protobuf:"bytes,6,opt,name=total_service_filter,json=totalServiceFilter,proto3" json:"total_service_filter,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TimeSeriesRatio) Reset() { *m = TimeSeriesRatio{} } -func (m *TimeSeriesRatio) String() string { return proto.CompactTextString(m) } -func (*TimeSeriesRatio) ProtoMessage() {} -func (*TimeSeriesRatio) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{6} -} - -func (m *TimeSeriesRatio) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_TimeSeriesRatio.Unmarshal(m, b) -} -func (m *TimeSeriesRatio) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_TimeSeriesRatio.Marshal(b, m, deterministic) -} -func (m *TimeSeriesRatio) XXX_Merge(src proto.Message) { - xxx_messageInfo_TimeSeriesRatio.Merge(m, src) -} -func (m *TimeSeriesRatio) XXX_Size() int { - return xxx_messageInfo_TimeSeriesRatio.Size(m) -} -func (m *TimeSeriesRatio) XXX_DiscardUnknown() { - xxx_messageInfo_TimeSeriesRatio.DiscardUnknown(m) -} - -var xxx_messageInfo_TimeSeriesRatio proto.InternalMessageInfo - -func (m *TimeSeriesRatio) GetGoodServiceFilter() string { - if m != nil { - return m.GoodServiceFilter - } - return "" -} - -func (m *TimeSeriesRatio) GetBadServiceFilter() string { - if m != nil { - return m.BadServiceFilter - } - return "" -} - -func (m *TimeSeriesRatio) GetTotalServiceFilter() string { - if m != nil { - return m.TotalServiceFilter - } - return "" -} - -// A `DistributionCut` defines a `TimeSeries` and thresholds used for measuring -// good service and total service. The `TimeSeries` must have `ValueType = -// DISTRIBUTION` and `MetricKind = DELTA` or `MetricKind = CUMULATIVE`. The -// computed `good_service` will be the count of values x in the `Distribution` -// such that `range.min <= x < range.max`. -type DistributionCut struct { - // A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) - // specifying a `TimeSeries` aggregating values. Must have `ValueType = - // DISTRIBUTION` and `MetricKind = DELTA` or `MetricKind = CUMULATIVE`. - DistributionFilter string `protobuf:"bytes,4,opt,name=distribution_filter,json=distributionFilter,proto3" json:"distribution_filter,omitempty"` - // Range of values considered "good." For a one-sided range, set one bound to - // an infinite value. - Range *Range `protobuf:"bytes,5,opt,name=range,proto3" json:"range,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DistributionCut) Reset() { *m = DistributionCut{} } -func (m *DistributionCut) String() string { return proto.CompactTextString(m) } -func (*DistributionCut) ProtoMessage() {} -func (*DistributionCut) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{7} -} - -func (m *DistributionCut) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DistributionCut.Unmarshal(m, b) -} -func (m *DistributionCut) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DistributionCut.Marshal(b, m, deterministic) -} -func (m *DistributionCut) XXX_Merge(src proto.Message) { - xxx_messageInfo_DistributionCut.Merge(m, src) -} -func (m *DistributionCut) XXX_Size() int { - return xxx_messageInfo_DistributionCut.Size(m) -} -func (m *DistributionCut) XXX_DiscardUnknown() { - xxx_messageInfo_DistributionCut.DiscardUnknown(m) -} - -var xxx_messageInfo_DistributionCut proto.InternalMessageInfo - -func (m *DistributionCut) GetDistributionFilter() string { - if m != nil { - return m.DistributionFilter - } - return "" -} - -func (m *DistributionCut) GetRange() *Range { - if m != nil { - return m.Range - } - return nil -} - -// A `WindowsBasedSli` defines `good_service` as the count of time windows for -// which the provided service was of good quality. Criteria for determining -// if service was good are embedded in the `window_criterion`. -type WindowsBasedSli struct { - // The criterion to use for evaluating window goodness. - // - // Types that are valid to be assigned to WindowCriterion: - // *WindowsBasedSli_GoodBadMetricFilter - // *WindowsBasedSli_GoodTotalRatioThreshold - // *WindowsBasedSli_MetricMeanInRange - // *WindowsBasedSli_MetricSumInRange - WindowCriterion isWindowsBasedSli_WindowCriterion `protobuf_oneof:"window_criterion"` - // Duration over which window quality is evaluated. Must be an integer - // fraction of a day and at least `60s`. - WindowPeriod *duration.Duration `protobuf:"bytes,4,opt,name=window_period,json=windowPeriod,proto3" json:"window_period,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *WindowsBasedSli) Reset() { *m = WindowsBasedSli{} } -func (m *WindowsBasedSli) String() string { return proto.CompactTextString(m) } -func (*WindowsBasedSli) ProtoMessage() {} -func (*WindowsBasedSli) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{8} -} - -func (m *WindowsBasedSli) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_WindowsBasedSli.Unmarshal(m, b) -} -func (m *WindowsBasedSli) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_WindowsBasedSli.Marshal(b, m, deterministic) -} -func (m *WindowsBasedSli) XXX_Merge(src proto.Message) { - xxx_messageInfo_WindowsBasedSli.Merge(m, src) -} -func (m *WindowsBasedSli) XXX_Size() int { - return xxx_messageInfo_WindowsBasedSli.Size(m) -} -func (m *WindowsBasedSli) XXX_DiscardUnknown() { - xxx_messageInfo_WindowsBasedSli.DiscardUnknown(m) -} - -var xxx_messageInfo_WindowsBasedSli proto.InternalMessageInfo - -type isWindowsBasedSli_WindowCriterion interface { - isWindowsBasedSli_WindowCriterion() -} - -type WindowsBasedSli_GoodBadMetricFilter struct { - GoodBadMetricFilter string `protobuf:"bytes,5,opt,name=good_bad_metric_filter,json=goodBadMetricFilter,proto3,oneof"` -} - -type WindowsBasedSli_GoodTotalRatioThreshold struct { - GoodTotalRatioThreshold *WindowsBasedSli_PerformanceThreshold `protobuf:"bytes,2,opt,name=good_total_ratio_threshold,json=goodTotalRatioThreshold,proto3,oneof"` -} - -type WindowsBasedSli_MetricMeanInRange struct { - MetricMeanInRange *WindowsBasedSli_MetricRange `protobuf:"bytes,6,opt,name=metric_mean_in_range,json=metricMeanInRange,proto3,oneof"` -} - -type WindowsBasedSli_MetricSumInRange struct { - MetricSumInRange *WindowsBasedSli_MetricRange `protobuf:"bytes,7,opt,name=metric_sum_in_range,json=metricSumInRange,proto3,oneof"` -} - -func (*WindowsBasedSli_GoodBadMetricFilter) isWindowsBasedSli_WindowCriterion() {} - -func (*WindowsBasedSli_GoodTotalRatioThreshold) isWindowsBasedSli_WindowCriterion() {} - -func (*WindowsBasedSli_MetricMeanInRange) isWindowsBasedSli_WindowCriterion() {} - -func (*WindowsBasedSli_MetricSumInRange) isWindowsBasedSli_WindowCriterion() {} - -func (m *WindowsBasedSli) GetWindowCriterion() isWindowsBasedSli_WindowCriterion { - if m != nil { - return m.WindowCriterion - } - return nil -} - -func (m *WindowsBasedSli) GetGoodBadMetricFilter() string { - if x, ok := m.GetWindowCriterion().(*WindowsBasedSli_GoodBadMetricFilter); ok { - return x.GoodBadMetricFilter - } - return "" -} - -func (m *WindowsBasedSli) GetGoodTotalRatioThreshold() *WindowsBasedSli_PerformanceThreshold { - if x, ok := m.GetWindowCriterion().(*WindowsBasedSli_GoodTotalRatioThreshold); ok { - return x.GoodTotalRatioThreshold - } - return nil -} - -func (m *WindowsBasedSli) GetMetricMeanInRange() *WindowsBasedSli_MetricRange { - if x, ok := m.GetWindowCriterion().(*WindowsBasedSli_MetricMeanInRange); ok { - return x.MetricMeanInRange - } - return nil -} - -func (m *WindowsBasedSli) GetMetricSumInRange() *WindowsBasedSli_MetricRange { - if x, ok := m.GetWindowCriterion().(*WindowsBasedSli_MetricSumInRange); ok { - return x.MetricSumInRange - } - return nil -} - -func (m *WindowsBasedSli) GetWindowPeriod() *duration.Duration { - if m != nil { - return m.WindowPeriod - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*WindowsBasedSli) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*WindowsBasedSli_GoodBadMetricFilter)(nil), - (*WindowsBasedSli_GoodTotalRatioThreshold)(nil), - (*WindowsBasedSli_MetricMeanInRange)(nil), - (*WindowsBasedSli_MetricSumInRange)(nil), - } -} - -// A `PerformanceThreshold` is used when each window is good when that window -// has a sufficiently high `performance`. -type WindowsBasedSli_PerformanceThreshold struct { - // The means, either a request-based SLI or a basic SLI, by which to compute - // performance over a window. - // - // Types that are valid to be assigned to Type: - // *WindowsBasedSli_PerformanceThreshold_Performance - // *WindowsBasedSli_PerformanceThreshold_BasicSliPerformance - Type isWindowsBasedSli_PerformanceThreshold_Type `protobuf_oneof:"type"` - // If window `performance >= threshold`, the window is counted as good. - Threshold float64 `protobuf:"fixed64,2,opt,name=threshold,proto3" json:"threshold,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *WindowsBasedSli_PerformanceThreshold) Reset() { *m = WindowsBasedSli_PerformanceThreshold{} } -func (m *WindowsBasedSli_PerformanceThreshold) String() string { return proto.CompactTextString(m) } -func (*WindowsBasedSli_PerformanceThreshold) ProtoMessage() {} -func (*WindowsBasedSli_PerformanceThreshold) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{8, 0} -} - -func (m *WindowsBasedSli_PerformanceThreshold) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_WindowsBasedSli_PerformanceThreshold.Unmarshal(m, b) -} -func (m *WindowsBasedSli_PerformanceThreshold) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_WindowsBasedSli_PerformanceThreshold.Marshal(b, m, deterministic) -} -func (m *WindowsBasedSli_PerformanceThreshold) XXX_Merge(src proto.Message) { - xxx_messageInfo_WindowsBasedSli_PerformanceThreshold.Merge(m, src) -} -func (m *WindowsBasedSli_PerformanceThreshold) XXX_Size() int { - return xxx_messageInfo_WindowsBasedSli_PerformanceThreshold.Size(m) -} -func (m *WindowsBasedSli_PerformanceThreshold) XXX_DiscardUnknown() { - xxx_messageInfo_WindowsBasedSli_PerformanceThreshold.DiscardUnknown(m) -} - -var xxx_messageInfo_WindowsBasedSli_PerformanceThreshold proto.InternalMessageInfo - -type isWindowsBasedSli_PerformanceThreshold_Type interface { - isWindowsBasedSli_PerformanceThreshold_Type() -} - -type WindowsBasedSli_PerformanceThreshold_Performance struct { - Performance *RequestBasedSli `protobuf:"bytes,1,opt,name=performance,proto3,oneof"` -} - -type WindowsBasedSli_PerformanceThreshold_BasicSliPerformance struct { - BasicSliPerformance *BasicSli `protobuf:"bytes,3,opt,name=basic_sli_performance,json=basicSliPerformance,proto3,oneof"` -} - -func (*WindowsBasedSli_PerformanceThreshold_Performance) isWindowsBasedSli_PerformanceThreshold_Type() { -} - -func (*WindowsBasedSli_PerformanceThreshold_BasicSliPerformance) isWindowsBasedSli_PerformanceThreshold_Type() { -} - -func (m *WindowsBasedSli_PerformanceThreshold) GetType() isWindowsBasedSli_PerformanceThreshold_Type { - if m != nil { - return m.Type - } - return nil -} - -func (m *WindowsBasedSli_PerformanceThreshold) GetPerformance() *RequestBasedSli { - if x, ok := m.GetType().(*WindowsBasedSli_PerformanceThreshold_Performance); ok { - return x.Performance - } - return nil -} - -func (m *WindowsBasedSli_PerformanceThreshold) GetBasicSliPerformance() *BasicSli { - if x, ok := m.GetType().(*WindowsBasedSli_PerformanceThreshold_BasicSliPerformance); ok { - return x.BasicSliPerformance - } - return nil -} - -func (m *WindowsBasedSli_PerformanceThreshold) GetThreshold() float64 { - if m != nil { - return m.Threshold - } - return 0 -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*WindowsBasedSli_PerformanceThreshold) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*WindowsBasedSli_PerformanceThreshold_Performance)(nil), - (*WindowsBasedSli_PerformanceThreshold_BasicSliPerformance)(nil), - } -} - -// A `MetricRange` is used when each window is good when the value x of a -// single `TimeSeries` satisfies `range.min <= x < range.max`. The provided -// `TimeSeries` must have `ValueType = INT64` or `ValueType = DOUBLE` and -// `MetricKind = GAUGE`. -type WindowsBasedSli_MetricRange struct { - // A [monitoring filter](https://cloud.google.com/monitoring/api/v3/filters) - // specifying the `TimeSeries` to use for evaluating window quality. - TimeSeries string `protobuf:"bytes,1,opt,name=time_series,json=timeSeries,proto3" json:"time_series,omitempty"` - // Range of values considered "good." For a one-sided range, set one bound - // to an infinite value. - Range *Range `protobuf:"bytes,4,opt,name=range,proto3" json:"range,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *WindowsBasedSli_MetricRange) Reset() { *m = WindowsBasedSli_MetricRange{} } -func (m *WindowsBasedSli_MetricRange) String() string { return proto.CompactTextString(m) } -func (*WindowsBasedSli_MetricRange) ProtoMessage() {} -func (*WindowsBasedSli_MetricRange) Descriptor() ([]byte, []int) { - return fileDescriptor_72cc01277ee8f421, []int{8, 1} -} - -func (m *WindowsBasedSli_MetricRange) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_WindowsBasedSli_MetricRange.Unmarshal(m, b) -} -func (m *WindowsBasedSli_MetricRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_WindowsBasedSli_MetricRange.Marshal(b, m, deterministic) -} -func (m *WindowsBasedSli_MetricRange) XXX_Merge(src proto.Message) { - xxx_messageInfo_WindowsBasedSli_MetricRange.Merge(m, src) -} -func (m *WindowsBasedSli_MetricRange) XXX_Size() int { - return xxx_messageInfo_WindowsBasedSli_MetricRange.Size(m) -} -func (m *WindowsBasedSli_MetricRange) XXX_DiscardUnknown() { - xxx_messageInfo_WindowsBasedSli_MetricRange.DiscardUnknown(m) -} - -var xxx_messageInfo_WindowsBasedSli_MetricRange proto.InternalMessageInfo - -func (m *WindowsBasedSli_MetricRange) GetTimeSeries() string { - if m != nil { - return m.TimeSeries - } - return "" -} - -func (m *WindowsBasedSli_MetricRange) GetRange() *Range { - if m != nil { - return m.Range - } - return nil -} - -func init() { - proto.RegisterEnum("google.monitoring.v3.ServiceLevelObjective_View", ServiceLevelObjective_View_name, ServiceLevelObjective_View_value) - proto.RegisterType((*Service)(nil), "google.monitoring.v3.Service") - proto.RegisterType((*Service_Custom)(nil), "google.monitoring.v3.Service.Custom") - proto.RegisterType((*Service_AppEngine)(nil), "google.monitoring.v3.Service.AppEngine") - proto.RegisterType((*Service_CloudEndpoints)(nil), "google.monitoring.v3.Service.CloudEndpoints") - proto.RegisterType((*Service_ClusterIstio)(nil), "google.monitoring.v3.Service.ClusterIstio") - proto.RegisterType((*Service_Telemetry)(nil), "google.monitoring.v3.Service.Telemetry") - proto.RegisterType((*ServiceLevelObjective)(nil), "google.monitoring.v3.ServiceLevelObjective") - proto.RegisterType((*ServiceLevelIndicator)(nil), "google.monitoring.v3.ServiceLevelIndicator") - proto.RegisterType((*BasicSli)(nil), "google.monitoring.v3.BasicSli") - proto.RegisterType((*BasicSli_AvailabilityCriteria)(nil), "google.monitoring.v3.BasicSli.AvailabilityCriteria") - proto.RegisterType((*BasicSli_LatencyCriteria)(nil), "google.monitoring.v3.BasicSli.LatencyCriteria") - proto.RegisterType((*Range)(nil), "google.monitoring.v3.Range") - proto.RegisterType((*RequestBasedSli)(nil), "google.monitoring.v3.RequestBasedSli") - proto.RegisterType((*TimeSeriesRatio)(nil), "google.monitoring.v3.TimeSeriesRatio") - proto.RegisterType((*DistributionCut)(nil), "google.monitoring.v3.DistributionCut") - proto.RegisterType((*WindowsBasedSli)(nil), "google.monitoring.v3.WindowsBasedSli") - proto.RegisterType((*WindowsBasedSli_PerformanceThreshold)(nil), "google.monitoring.v3.WindowsBasedSli.PerformanceThreshold") - proto.RegisterType((*WindowsBasedSli_MetricRange)(nil), "google.monitoring.v3.WindowsBasedSli.MetricRange") -} - -func init() { proto.RegisterFile("google/monitoring/v3/service.proto", fileDescriptor_72cc01277ee8f421) } - -var fileDescriptor_72cc01277ee8f421 = []byte{ - // 1498 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0x5f, 0x6f, 0xdb, 0x46, - 0x12, 0x17, 0xfd, 0x47, 0x7f, 0x46, 0xb2, 0xa5, 0xac, 0x1d, 0x47, 0x51, 0x0e, 0x89, 0xa3, 0x5c, - 0x70, 0x86, 0x13, 0x90, 0x89, 0x7d, 0x87, 0x03, 0x72, 0xb8, 0x00, 0x96, 0x63, 0x9f, 0x14, 0x38, - 0x39, 0x87, 0x76, 0x9c, 0xbb, 0x43, 0x00, 0xde, 0x8a, 0x5c, 0x2b, 0x5b, 0x90, 0x5c, 0x96, 0xa4, - 0xec, 0xb8, 0x46, 0x3e, 0x4a, 0x1f, 0x8a, 0x16, 0x08, 0xd0, 0x87, 0x7e, 0x88, 0x3e, 0xf4, 0x21, - 0xdf, 0xa1, 0x40, 0x9f, 0xf3, 0xda, 0xb7, 0x3e, 0x15, 0xfb, 0xcf, 0xa2, 0x14, 0xc5, 0x96, 0xfb, - 0xb6, 0x3b, 0xf3, 0x9b, 0xdf, 0xcc, 0xce, 0xce, 0xcc, 0x92, 0xd0, 0xec, 0x31, 0xd6, 0xf3, 0x89, - 0x15, 0xb0, 0x90, 0xa6, 0x2c, 0xa6, 0x61, 0xcf, 0x3a, 0x5a, 0xb7, 0x12, 0x12, 0x1f, 0x51, 0x97, - 0x98, 0x51, 0xcc, 0x52, 0x86, 0x16, 0x25, 0xc6, 0x1c, 0x60, 0xcc, 0xa3, 0xf5, 0xc6, 0x1d, 0x65, - 0x89, 0x23, 0xaa, 0xad, 0x89, 0xe7, 0xc4, 0x24, 0x61, 0xfd, 0x58, 0x9b, 0x36, 0xae, 0x67, 0x40, - 0x23, 0xaa, 0x9b, 0x4a, 0x25, 0x76, 0xdd, 0xfe, 0xa1, 0xe5, 0xf5, 0x63, 0x9c, 0x52, 0x16, 0x2a, - 0xfd, 0xad, 0x51, 0x7d, 0x4a, 0x03, 0x92, 0xa4, 0x38, 0x88, 0x14, 0xe0, 0xb6, 0x02, 0xa4, 0x27, - 0x11, 0xb1, 0x5c, 0xec, 0x93, 0xd0, 0xc3, 0xb1, 0x13, 0x91, 0x98, 0x32, 0x4f, 0x42, 0x9a, 0xef, - 0x0b, 0x50, 0xd8, 0x93, 0x67, 0x41, 0x08, 0x66, 0x42, 0x1c, 0x90, 0xba, 0xb1, 0x6c, 0xac, 0x94, - 0x6c, 0xb1, 0x46, 0xb7, 0xa1, 0xe2, 0xd1, 0x24, 0xf2, 0xf1, 0x89, 0x23, 0x74, 0x53, 0x42, 0x57, - 0x56, 0xb2, 0xe7, 0x1c, 0xf2, 0x18, 0xf2, 0x6e, 0x3f, 0x49, 0x59, 0x50, 0xcf, 0x2f, 0x1b, 0x2b, - 0xe5, 0xb5, 0x3f, 0x9b, 0xe3, 0xb2, 0x61, 0x2a, 0x2f, 0xe6, 0xa6, 0xc0, 0xb6, 0x73, 0xb6, 0xb2, - 0x42, 0x6d, 0x00, 0x1c, 0x45, 0x0e, 0x09, 0x7b, 0x34, 0x24, 0xf5, 0x82, 0xe0, 0xf8, 0xcb, 0xf9, - 0x1c, 0x1b, 0x51, 0xb4, 0x25, 0xe0, 0xed, 0x9c, 0x5d, 0xc2, 0x7a, 0x83, 0x5e, 0x41, 0xd5, 0xf5, - 0x59, 0xdf, 0x73, 0x48, 0xe8, 0x45, 0x8c, 0x86, 0x69, 0x52, 0x2f, 0x0a, 0xba, 0xfb, 0x17, 0x84, - 0xc4, 0x8d, 0xb6, 0xb4, 0x4d, 0x3b, 0x67, 0xcf, 0xbb, 0x43, 0x12, 0xf4, 0x02, 0xe6, 0x5c, 0xbf, - 0x9f, 0xa4, 0x24, 0x76, 0x68, 0x92, 0x52, 0x56, 0x2f, 0x09, 0xda, 0xd5, 0x8b, 0x68, 0x85, 0x49, - 0x87, 0x5b, 0xb4, 0x73, 0x76, 0xc5, 0xcd, 0xec, 0xd1, 0x16, 0x94, 0x52, 0xe2, 0x93, 0x80, 0xa4, - 0xf1, 0x49, 0x7d, 0x6e, 0x92, 0x43, 0xef, 0x6b, 0xb8, 0x3d, 0xb0, 0x6c, 0x14, 0x21, 0x2f, 0x13, - 0xda, 0x58, 0x81, 0xd2, 0x59, 0x5a, 0xd0, 0x0d, 0x28, 0x05, 0xcc, 0xeb, 0xfb, 0xc4, 0xa1, 0x9e, - 0xba, 0xcf, 0xa2, 0x14, 0x74, 0xbc, 0xc6, 0x2a, 0xcc, 0x0f, 0x9f, 0x18, 0xd5, 0xa1, 0xa0, 0x0a, - 0x5a, 0x81, 0xf5, 0xb6, 0xf1, 0xb5, 0x01, 0x95, 0xec, 0x39, 0x50, 0x03, 0x8a, 0x3e, 0x73, 0x45, - 0x19, 0x6a, 0x62, 0xbd, 0xe7, 0xc5, 0xa2, 0xd3, 0x94, 0x2d, 0x16, 0x25, 0x13, 0xc5, 0x72, 0x0f, - 0xae, 0x28, 0x6a, 0x01, 0x49, 0x22, 0xec, 0x92, 0xfa, 0xb4, 0xc0, 0xd5, 0x94, 0xe2, 0xb9, 0x96, - 0x73, 0xbe, 0x2c, 0xb8, 0x3e, 0x23, 0xf9, 0x32, 0xb8, 0xc6, 0x03, 0x28, 0x9d, 0xe5, 0x05, 0xdd, - 0x81, 0x39, 0xdd, 0x42, 0x4e, 0xa6, 0x92, 0x2b, 0x5a, 0xc8, 0x2d, 0x1e, 0xbd, 0x37, 0x3e, 0x6e, - 0x7c, 0x6b, 0xc0, 0xed, 0x4c, 0x92, 0x65, 0xda, 0x71, 0x44, 0x13, 0xd3, 0x65, 0x81, 0xa5, 0xfb, - 0xe1, 0x6e, 0x14, 0xb3, 0x2f, 0x88, 0x9b, 0x26, 0xd6, 0xa9, 0x5a, 0xbd, 0xd3, 0x7d, 0x9f, 0x58, - 0xa7, 0x6a, 0xf5, 0x0e, 0x59, 0x2c, 0xee, 0xe1, 0x90, 0x7e, 0x25, 0x72, 0x90, 0x58, 0xa7, 0xd9, - 0xed, 0x58, 0x83, 0x3b, 0x87, 0xcc, 0xf7, 0x48, 0x9c, 0x58, 0xa7, 0x72, 0x31, 0x16, 0x64, 0xac, - 0xb6, 0x2a, 0x00, 0xd4, 0x23, 0x61, 0x4a, 0x0f, 0x29, 0x89, 0x9b, 0xbf, 0xcc, 0xc2, 0x55, 0x15, - 0xd9, 0x0e, 0x39, 0x22, 0xfe, 0xbf, 0xbb, 0x3c, 0x22, 0x7a, 0x34, 0x59, 0xdf, 0x96, 0x3f, 0xed, - 0x5b, 0x17, 0xae, 0xe9, 0xec, 0xfa, 0x9c, 0xd0, 0xa1, 0xa1, 0x47, 0x5d, 0x9c, 0xb2, 0x58, 0x5c, - 0x48, 0x79, 0xed, 0xde, 0xb9, 0xf5, 0x28, 0x82, 0xe8, 0x68, 0x13, 0xfb, 0x6a, 0x32, 0x4e, 0xcc, - 0x63, 0xeb, 0x31, 0xec, 0x8b, 0xab, 0x33, 0x6c, 0xb1, 0x46, 0x2d, 0x98, 0x8f, 0x99, 0xef, 0xd3, - 0xb0, 0xa7, 0x66, 0x51, 0x7d, 0x56, 0xf8, 0xbb, 0xae, 0xfd, 0xe9, 0x81, 0x66, 0x3e, 0x51, 0x03, - 0xaf, 0x9d, 0xb3, 0xe7, 0x94, 0xc9, 0xae, 0xb0, 0x40, 0xdb, 0x50, 0x1d, 0x19, 0x68, 0x62, 0xfa, - 0xcc, 0xaf, 0xdd, 0xd0, 0x24, 0x7c, 0xe8, 0x99, 0x9b, 0x0a, 0x23, 0xad, 0x44, 0x67, 0x0f, 0x49, - 0x9a, 0x7f, 0x85, 0x99, 0x03, 0x4a, 0x8e, 0xd1, 0x22, 0xd4, 0x0e, 0x3a, 0x5b, 0xaf, 0x9c, 0x97, - 0xcf, 0xf7, 0x76, 0xb7, 0x36, 0x3b, 0xdb, 0x9d, 0xad, 0x27, 0xb5, 0x1c, 0x2a, 0xc2, 0xcc, 0xf6, - 0xcb, 0x9d, 0x9d, 0xda, 0x14, 0xaa, 0x40, 0x71, 0xeb, 0x3f, 0xbb, 0x3b, 0x9d, 0xcd, 0xce, 0x7e, - 0xcd, 0x78, 0xf4, 0x61, 0xea, 0xe3, 0xc6, 0x4f, 0x53, 0x60, 0x5d, 0x58, 0x43, 0x23, 0x37, 0x75, - 0x30, 0x51, 0x45, 0x59, 0xc9, 0x38, 0xe3, 0x01, 0x40, 0x5d, 0x17, 0xd3, 0x9a, 0x77, 0xe8, 0xff, - 0x97, 0x2c, 0xc1, 0xcb, 0x7b, 0xd8, 0x9f, 0xa0, 0x66, 0x2f, 0xcf, 0x6a, 0xac, 0x2e, 0x1b, 0xad, - 0x22, 0xe4, 0xe5, 0x0d, 0x36, 0x7f, 0x33, 0x86, 0x4b, 0x7c, 0x50, 0x46, 0xff, 0x84, 0x52, 0x17, - 0x27, 0xd4, 0x75, 0x12, 0x9f, 0x8a, 0x5a, 0x2a, 0xaf, 0xdd, 0x1c, 0x5f, 0x9d, 0x2d, 0x0e, 0xdb, - 0xf3, 0x69, 0x3b, 0x67, 0x17, 0xbb, 0x6a, 0x8d, 0x76, 0xf8, 0x60, 0xf8, 0xb2, 0x4f, 0x92, 0xd4, - 0xe9, 0xe2, 0x84, 0xc8, 0x91, 0x58, 0x5e, 0xbb, 0x3b, 0x9e, 0xc2, 0x96, 0xd0, 0x16, 0x47, 0x4a, - 0xa6, 0x4a, 0x9c, 0x11, 0x71, 0xb6, 0x63, 0x1a, 0x7a, 0xec, 0x38, 0x51, 0x6c, 0x53, 0xe7, 0xb1, - 0xbd, 0x92, 0xd0, 0x2c, 0xdb, 0x71, 0x46, 0xd4, 0xca, 0xc3, 0x0c, 0x2f, 0xd5, 0xe6, 0xaf, 0x53, - 0x50, 0xd4, 0xc1, 0xa3, 0x25, 0xc8, 0x07, 0x24, 0x7d, 0xc3, 0xbc, 0x7a, 0x61, 0x79, 0x7a, 0xa5, - 0x64, 0xab, 0xdd, 0xd0, 0xf4, 0x2d, 0x0a, 0xcd, 0x60, 0xfa, 0xd6, 0xa1, 0x70, 0x44, 0xe2, 0x84, - 0xab, 0x4a, 0x42, 0xa5, 0xb7, 0xe8, 0xbf, 0x50, 0xc1, 0x47, 0x98, 0xfa, 0xb8, 0x4b, 0x7d, 0x9a, - 0x9e, 0xa8, 0x78, 0xd7, 0xcf, 0x4f, 0xa0, 0xb9, 0x91, 0x31, 0xd9, 0x8c, 0x69, 0x4a, 0x62, 0x8a, - 0x79, 0xf4, 0x59, 0x2a, 0xf4, 0x14, 0x0a, 0x3e, 0x4e, 0x49, 0xe8, 0x9e, 0xa8, 0xa1, 0x61, 0x5e, - 0xc0, 0xba, 0x23, 0xd1, 0x19, 0x42, 0x4d, 0xd0, 0x58, 0x82, 0xc5, 0x71, 0x3e, 0x1b, 0x4f, 0xa1, - 0x3a, 0x62, 0x85, 0xfe, 0x0e, 0xa5, 0xf4, 0x4d, 0x4c, 0x92, 0x37, 0xcc, 0xf7, 0x94, 0xe3, 0xcf, - 0x4f, 0x0f, 0x7b, 0x80, 0x6d, 0xcd, 0x43, 0x25, 0xf1, 0xa9, 0xe3, 0x2a, 0xa2, 0xe6, 0x3d, 0x98, - 0xb5, 0x71, 0xd8, 0x23, 0xa8, 0x06, 0xd3, 0x01, 0x95, 0x4f, 0x9a, 0x61, 0xf3, 0xa5, 0x90, 0xe0, - 0xb7, 0x22, 0x59, 0x5c, 0x82, 0xdf, 0x36, 0x7f, 0x34, 0xa0, 0x3a, 0x52, 0x1c, 0xe8, 0x05, 0xd4, - 0x7a, 0x8c, 0x79, 0x4e, 0xca, 0x52, 0xec, 0x3b, 0xc2, 0xe1, 0xf9, 0xd5, 0xb5, 0x4f, 0x03, 0xb2, - 0x47, 0x62, 0x4a, 0x12, 0x1b, 0xcb, 0x0f, 0x83, 0x79, 0x4e, 0xb0, 0xcf, 0xed, 0x85, 0x04, 0xd9, - 0x50, 0xf3, 0x68, 0x92, 0xc6, 0xb4, 0xdb, 0xe7, 0xe1, 0x3b, 0x6e, 0x3f, 0x55, 0x67, 0xfc, 0x0c, - 0xe5, 0x93, 0x0c, 0x7a, 0xb3, 0x9f, 0xb6, 0x73, 0x76, 0xd5, 0x1b, 0x16, 0xf1, 0x26, 0x93, 0x25, - 0xd4, 0xfc, 0xc6, 0x80, 0xea, 0x48, 0x0c, 0xc8, 0x84, 0x05, 0x71, 0x08, 0xdd, 0xa8, 0x87, 0xd4, - 0x4f, 0x49, 0xac, 0xde, 0xdb, 0x2b, 0x5c, 0xa5, 0xda, 0x72, 0x5b, 0x28, 0xd0, 0x7d, 0x40, 0x5d, - 0xfc, 0x09, 0x7c, 0x56, 0x3e, 0xe3, 0x5d, 0x3c, 0x82, 0x7e, 0x00, 0x8b, 0x32, 0x3b, 0x23, 0xf8, - 0xbc, 0xc0, 0x23, 0xa1, 0x1b, 0xb2, 0x68, 0xf6, 0xa1, 0x3a, 0x72, 0x26, 0x64, 0xc1, 0xc2, 0x50, - 0x52, 0x86, 0x42, 0x44, 0x59, 0x95, 0xf2, 0xfa, 0x10, 0x66, 0x63, 0x7e, 0xb3, 0xea, 0x71, 0xb9, - 0xf1, 0x99, 0x5e, 0xe7, 0x10, 0x5b, 0x22, 0x9b, 0xdf, 0xe5, 0xa1, 0x3a, 0xd2, 0xae, 0xe8, 0x6f, - 0xb0, 0x24, 0x52, 0xc3, 0xcf, 0xcb, 0xbf, 0x32, 0xa8, 0x3b, 0x74, 0xdc, 0x76, 0xce, 0x16, 0xa9, - 0x6b, 0x61, 0xef, 0x99, 0xd0, 0x2a, 0xef, 0x27, 0xd0, 0x18, 0x2d, 0x0b, 0x67, 0x50, 0xb1, 0xb2, - 0x01, 0x1f, 0x4d, 0x34, 0x30, 0xcc, 0x5d, 0x12, 0x1f, 0xb2, 0x38, 0xc0, 0xa1, 0x4b, 0xf6, 0x35, - 0x43, 0x3b, 0x67, 0x5f, 0x1b, 0xae, 0x9a, 0x33, 0x15, 0xf2, 0x60, 0x51, 0x05, 0x1a, 0x10, 0x1c, - 0x3a, 0x34, 0x74, 0x64, 0x1e, 0xe4, 0xd7, 0xf9, 0xc3, 0xc9, 0x9c, 0xca, 0xc3, 0x88, 0xec, 0xb4, - 0x73, 0xf6, 0x15, 0x49, 0xf8, 0x8c, 0xe0, 0xb0, 0x13, 0xca, 0x7e, 0xe9, 0xc2, 0x82, 0xf2, 0x92, - 0xf4, 0x83, 0x81, 0x93, 0xc2, 0x1f, 0x77, 0x52, 0x93, 0x7c, 0x7b, 0xfd, 0x40, 0xfb, 0x78, 0xac, - 0x07, 0xad, 0x7e, 0xe2, 0x67, 0x2e, 0xea, 0x74, 0x35, 0x5a, 0xe5, 0xe3, 0xde, 0xf8, 0xd9, 0x80, - 0xc5, 0x71, 0xd9, 0x43, 0x1d, 0x28, 0x47, 0x03, 0xf9, 0x65, 0x5f, 0x83, 0xac, 0x2d, 0xda, 0x87, - 0xab, 0x67, 0x2f, 0x93, 0x93, 0x25, 0x9d, 0x9e, 0xf0, 0x95, 0x5a, 0xd0, 0xaf, 0x54, 0x26, 0x52, - 0xf4, 0xa7, 0xec, 0x7c, 0x93, 0x13, 0x28, 0x33, 0xc4, 0xd4, 0x93, 0xd1, 0xc0, 0x50, 0xce, 0xa4, - 0x10, 0xdd, 0x82, 0x32, 0xff, 0x03, 0xe4, 0x6d, 0x46, 0x49, 0xa2, 0x3e, 0x07, 0x21, 0x3d, 0xeb, - 0xf5, 0x41, 0x4b, 0xcc, 0x4c, 0xda, 0x12, 0x2d, 0x04, 0x35, 0x75, 0x05, 0x6a, 0x64, 0xb2, 0xb0, - 0xf5, 0x83, 0x01, 0x75, 0x97, 0x05, 0x63, 0xad, 0x5b, 0x4b, 0xaa, 0x93, 0x9f, 0x9d, 0x49, 0x77, - 0xf9, 0x2d, 0xed, 0x1a, 0xff, 0x7b, 0xac, 0xf0, 0x3d, 0xe6, 0xe3, 0xb0, 0x67, 0xb2, 0xb8, 0x67, - 0xf5, 0x48, 0x28, 0xee, 0xd0, 0x1a, 0x7c, 0x3d, 0x0d, 0xff, 0x67, 0xff, 0x63, 0xb0, 0xfb, 0x7e, - 0xaa, 0xf1, 0x2f, 0x49, 0x20, 0x7e, 0x5e, 0xcc, 0x81, 0x03, 0xf3, 0x60, 0xfd, 0x83, 0x56, 0xbe, - 0x16, 0xca, 0xd7, 0x03, 0xe5, 0xeb, 0x83, 0xf5, 0x6e, 0x5e, 0x38, 0x59, 0xff, 0x3d, 0x00, 0x00, - 0xff, 0xff, 0x5d, 0xb0, 0x09, 0xb8, 0xcb, 0x0f, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/service_service.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/service_service.pb.go deleted file mode 100644 index a0875baf1..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/service_service.pb.go +++ /dev/null @@ -1,1232 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/service_service.proto - -package monitoring - -import ( - context "context" - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - empty "github.com/golang/protobuf/ptypes/empty" - _ "google.golang.org/genproto/googleapis/api/annotations" - _ "google.golang.org/genproto/googleapis/api/monitoredres" - field_mask "google.golang.org/genproto/protobuf/field_mask" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The `CreateService` request. -type CreateServiceRequest struct { - // Required. Resource name of the parent workspace. - // Of the form `projects/{project_id}`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Optional. The Service id to use for this Service. If omitted, an id will be - // generated instead. Must match the pattern [a-z0-9\-]+ - ServiceId string `protobuf:"bytes,3,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` - // Required. The `Service` to create. - Service *Service `protobuf:"bytes,2,opt,name=service,proto3" json:"service,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateServiceRequest) Reset() { *m = CreateServiceRequest{} } -func (m *CreateServiceRequest) String() string { return proto.CompactTextString(m) } -func (*CreateServiceRequest) ProtoMessage() {} -func (*CreateServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{0} -} - -func (m *CreateServiceRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateServiceRequest.Unmarshal(m, b) -} -func (m *CreateServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateServiceRequest.Marshal(b, m, deterministic) -} -func (m *CreateServiceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateServiceRequest.Merge(m, src) -} -func (m *CreateServiceRequest) XXX_Size() int { - return xxx_messageInfo_CreateServiceRequest.Size(m) -} -func (m *CreateServiceRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateServiceRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateServiceRequest proto.InternalMessageInfo - -func (m *CreateServiceRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -func (m *CreateServiceRequest) GetServiceId() string { - if m != nil { - return m.ServiceId - } - return "" -} - -func (m *CreateServiceRequest) GetService() *Service { - if m != nil { - return m.Service - } - return nil -} - -// The `GetService` request. -type GetServiceRequest struct { - // Required. Resource name of the `Service`. - // Of the form `projects/{project_id}/services/{service_id}`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetServiceRequest) Reset() { *m = GetServiceRequest{} } -func (m *GetServiceRequest) String() string { return proto.CompactTextString(m) } -func (*GetServiceRequest) ProtoMessage() {} -func (*GetServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{1} -} - -func (m *GetServiceRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetServiceRequest.Unmarshal(m, b) -} -func (m *GetServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetServiceRequest.Marshal(b, m, deterministic) -} -func (m *GetServiceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetServiceRequest.Merge(m, src) -} -func (m *GetServiceRequest) XXX_Size() int { - return xxx_messageInfo_GetServiceRequest.Size(m) -} -func (m *GetServiceRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetServiceRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetServiceRequest proto.InternalMessageInfo - -func (m *GetServiceRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The `ListServices` request. -type ListServicesRequest struct { - // Required. Resource name of the parent `Workspace`. - // Of the form `projects/{project_id}`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // A filter specifying what `Service`s to return. The filter currently - // supports the following fields: - // - // - `identifier_case` - // - `app_engine.module_id` - // - `cloud_endpoints.service` - // - `cluster_istio.location` - // - `cluster_istio.cluster_name` - // - `cluster_istio.service_namespace` - // - `cluster_istio.service_name` - // - // `identifier_case` refers to which option in the identifier oneof is - // populated. For example, the filter `identifier_case = "CUSTOM"` would match - // all services with a value for the `custom` field. Valid options are - // "CUSTOM", "APP_ENGINE", "CLOUD_ENDPOINTS", and "CLUSTER_ISTIO". - Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` - // A non-negative number that is the maximum number of results to return. - // When 0, use default page size. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If this field is not empty then it must contain the `nextPageToken` value - // returned by a previous call to this method. Using this field causes the - // method to return additional results from the previous method call. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListServicesRequest) Reset() { *m = ListServicesRequest{} } -func (m *ListServicesRequest) String() string { return proto.CompactTextString(m) } -func (*ListServicesRequest) ProtoMessage() {} -func (*ListServicesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{2} -} - -func (m *ListServicesRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListServicesRequest.Unmarshal(m, b) -} -func (m *ListServicesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListServicesRequest.Marshal(b, m, deterministic) -} -func (m *ListServicesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListServicesRequest.Merge(m, src) -} -func (m *ListServicesRequest) XXX_Size() int { - return xxx_messageInfo_ListServicesRequest.Size(m) -} -func (m *ListServicesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListServicesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListServicesRequest proto.InternalMessageInfo - -func (m *ListServicesRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -func (m *ListServicesRequest) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *ListServicesRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListServicesRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -// The `ListServices` response. -type ListServicesResponse struct { - // The `Service`s matching the specified filter. - Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` - // If there are more results than have been returned, then this field is set - // to a non-empty value. To see the additional results, - // use that value as `pageToken` in the next call to this method. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListServicesResponse) Reset() { *m = ListServicesResponse{} } -func (m *ListServicesResponse) String() string { return proto.CompactTextString(m) } -func (*ListServicesResponse) ProtoMessage() {} -func (*ListServicesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{3} -} - -func (m *ListServicesResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListServicesResponse.Unmarshal(m, b) -} -func (m *ListServicesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListServicesResponse.Marshal(b, m, deterministic) -} -func (m *ListServicesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListServicesResponse.Merge(m, src) -} -func (m *ListServicesResponse) XXX_Size() int { - return xxx_messageInfo_ListServicesResponse.Size(m) -} -func (m *ListServicesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListServicesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListServicesResponse proto.InternalMessageInfo - -func (m *ListServicesResponse) GetServices() []*Service { - if m != nil { - return m.Services - } - return nil -} - -func (m *ListServicesResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -// The `UpdateService` request. -type UpdateServiceRequest struct { - // Required. The `Service` to draw updates from. - // The given `name` specifies the resource to update. - Service *Service `protobuf:"bytes,1,opt,name=service,proto3" json:"service,omitempty"` - // A set of field paths defining which fields to use for the update. - UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UpdateServiceRequest) Reset() { *m = UpdateServiceRequest{} } -func (m *UpdateServiceRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateServiceRequest) ProtoMessage() {} -func (*UpdateServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{4} -} - -func (m *UpdateServiceRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UpdateServiceRequest.Unmarshal(m, b) -} -func (m *UpdateServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UpdateServiceRequest.Marshal(b, m, deterministic) -} -func (m *UpdateServiceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateServiceRequest.Merge(m, src) -} -func (m *UpdateServiceRequest) XXX_Size() int { - return xxx_messageInfo_UpdateServiceRequest.Size(m) -} -func (m *UpdateServiceRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateServiceRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_UpdateServiceRequest proto.InternalMessageInfo - -func (m *UpdateServiceRequest) GetService() *Service { - if m != nil { - return m.Service - } - return nil -} - -func (m *UpdateServiceRequest) GetUpdateMask() *field_mask.FieldMask { - if m != nil { - return m.UpdateMask - } - return nil -} - -// The `DeleteService` request. -type DeleteServiceRequest struct { - // Required. Resource name of the `Service` to delete. - // Of the form `projects/{project_id}/services/{service_id}`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteServiceRequest) Reset() { *m = DeleteServiceRequest{} } -func (m *DeleteServiceRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteServiceRequest) ProtoMessage() {} -func (*DeleteServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{5} -} - -func (m *DeleteServiceRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteServiceRequest.Unmarshal(m, b) -} -func (m *DeleteServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteServiceRequest.Marshal(b, m, deterministic) -} -func (m *DeleteServiceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteServiceRequest.Merge(m, src) -} -func (m *DeleteServiceRequest) XXX_Size() int { - return xxx_messageInfo_DeleteServiceRequest.Size(m) -} -func (m *DeleteServiceRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteServiceRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteServiceRequest proto.InternalMessageInfo - -func (m *DeleteServiceRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The `CreateServiceLevelObjective` request. -type CreateServiceLevelObjectiveRequest struct { - // Required. Resource name of the parent `Service`. - // Of the form `projects/{project_id}/services/{service_id}`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Optional. The ServiceLevelObjective id to use for this - // ServiceLevelObjective. If omitted, an id will be generated instead. Must - // match the pattern [a-z0-9\-]+ - ServiceLevelObjectiveId string `protobuf:"bytes,3,opt,name=service_level_objective_id,json=serviceLevelObjectiveId,proto3" json:"service_level_objective_id,omitempty"` - // Required. The `ServiceLevelObjective` to create. - // The provided `name` will be respected if no `ServiceLevelObjective` exists - // with this name. - ServiceLevelObjective *ServiceLevelObjective `protobuf:"bytes,2,opt,name=service_level_objective,json=serviceLevelObjective,proto3" json:"service_level_objective,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateServiceLevelObjectiveRequest) Reset() { *m = CreateServiceLevelObjectiveRequest{} } -func (m *CreateServiceLevelObjectiveRequest) String() string { return proto.CompactTextString(m) } -func (*CreateServiceLevelObjectiveRequest) ProtoMessage() {} -func (*CreateServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{6} -} - -func (m *CreateServiceLevelObjectiveRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateServiceLevelObjectiveRequest.Unmarshal(m, b) -} -func (m *CreateServiceLevelObjectiveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateServiceLevelObjectiveRequest.Marshal(b, m, deterministic) -} -func (m *CreateServiceLevelObjectiveRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateServiceLevelObjectiveRequest.Merge(m, src) -} -func (m *CreateServiceLevelObjectiveRequest) XXX_Size() int { - return xxx_messageInfo_CreateServiceLevelObjectiveRequest.Size(m) -} -func (m *CreateServiceLevelObjectiveRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateServiceLevelObjectiveRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateServiceLevelObjectiveRequest proto.InternalMessageInfo - -func (m *CreateServiceLevelObjectiveRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -func (m *CreateServiceLevelObjectiveRequest) GetServiceLevelObjectiveId() string { - if m != nil { - return m.ServiceLevelObjectiveId - } - return "" -} - -func (m *CreateServiceLevelObjectiveRequest) GetServiceLevelObjective() *ServiceLevelObjective { - if m != nil { - return m.ServiceLevelObjective - } - return nil -} - -// The `GetServiceLevelObjective` request. -type GetServiceLevelObjectiveRequest struct { - // Required. Resource name of the `ServiceLevelObjective` to get. - // Of the form - // `projects/{project_id}/services/{service_id}/serviceLevelObjectives/{slo_name}`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // View of the `ServiceLevelObjective` to return. If `DEFAULT`, return the - // `ServiceLevelObjective` as originally defined. If `EXPLICIT` and the - // `ServiceLevelObjective` is defined in terms of a `BasicSli`, replace the - // `BasicSli` with a `RequestBasedSli` spelling out how the SLI is computed. - View ServiceLevelObjective_View `protobuf:"varint,2,opt,name=view,proto3,enum=google.monitoring.v3.ServiceLevelObjective_View" json:"view,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetServiceLevelObjectiveRequest) Reset() { *m = GetServiceLevelObjectiveRequest{} } -func (m *GetServiceLevelObjectiveRequest) String() string { return proto.CompactTextString(m) } -func (*GetServiceLevelObjectiveRequest) ProtoMessage() {} -func (*GetServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{7} -} - -func (m *GetServiceLevelObjectiveRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetServiceLevelObjectiveRequest.Unmarshal(m, b) -} -func (m *GetServiceLevelObjectiveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetServiceLevelObjectiveRequest.Marshal(b, m, deterministic) -} -func (m *GetServiceLevelObjectiveRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetServiceLevelObjectiveRequest.Merge(m, src) -} -func (m *GetServiceLevelObjectiveRequest) XXX_Size() int { - return xxx_messageInfo_GetServiceLevelObjectiveRequest.Size(m) -} -func (m *GetServiceLevelObjectiveRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetServiceLevelObjectiveRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetServiceLevelObjectiveRequest proto.InternalMessageInfo - -func (m *GetServiceLevelObjectiveRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *GetServiceLevelObjectiveRequest) GetView() ServiceLevelObjective_View { - if m != nil { - return m.View - } - return ServiceLevelObjective_VIEW_UNSPECIFIED -} - -// The `ListServiceLevelObjectives` request. -type ListServiceLevelObjectivesRequest struct { - // Required. Resource name of the parent `Service`. - // Of the form `projects/{project_id}/services/{service_id}`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // A filter specifying what `ServiceLevelObjective`s to return. - Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"` - // A non-negative number that is the maximum number of results to return. - // When 0, use default page size. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If this field is not empty then it must contain the `nextPageToken` value - // returned by a previous call to this method. Using this field causes the - // method to return additional results from the previous method call. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - // View of the `ServiceLevelObjective`s to return. If `DEFAULT`, return each - // `ServiceLevelObjective` as originally defined. If `EXPLICIT` and the - // `ServiceLevelObjective` is defined in terms of a `BasicSli`, replace the - // `BasicSli` with a `RequestBasedSli` spelling out how the SLI is computed. - View ServiceLevelObjective_View `protobuf:"varint,5,opt,name=view,proto3,enum=google.monitoring.v3.ServiceLevelObjective_View" json:"view,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListServiceLevelObjectivesRequest) Reset() { *m = ListServiceLevelObjectivesRequest{} } -func (m *ListServiceLevelObjectivesRequest) String() string { return proto.CompactTextString(m) } -func (*ListServiceLevelObjectivesRequest) ProtoMessage() {} -func (*ListServiceLevelObjectivesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{8} -} - -func (m *ListServiceLevelObjectivesRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListServiceLevelObjectivesRequest.Unmarshal(m, b) -} -func (m *ListServiceLevelObjectivesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListServiceLevelObjectivesRequest.Marshal(b, m, deterministic) -} -func (m *ListServiceLevelObjectivesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListServiceLevelObjectivesRequest.Merge(m, src) -} -func (m *ListServiceLevelObjectivesRequest) XXX_Size() int { - return xxx_messageInfo_ListServiceLevelObjectivesRequest.Size(m) -} -func (m *ListServiceLevelObjectivesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListServiceLevelObjectivesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListServiceLevelObjectivesRequest proto.InternalMessageInfo - -func (m *ListServiceLevelObjectivesRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -func (m *ListServiceLevelObjectivesRequest) GetFilter() string { - if m != nil { - return m.Filter - } - return "" -} - -func (m *ListServiceLevelObjectivesRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListServiceLevelObjectivesRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -func (m *ListServiceLevelObjectivesRequest) GetView() ServiceLevelObjective_View { - if m != nil { - return m.View - } - return ServiceLevelObjective_VIEW_UNSPECIFIED -} - -// The `ListServiceLevelObjectives` response. -type ListServiceLevelObjectivesResponse struct { - // The `ServiceLevelObjective`s matching the specified filter. - ServiceLevelObjectives []*ServiceLevelObjective `protobuf:"bytes,1,rep,name=service_level_objectives,json=serviceLevelObjectives,proto3" json:"service_level_objectives,omitempty"` - // If there are more results than have been returned, then this field is set - // to a non-empty value. To see the additional results, - // use that value as `pageToken` in the next call to this method. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListServiceLevelObjectivesResponse) Reset() { *m = ListServiceLevelObjectivesResponse{} } -func (m *ListServiceLevelObjectivesResponse) String() string { return proto.CompactTextString(m) } -func (*ListServiceLevelObjectivesResponse) ProtoMessage() {} -func (*ListServiceLevelObjectivesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{9} -} - -func (m *ListServiceLevelObjectivesResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListServiceLevelObjectivesResponse.Unmarshal(m, b) -} -func (m *ListServiceLevelObjectivesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListServiceLevelObjectivesResponse.Marshal(b, m, deterministic) -} -func (m *ListServiceLevelObjectivesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListServiceLevelObjectivesResponse.Merge(m, src) -} -func (m *ListServiceLevelObjectivesResponse) XXX_Size() int { - return xxx_messageInfo_ListServiceLevelObjectivesResponse.Size(m) -} -func (m *ListServiceLevelObjectivesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListServiceLevelObjectivesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListServiceLevelObjectivesResponse proto.InternalMessageInfo - -func (m *ListServiceLevelObjectivesResponse) GetServiceLevelObjectives() []*ServiceLevelObjective { - if m != nil { - return m.ServiceLevelObjectives - } - return nil -} - -func (m *ListServiceLevelObjectivesResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -// The `UpdateServiceLevelObjective` request. -type UpdateServiceLevelObjectiveRequest struct { - // Required. The `ServiceLevelObjective` to draw updates from. - // The given `name` specifies the resource to update. - ServiceLevelObjective *ServiceLevelObjective `protobuf:"bytes,1,opt,name=service_level_objective,json=serviceLevelObjective,proto3" json:"service_level_objective,omitempty"` - // A set of field paths defining which fields to use for the update. - UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UpdateServiceLevelObjectiveRequest) Reset() { *m = UpdateServiceLevelObjectiveRequest{} } -func (m *UpdateServiceLevelObjectiveRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateServiceLevelObjectiveRequest) ProtoMessage() {} -func (*UpdateServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{10} -} - -func (m *UpdateServiceLevelObjectiveRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UpdateServiceLevelObjectiveRequest.Unmarshal(m, b) -} -func (m *UpdateServiceLevelObjectiveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UpdateServiceLevelObjectiveRequest.Marshal(b, m, deterministic) -} -func (m *UpdateServiceLevelObjectiveRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateServiceLevelObjectiveRequest.Merge(m, src) -} -func (m *UpdateServiceLevelObjectiveRequest) XXX_Size() int { - return xxx_messageInfo_UpdateServiceLevelObjectiveRequest.Size(m) -} -func (m *UpdateServiceLevelObjectiveRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateServiceLevelObjectiveRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_UpdateServiceLevelObjectiveRequest proto.InternalMessageInfo - -func (m *UpdateServiceLevelObjectiveRequest) GetServiceLevelObjective() *ServiceLevelObjective { - if m != nil { - return m.ServiceLevelObjective - } - return nil -} - -func (m *UpdateServiceLevelObjectiveRequest) GetUpdateMask() *field_mask.FieldMask { - if m != nil { - return m.UpdateMask - } - return nil -} - -// The `DeleteServiceLevelObjective` request. -type DeleteServiceLevelObjectiveRequest struct { - // Required. Resource name of the `ServiceLevelObjective` to delete. - // Of the form - // `projects/{project_id}/services/{service_id}/serviceLevelObjectives/{slo_name}`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteServiceLevelObjectiveRequest) Reset() { *m = DeleteServiceLevelObjectiveRequest{} } -func (m *DeleteServiceLevelObjectiveRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteServiceLevelObjectiveRequest) ProtoMessage() {} -func (*DeleteServiceLevelObjectiveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a3e551c54e1485b8, []int{11} -} - -func (m *DeleteServiceLevelObjectiveRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteServiceLevelObjectiveRequest.Unmarshal(m, b) -} -func (m *DeleteServiceLevelObjectiveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteServiceLevelObjectiveRequest.Marshal(b, m, deterministic) -} -func (m *DeleteServiceLevelObjectiveRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteServiceLevelObjectiveRequest.Merge(m, src) -} -func (m *DeleteServiceLevelObjectiveRequest) XXX_Size() int { - return xxx_messageInfo_DeleteServiceLevelObjectiveRequest.Size(m) -} -func (m *DeleteServiceLevelObjectiveRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteServiceLevelObjectiveRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteServiceLevelObjectiveRequest proto.InternalMessageInfo - -func (m *DeleteServiceLevelObjectiveRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func init() { - proto.RegisterType((*CreateServiceRequest)(nil), "google.monitoring.v3.CreateServiceRequest") - proto.RegisterType((*GetServiceRequest)(nil), "google.monitoring.v3.GetServiceRequest") - proto.RegisterType((*ListServicesRequest)(nil), "google.monitoring.v3.ListServicesRequest") - proto.RegisterType((*ListServicesResponse)(nil), "google.monitoring.v3.ListServicesResponse") - proto.RegisterType((*UpdateServiceRequest)(nil), "google.monitoring.v3.UpdateServiceRequest") - proto.RegisterType((*DeleteServiceRequest)(nil), "google.monitoring.v3.DeleteServiceRequest") - proto.RegisterType((*CreateServiceLevelObjectiveRequest)(nil), "google.monitoring.v3.CreateServiceLevelObjectiveRequest") - proto.RegisterType((*GetServiceLevelObjectiveRequest)(nil), "google.monitoring.v3.GetServiceLevelObjectiveRequest") - proto.RegisterType((*ListServiceLevelObjectivesRequest)(nil), "google.monitoring.v3.ListServiceLevelObjectivesRequest") - proto.RegisterType((*ListServiceLevelObjectivesResponse)(nil), "google.monitoring.v3.ListServiceLevelObjectivesResponse") - proto.RegisterType((*UpdateServiceLevelObjectiveRequest)(nil), "google.monitoring.v3.UpdateServiceLevelObjectiveRequest") - proto.RegisterType((*DeleteServiceLevelObjectiveRequest)(nil), "google.monitoring.v3.DeleteServiceLevelObjectiveRequest") -} - -func init() { - proto.RegisterFile("google/monitoring/v3/service_service.proto", fileDescriptor_a3e551c54e1485b8) -} - -var fileDescriptor_a3e551c54e1485b8 = []byte{ - // 1145 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x4f, 0x6f, 0xdc, 0x44, - 0x14, 0xd7, 0x6c, 0xd2, 0xb4, 0x79, 0x25, 0xad, 0x18, 0x42, 0xb2, 0xf1, 0x12, 0x9a, 0xb8, 0x08, - 0xd2, 0x25, 0xd8, 0xb0, 0x0b, 0x6a, 0x49, 0x5a, 0x24, 0x27, 0x85, 0xaa, 0xd0, 0x88, 0xc8, 0xa5, - 0x39, 0xa0, 0x48, 0x2b, 0x67, 0x77, 0xb2, 0x31, 0xf1, 0xda, 0xae, 0x3d, 0xbb, 0x4b, 0x8b, 0x82, - 0x10, 0x12, 0x07, 0x24, 0x84, 0x54, 0x71, 0x80, 0xaf, 0x00, 0xe2, 0xc4, 0xbf, 0x3b, 0xd7, 0x72, - 0x03, 0x4e, 0x7b, 0xea, 0x81, 0x13, 0x1f, 0xa1, 0x27, 0x64, 0x7b, 0xbc, 0xb6, 0x37, 0x63, 0x3b, - 0x26, 0xe9, 0x29, 0xf1, 0xbc, 0x37, 0xef, 0xcf, 0xef, 0xbd, 0xdf, 0x7b, 0xa3, 0x85, 0x6a, 0xdb, - 0xb2, 0xda, 0x06, 0x91, 0x3b, 0x96, 0xa9, 0x53, 0xcb, 0xd1, 0xcd, 0xb6, 0xdc, 0xab, 0xcb, 0x2e, - 0x71, 0x7a, 0x7a, 0x93, 0x34, 0xd8, 0x5f, 0xc9, 0x76, 0x2c, 0x6a, 0xe1, 0xe9, 0x40, 0x57, 0x8a, - 0x74, 0xa5, 0x5e, 0x5d, 0x78, 0x8e, 0x59, 0xd0, 0x6c, 0x5d, 0xd6, 0x4c, 0xd3, 0xa2, 0x1a, 0xd5, - 0x2d, 0xd3, 0x0d, 0xee, 0x08, 0xb3, 0x31, 0x69, 0xd3, 0xd0, 0x89, 0x49, 0x99, 0xe0, 0x42, 0x4c, - 0xb0, 0xab, 0x13, 0xa3, 0xd5, 0xd8, 0x21, 0x7b, 0x5a, 0x4f, 0xb7, 0x1c, 0xa6, 0x70, 0x31, 0xa6, - 0xc0, 0x3c, 0x92, 0x56, 0xc3, 0x21, 0xae, 0xd5, 0x75, 0xc2, 0x90, 0x84, 0xb9, 0x98, 0xd2, 0x88, - 0x48, 0xcc, 0xca, 0x8c, 0xe9, 0x54, 0x98, 0x8e, 0xff, 0xb5, 0xd3, 0xdd, 0x95, 0x49, 0xc7, 0xa6, - 0xf7, 0x98, 0x70, 0x61, 0x54, 0x18, 0x84, 0xd9, 0xd1, 0xdc, 0xfd, 0x40, 0x43, 0xfc, 0x0d, 0xc1, - 0xf4, 0xba, 0x43, 0x34, 0x4a, 0x6e, 0x07, 0x66, 0x55, 0x72, 0xb7, 0x4b, 0x5c, 0x8a, 0x15, 0x98, - 0xb0, 0x35, 0x87, 0x98, 0xb4, 0x8c, 0x16, 0xd0, 0xd2, 0xe4, 0xda, 0xa5, 0x47, 0x4a, 0xe9, 0xb1, - 0x72, 0x11, 0x2f, 0xc6, 0xa0, 0x0b, 0xac, 0x6b, 0xb6, 0xee, 0x4a, 0x4d, 0xab, 0x23, 0x87, 0x16, - 0xd8, 0x45, 0x3c, 0x0f, 0x10, 0x56, 0x41, 0x6f, 0x95, 0xc7, 0x3c, 0x33, 0xea, 0x24, 0x3b, 0xb9, - 0xd9, 0xc2, 0x57, 0xe1, 0x34, 0xfb, 0x28, 0x97, 0x16, 0xd0, 0xd2, 0xd9, 0xda, 0xbc, 0xc4, 0xab, - 0x8e, 0xc4, 0xcc, 0xae, 0x8d, 0x3d, 0x52, 0x4a, 0x6a, 0x78, 0x45, 0x54, 0xe1, 0xe9, 0x1b, 0x84, - 0x8e, 0x04, 0x7d, 0x0d, 0xc6, 0x4d, 0xad, 0x43, 0x92, 0x21, 0xc3, 0x11, 0x42, 0xf6, 0xaf, 0x89, - 0x3f, 0x22, 0x78, 0xe6, 0x96, 0xee, 0x86, 0x56, 0xdd, 0x13, 0xc4, 0x62, 0x06, 0x26, 0x76, 0x75, - 0x83, 0x12, 0xc7, 0xcf, 0x75, 0x52, 0x65, 0x5f, 0xb8, 0x02, 0x93, 0xb6, 0xd6, 0x26, 0x0d, 0x57, - 0xbf, 0x4f, 0x7c, 0x88, 0x4e, 0xa9, 0x67, 0xbc, 0x83, 0xdb, 0xfa, 0x7d, 0xe2, 0x01, 0xe8, 0x0b, - 0xa9, 0xb5, 0x4f, 0xcc, 0xf2, 0x78, 0x00, 0xa0, 0x77, 0xf2, 0x81, 0x77, 0x20, 0xde, 0x83, 0xe9, - 0x64, 0xb4, 0xae, 0x6d, 0x99, 0x2e, 0xc1, 0x6f, 0xc2, 0x19, 0x86, 0x92, 0x5b, 0x46, 0x0b, 0x63, - 0xb9, 0xc8, 0xaa, 0x43, 0x75, 0xfc, 0x22, 0x9c, 0x37, 0xc9, 0xc7, 0xb4, 0x11, 0x73, 0x1b, 0xc4, - 0x3b, 0xe5, 0x1d, 0x6f, 0x0e, 0x5d, 0x3f, 0x40, 0x30, 0x7d, 0xc7, 0x6e, 0x1d, 0x6e, 0x9b, 0x58, - 0x51, 0x51, 0xe1, 0xa2, 0xe2, 0x55, 0x38, 0xdb, 0xf5, 0xad, 0xfa, 0x2d, 0xca, 0xda, 0x42, 0x08, - 0x2d, 0x84, 0x5d, 0x2c, 0xbd, 0xe3, 0x75, 0xf1, 0x86, 0xe6, 0xee, 0xab, 0x10, 0xa8, 0x7b, 0xff, - 0x8b, 0x77, 0x60, 0xfa, 0x3a, 0x31, 0xc8, 0xa1, 0x90, 0x8e, 0xd9, 0x14, 0x5f, 0x97, 0x40, 0x4c, - 0x30, 0xe4, 0x16, 0xe9, 0x11, 0xe3, 0xfd, 0x9d, 0x8f, 0x48, 0x93, 0xea, 0xbd, 0x3c, 0xbe, 0x40, - 0x81, 0x1e, 0x59, 0x05, 0x21, 0xe4, 0x8b, 0xe1, 0xf9, 0x68, 0x58, 0xa1, 0x93, 0x88, 0x3f, 0xb3, - 0x2e, 0x2f, 0x88, 0x9b, 0x2d, 0xbc, 0x07, 0xb3, 0x29, 0x97, 0x19, 0x8c, 0x2f, 0x67, 0x16, 0x22, - 0x69, 0x2f, 0x28, 0xcb, 0xb3, 0x5c, 0x5f, 0xe2, 0x2f, 0x08, 0x2e, 0x44, 0xd4, 0xe3, 0xa3, 0xf1, - 0x5e, 0x02, 0xf3, 0xcb, 0x3e, 0x16, 0xaf, 0x81, 0x9c, 0x8b, 0xc5, 0x88, 0x35, 0xdf, 0x08, 0xbe, - 0x0e, 0xe3, 0x3d, 0x9d, 0xf4, 0xfd, 0x3c, 0xce, 0xd5, 0x5e, 0x2d, 0x90, 0x87, 0xb4, 0xa5, 0x93, - 0xbe, 0xea, 0xdf, 0x16, 0x3f, 0x2b, 0xc1, 0x62, 0x8c, 0x2e, 0x49, 0x45, 0xf7, 0x04, 0xcb, 0xf8, - 0x04, 0xa8, 0x3e, 0x84, 0xe0, 0xd4, 0xb1, 0x20, 0xf8, 0x19, 0x81, 0x98, 0x05, 0x01, 0x9b, 0x1f, - 0x04, 0xca, 0x29, 0xad, 0x14, 0xce, 0x93, 0x22, 0xbd, 0xa4, 0xce, 0x70, 0xdb, 0xe8, 0xe8, 0xb3, - 0xe6, 0x0f, 0x04, 0x62, 0x62, 0xd6, 0xf0, 0x5b, 0x2e, 0x83, 0x00, 0xe8, 0x44, 0x09, 0x70, 0xbc, - 0x29, 0x75, 0x17, 0xc4, 0xc4, 0x94, 0x7a, 0xf2, 0xfc, 0xa9, 0xfd, 0x7b, 0x1e, 0xca, 0x4c, 0xbe, - 0x31, 0x34, 0xc0, 0x0e, 0xf0, 0xb7, 0x08, 0xa6, 0x12, 0xe3, 0x0d, 0x57, 0xf9, 0x38, 0xf1, 0x5e, - 0x09, 0x42, 0xf6, 0x74, 0x17, 0x57, 0x07, 0xca, 0xb9, 0x80, 0x15, 0xcb, 0x0c, 0xca, 0xcf, 0xff, - 0xfa, 0xe7, 0x9b, 0xd2, 0x0b, 0xe2, 0x9c, 0xf7, 0x90, 0xf9, 0x24, 0x10, 0x5d, 0xab, 0xca, 0xd5, - 0x83, 0xf0, 0x55, 0xe3, 0xae, 0x0c, 0x97, 0xc1, 0xa7, 0x00, 0xd1, 0x98, 0xc1, 0x2f, 0xf1, 0x3d, - 0x1d, 0x7a, 0x03, 0xe4, 0x85, 0xb4, 0x34, 0x50, 0x7c, 0x54, 0xfc, 0x40, 0x2a, 0x38, 0x08, 0xc4, - 0x3b, 0xf0, 0xc2, 0x18, 0x46, 0x21, 0x57, 0x0f, 0xf0, 0x03, 0x04, 0x4f, 0xc5, 0xf7, 0x2b, 0xbe, - 0xc4, 0xb7, 0xcc, 0x79, 0x31, 0x08, 0xd5, 0xa3, 0xa8, 0x06, 0x74, 0x13, 0xab, 0x03, 0x85, 0x8d, - 0x8e, 0x44, 0x4c, 0x3c, 0x70, 0xf0, 0x77, 0x08, 0xa6, 0x12, 0x5c, 0x48, 0xab, 0x16, 0x6f, 0x39, - 0xe7, 0x41, 0x73, 0x75, 0xa0, 0x9c, 0x8e, 0x97, 0x69, 0xb9, 0xb6, 0xe8, 0x47, 0x12, 0x3e, 0x38, - 0x79, 0x28, 0x45, 0xe5, 0x3a, 0x80, 0xa9, 0x44, 0x63, 0xa7, 0x45, 0xc6, 0xdb, 0xd1, 0xc2, 0xcc, - 0x21, 0xf6, 0xbc, 0xed, 0x3d, 0x63, 0x47, 0xaa, 0x55, 0xcd, 0xa8, 0xd6, 0x63, 0x04, 0x95, 0x8c, - 0x35, 0x8d, 0xaf, 0x1c, 0xa1, 0xab, 0xb9, 0x5c, 0x14, 0x8a, 0xcc, 0x0d, 0x91, 0x0e, 0x94, 0xe7, - 0x93, 0x1d, 0x3f, 0x3a, 0x8d, 0xfc, 0x54, 0x36, 0xc4, 0xda, 0x48, 0x91, 0xe3, 0xc9, 0xc8, 0xfc, - 0x89, 0xb9, 0x92, 0x36, 0xe0, 0xf0, 0xef, 0x08, 0xca, 0x69, 0x2b, 0x19, 0xbf, 0x91, 0xc7, 0x9c, - 0x13, 0x48, 0x5b, 0x89, 0xd7, 0xe9, 0x75, 0x5c, 0x4b, 0xab, 0x53, 0x4a, 0x66, 0x5e, 0x01, 0xff, - 0x46, 0x20, 0xa4, 0x2f, 0x27, 0x7c, 0x39, 0x97, 0x51, 0xfc, 0x8d, 0x2e, 0x5c, 0x29, 0x7e, 0x91, - 0x11, 0x73, 0x3d, 0x49, 0xcc, 0x30, 0xad, 0x42, 0x35, 0xc3, 0x5f, 0x95, 0xa0, 0x92, 0xb1, 0xbd, - 0xd2, 0xfa, 0x32, 0x7f, 0xe1, 0x15, 0x2b, 0xd0, 0x17, 0x68, 0xa0, 0xcc, 0x66, 0x75, 0x24, 0xa9, - 0xbd, 0x1b, 0x27, 0xfb, 0xa8, 0x8e, 0x54, 0xa8, 0x98, 0xe9, 0x9d, 0xfa, 0x13, 0x82, 0x4a, 0xc6, - 0xfe, 0x4b, 0x83, 0x23, 0x7f, 0x65, 0xa6, 0x8e, 0x90, 0x64, 0x6b, 0x56, 0xff, 0x47, 0x6b, 0x0a, - 0xdf, 0xa3, 0x87, 0xca, 0x5c, 0xea, 0xee, 0xfd, 0x53, 0xf9, 0x12, 0xed, 0x51, 0x6a, 0xbb, 0x2b, - 0xb2, 0xdc, 0xef, 0xf7, 0x47, 0x37, 0xb3, 0xd6, 0xa5, 0x7b, 0x72, 0xd3, 0xb0, 0xba, 0xad, 0x57, - 0x6c, 0x43, 0xa3, 0xbb, 0x96, 0xd3, 0x59, 0xce, 0x53, 0x8f, 0x7c, 0x15, 0x50, 0x95, 0x1c, 0xa2, - 0xb5, 0xd6, 0x7e, 0x45, 0x50, 0x6e, 0x5a, 0x1d, 0x2e, 0x8c, 0x6b, 0xf3, 0x69, 0xcf, 0x80, 0x4d, - 0x0f, 0xb3, 0x4d, 0xf4, 0xe1, 0x5b, 0xec, 0x5a, 0xdb, 0x32, 0x34, 0xb3, 0x2d, 0x59, 0x4e, 0x5b, - 0x6e, 0x13, 0xd3, 0x47, 0x54, 0x8e, 0xbc, 0x27, 0x7f, 0x90, 0x58, 0x8d, 0xbe, 0x7e, 0x28, 0x09, - 0x37, 0x02, 0x03, 0xeb, 0x5e, 0xc2, 0x52, 0xe4, 0x47, 0xda, 0xaa, 0x3f, 0x0c, 0x85, 0xdb, 0xbe, - 0x70, 0x3b, 0x12, 0x6e, 0x6f, 0xd5, 0x77, 0x26, 0x7c, 0x27, 0xf5, 0xff, 0x02, 0x00, 0x00, 0xff, - 0xff, 0x05, 0x93, 0x22, 0x5e, 0xce, 0x11, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// ServiceMonitoringServiceClient is the client API for ServiceMonitoringService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ServiceMonitoringServiceClient interface { - // Create a `Service`. - CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error) - // Get the named `Service`. - GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) - // List `Service`s for this workspace. - ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) - // Update this `Service`. - UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error) - // Soft delete this `Service`. - DeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*empty.Empty, error) - // Create a `ServiceLevelObjective` for the given `Service`. - CreateServiceLevelObjective(ctx context.Context, in *CreateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) - // Get a `ServiceLevelObjective` by name. - GetServiceLevelObjective(ctx context.Context, in *GetServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) - // List the `ServiceLevelObjective`s for the given `Service`. - ListServiceLevelObjectives(ctx context.Context, in *ListServiceLevelObjectivesRequest, opts ...grpc.CallOption) (*ListServiceLevelObjectivesResponse, error) - // Update the given `ServiceLevelObjective`. - UpdateServiceLevelObjective(ctx context.Context, in *UpdateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) - // Delete the given `ServiceLevelObjective`. - DeleteServiceLevelObjective(ctx context.Context, in *DeleteServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*empty.Empty, error) -} - -type serviceMonitoringServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewServiceMonitoringServiceClient(cc grpc.ClientConnInterface) ServiceMonitoringServiceClient { - return &serviceMonitoringServiceClient{cc} -} - -func (c *serviceMonitoringServiceClient) CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*Service, error) { - out := new(Service) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/CreateService", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) GetService(ctx context.Context, in *GetServiceRequest, opts ...grpc.CallOption) (*Service, error) { - out := new(Service) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/GetService", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) ListServices(ctx context.Context, in *ListServicesRequest, opts ...grpc.CallOption) (*ListServicesResponse, error) { - out := new(ListServicesResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/ListServices", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*Service, error) { - out := new(Service) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/UpdateService", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) DeleteService(ctx context.Context, in *DeleteServiceRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/DeleteService", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) CreateServiceLevelObjective(ctx context.Context, in *CreateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { - out := new(ServiceLevelObjective) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/CreateServiceLevelObjective", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) GetServiceLevelObjective(ctx context.Context, in *GetServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { - out := new(ServiceLevelObjective) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/GetServiceLevelObjective", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) ListServiceLevelObjectives(ctx context.Context, in *ListServiceLevelObjectivesRequest, opts ...grpc.CallOption) (*ListServiceLevelObjectivesResponse, error) { - out := new(ListServiceLevelObjectivesResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/ListServiceLevelObjectives", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) UpdateServiceLevelObjective(ctx context.Context, in *UpdateServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*ServiceLevelObjective, error) { - out := new(ServiceLevelObjective) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/UpdateServiceLevelObjective", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *serviceMonitoringServiceClient) DeleteServiceLevelObjective(ctx context.Context, in *DeleteServiceLevelObjectiveRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.ServiceMonitoringService/DeleteServiceLevelObjective", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ServiceMonitoringServiceServer is the server API for ServiceMonitoringService service. -type ServiceMonitoringServiceServer interface { - // Create a `Service`. - CreateService(context.Context, *CreateServiceRequest) (*Service, error) - // Get the named `Service`. - GetService(context.Context, *GetServiceRequest) (*Service, error) - // List `Service`s for this workspace. - ListServices(context.Context, *ListServicesRequest) (*ListServicesResponse, error) - // Update this `Service`. - UpdateService(context.Context, *UpdateServiceRequest) (*Service, error) - // Soft delete this `Service`. - DeleteService(context.Context, *DeleteServiceRequest) (*empty.Empty, error) - // Create a `ServiceLevelObjective` for the given `Service`. - CreateServiceLevelObjective(context.Context, *CreateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) - // Get a `ServiceLevelObjective` by name. - GetServiceLevelObjective(context.Context, *GetServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) - // List the `ServiceLevelObjective`s for the given `Service`. - ListServiceLevelObjectives(context.Context, *ListServiceLevelObjectivesRequest) (*ListServiceLevelObjectivesResponse, error) - // Update the given `ServiceLevelObjective`. - UpdateServiceLevelObjective(context.Context, *UpdateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) - // Delete the given `ServiceLevelObjective`. - DeleteServiceLevelObjective(context.Context, *DeleteServiceLevelObjectiveRequest) (*empty.Empty, error) -} - -// UnimplementedServiceMonitoringServiceServer can be embedded to have forward compatible implementations. -type UnimplementedServiceMonitoringServiceServer struct { -} - -func (*UnimplementedServiceMonitoringServiceServer) CreateService(ctx context.Context, req *CreateServiceRequest) (*Service, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateService not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) GetService(ctx context.Context, req *GetServiceRequest) (*Service, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetService not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) ListServices(ctx context.Context, req *ListServicesRequest) (*ListServicesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListServices not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) UpdateService(ctx context.Context, req *UpdateServiceRequest) (*Service, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateService not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) DeleteService(ctx context.Context, req *DeleteServiceRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteService not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) CreateServiceLevelObjective(ctx context.Context, req *CreateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateServiceLevelObjective not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) GetServiceLevelObjective(ctx context.Context, req *GetServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetServiceLevelObjective not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) ListServiceLevelObjectives(ctx context.Context, req *ListServiceLevelObjectivesRequest) (*ListServiceLevelObjectivesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListServiceLevelObjectives not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) UpdateServiceLevelObjective(ctx context.Context, req *UpdateServiceLevelObjectiveRequest) (*ServiceLevelObjective, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateServiceLevelObjective not implemented") -} -func (*UnimplementedServiceMonitoringServiceServer) DeleteServiceLevelObjective(ctx context.Context, req *DeleteServiceLevelObjectiveRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteServiceLevelObjective not implemented") -} - -func RegisterServiceMonitoringServiceServer(s *grpc.Server, srv ServiceMonitoringServiceServer) { - s.RegisterService(&_ServiceMonitoringService_serviceDesc, srv) -} - -func _ServiceMonitoringService_CreateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateServiceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).CreateService(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/CreateService", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).CreateService(ctx, req.(*CreateServiceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_GetService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetServiceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).GetService(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/GetService", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).GetService(ctx, req.(*GetServiceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_ListServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListServicesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).ListServices(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/ListServices", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).ListServices(ctx, req.(*ListServicesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_UpdateService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateServiceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).UpdateService(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/UpdateService", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).UpdateService(ctx, req.(*UpdateServiceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_DeleteService_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteServiceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).DeleteService(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/DeleteService", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).DeleteService(ctx, req.(*DeleteServiceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_CreateServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateServiceLevelObjectiveRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).CreateServiceLevelObjective(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/CreateServiceLevelObjective", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).CreateServiceLevelObjective(ctx, req.(*CreateServiceLevelObjectiveRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_GetServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetServiceLevelObjectiveRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).GetServiceLevelObjective(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/GetServiceLevelObjective", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).GetServiceLevelObjective(ctx, req.(*GetServiceLevelObjectiveRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_ListServiceLevelObjectives_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListServiceLevelObjectivesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).ListServiceLevelObjectives(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/ListServiceLevelObjectives", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).ListServiceLevelObjectives(ctx, req.(*ListServiceLevelObjectivesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_UpdateServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateServiceLevelObjectiveRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).UpdateServiceLevelObjective(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/UpdateServiceLevelObjective", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).UpdateServiceLevelObjective(ctx, req.(*UpdateServiceLevelObjectiveRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ServiceMonitoringService_DeleteServiceLevelObjective_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteServiceLevelObjectiveRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ServiceMonitoringServiceServer).DeleteServiceLevelObjective(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.ServiceMonitoringService/DeleteServiceLevelObjective", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServiceMonitoringServiceServer).DeleteServiceLevelObjective(ctx, req.(*DeleteServiceLevelObjectiveRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _ServiceMonitoringService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.ServiceMonitoringService", - HandlerType: (*ServiceMonitoringServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "CreateService", - Handler: _ServiceMonitoringService_CreateService_Handler, - }, - { - MethodName: "GetService", - Handler: _ServiceMonitoringService_GetService_Handler, - }, - { - MethodName: "ListServices", - Handler: _ServiceMonitoringService_ListServices_Handler, - }, - { - MethodName: "UpdateService", - Handler: _ServiceMonitoringService_UpdateService_Handler, - }, - { - MethodName: "DeleteService", - Handler: _ServiceMonitoringService_DeleteService_Handler, - }, - { - MethodName: "CreateServiceLevelObjective", - Handler: _ServiceMonitoringService_CreateServiceLevelObjective_Handler, - }, - { - MethodName: "GetServiceLevelObjective", - Handler: _ServiceMonitoringService_GetServiceLevelObjective_Handler, - }, - { - MethodName: "ListServiceLevelObjectives", - Handler: _ServiceMonitoringService_ListServiceLevelObjectives_Handler, - }, - { - MethodName: "UpdateServiceLevelObjective", - Handler: _ServiceMonitoringService_UpdateServiceLevelObjective_Handler, - }, - { - MethodName: "DeleteServiceLevelObjective", - Handler: _ServiceMonitoringService_DeleteServiceLevelObjective_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/service_service.proto", -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/span_context.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/span_context.pb.go deleted file mode 100644 index 8ba8246b2..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/span_context.pb.go +++ /dev/null @@ -1,100 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/span_context.proto - -package monitoring - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The context of a span, attached to google.api.Distribution.Exemplars -// in google.api.Distribution values during aggregation. -// -// It contains the name of a span with format: -// projects/[PROJECT_ID]/traces/[TRACE_ID]/spans/[SPAN_ID] -type SpanContext struct { - // The resource name of the span in the following format: - // - // projects/[PROJECT_ID]/traces/[TRACE_ID]/spans/[SPAN_ID] - // - // [TRACE_ID] is a unique identifier for a trace within a project; - // it is a 32-character hexadecimal encoding of a 16-byte array. - // - // [SPAN_ID] is a unique identifier for a span within a trace; it - // is a 16-character hexadecimal encoding of an 8-byte array. - SpanName string `protobuf:"bytes,1,opt,name=span_name,json=spanName,proto3" json:"span_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SpanContext) Reset() { *m = SpanContext{} } -func (m *SpanContext) String() string { return proto.CompactTextString(m) } -func (*SpanContext) ProtoMessage() {} -func (*SpanContext) Descriptor() ([]byte, []int) { - return fileDescriptor_933032e252f1c5e4, []int{0} -} - -func (m *SpanContext) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SpanContext.Unmarshal(m, b) -} -func (m *SpanContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SpanContext.Marshal(b, m, deterministic) -} -func (m *SpanContext) XXX_Merge(src proto.Message) { - xxx_messageInfo_SpanContext.Merge(m, src) -} -func (m *SpanContext) XXX_Size() int { - return xxx_messageInfo_SpanContext.Size(m) -} -func (m *SpanContext) XXX_DiscardUnknown() { - xxx_messageInfo_SpanContext.DiscardUnknown(m) -} - -var xxx_messageInfo_SpanContext proto.InternalMessageInfo - -func (m *SpanContext) GetSpanName() string { - if m != nil { - return m.SpanName - } - return "" -} - -func init() { - proto.RegisterType((*SpanContext)(nil), "google.monitoring.v3.SpanContext") -} - -func init() { - proto.RegisterFile("google/monitoring/v3/span_context.proto", fileDescriptor_933032e252f1c5e4) -} - -var fileDescriptor_933032e252f1c5e4 = []byte{ - // 197 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4f, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0xcf, 0xcd, 0xcf, 0xcb, 0x2c, 0xc9, 0x2f, 0xca, 0xcc, 0x4b, 0xd7, 0x2f, 0x33, - 0xd6, 0x2f, 0x2e, 0x48, 0xcc, 0x8b, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xad, 0x28, 0xd1, 0x2b, 0x28, - 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x81, 0x28, 0xd4, 0x43, 0x28, 0xd4, 0x2b, 0x33, 0x56, 0xd2, 0xe2, - 0xe2, 0x0e, 0x2e, 0x48, 0xcc, 0x73, 0x86, 0x28, 0x15, 0x92, 0xe6, 0xe2, 0x04, 0x6b, 0xcd, 0x4b, - 0xcc, 0x4d, 0x95, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0xe2, 0x00, 0x09, 0xf8, 0x25, 0xe6, 0xa6, - 0x3a, 0xad, 0x60, 0xe4, 0x92, 0x48, 0xce, 0xcf, 0xd5, 0xc3, 0x66, 0x90, 0x93, 0x00, 0x92, 0x31, - 0x01, 0x20, 0x0b, 0x03, 0x18, 0xa3, 0xec, 0xa0, 0x2a, 0xd3, 0xf3, 0x73, 0x12, 0xf3, 0xd2, 0xf5, - 0xf2, 0x8b, 0xd2, 0xf5, 0xd3, 0x53, 0xf3, 0xc0, 0xce, 0xd1, 0x87, 0x48, 0x25, 0x16, 0x64, 0x16, - 0xa3, 0x3a, 0xdd, 0x1a, 0xc1, 0x5b, 0xc5, 0x24, 0xe5, 0x0e, 0x31, 0xc0, 0x39, 0x27, 0xbf, 0x34, - 0x45, 0xcf, 0x17, 0x61, 0x61, 0x98, 0xf1, 0x29, 0x98, 0x64, 0x0c, 0x58, 0x32, 0x06, 0x21, 0x19, - 0x13, 0x66, 0x9c, 0xc4, 0x06, 0xb6, 0xc4, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0xbd, 0x19, 0x01, - 0xcb, 0x1e, 0x01, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/uptime.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/uptime.pb.go deleted file mode 100644 index 3a024c6c4..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/uptime.pb.go +++ /dev/null @@ -1,1019 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/uptime.proto - -package monitoring - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - duration "github.com/golang/protobuf/ptypes/duration" - _ "google.golang.org/genproto/googleapis/api/annotations" - monitoredres "google.golang.org/genproto/googleapis/api/monitoredres" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The regions from which an Uptime check can be run. -type UptimeCheckRegion int32 - -const ( - // Default value if no region is specified. Will result in Uptime checks - // running from all regions. - UptimeCheckRegion_REGION_UNSPECIFIED UptimeCheckRegion = 0 - // Allows checks to run from locations within the United States of America. - UptimeCheckRegion_USA UptimeCheckRegion = 1 - // Allows checks to run from locations within the continent of Europe. - UptimeCheckRegion_EUROPE UptimeCheckRegion = 2 - // Allows checks to run from locations within the continent of South - // America. - UptimeCheckRegion_SOUTH_AMERICA UptimeCheckRegion = 3 - // Allows checks to run from locations within the Asia Pacific area (ex: - // Singapore). - UptimeCheckRegion_ASIA_PACIFIC UptimeCheckRegion = 4 -) - -var UptimeCheckRegion_name = map[int32]string{ - 0: "REGION_UNSPECIFIED", - 1: "USA", - 2: "EUROPE", - 3: "SOUTH_AMERICA", - 4: "ASIA_PACIFIC", -} - -var UptimeCheckRegion_value = map[string]int32{ - "REGION_UNSPECIFIED": 0, - "USA": 1, - "EUROPE": 2, - "SOUTH_AMERICA": 3, - "ASIA_PACIFIC": 4, -} - -func (x UptimeCheckRegion) String() string { - return proto.EnumName(UptimeCheckRegion_name, int32(x)) -} - -func (UptimeCheckRegion) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{0} -} - -// The supported resource types that can be used as values of -// `group_resource.resource_type`. -// `INSTANCE` includes `gce_instance` and `aws_ec2_instance` resource types. -// The resource types `gae_app` and `uptime_url` are not valid here because -// group checks on App Engine modules and URLs are not allowed. -type GroupResourceType int32 - -const ( - // Default value (not valid). - GroupResourceType_RESOURCE_TYPE_UNSPECIFIED GroupResourceType = 0 - // A group of instances from Google Cloud Platform (GCP) or - // Amazon Web Services (AWS). - GroupResourceType_INSTANCE GroupResourceType = 1 - // A group of Amazon ELB load balancers. - GroupResourceType_AWS_ELB_LOAD_BALANCER GroupResourceType = 2 -) - -var GroupResourceType_name = map[int32]string{ - 0: "RESOURCE_TYPE_UNSPECIFIED", - 1: "INSTANCE", - 2: "AWS_ELB_LOAD_BALANCER", -} - -var GroupResourceType_value = map[string]int32{ - "RESOURCE_TYPE_UNSPECIFIED": 0, - "INSTANCE": 1, - "AWS_ELB_LOAD_BALANCER": 2, -} - -func (x GroupResourceType) String() string { - return proto.EnumName(GroupResourceType_name, int32(x)) -} - -func (GroupResourceType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{1} -} - -// Operational states for an internal checker. -type InternalChecker_State int32 - -const ( - // An internal checker should never be in the unspecified state. - InternalChecker_UNSPECIFIED InternalChecker_State = 0 - // The checker is being created, provisioned, and configured. A checker in - // this state can be returned by `ListInternalCheckers` or - // `GetInternalChecker`, as well as by examining the [long running - // Operation](https://cloud.google.com/apis/design/design_patterns#long_running_operations) - // that created it. - InternalChecker_CREATING InternalChecker_State = 1 - // The checker is running and available for use. A checker in this state - // can be returned by `ListInternalCheckers` or `GetInternalChecker` as - // well as by examining the [long running - // Operation](https://cloud.google.com/apis/design/design_patterns#long_running_operations) - // that created it. - // If a checker is being torn down, it is neither visible nor usable, so - // there is no "deleting" or "down" state. - InternalChecker_RUNNING InternalChecker_State = 2 -) - -var InternalChecker_State_name = map[int32]string{ - 0: "UNSPECIFIED", - 1: "CREATING", - 2: "RUNNING", -} - -var InternalChecker_State_value = map[string]int32{ - "UNSPECIFIED": 0, - "CREATING": 1, - "RUNNING": 2, -} - -func (x InternalChecker_State) String() string { - return proto.EnumName(InternalChecker_State_name, int32(x)) -} - -func (InternalChecker_State) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{0, 0} -} - -// Options to perform content matching. -type UptimeCheckConfig_ContentMatcher_ContentMatcherOption int32 - -const ( - // No content matcher type specified (maintained for backward - // compatibility, but deprecated for future use). - // Treated as `CONTAINS_STRING`. - UptimeCheckConfig_ContentMatcher_CONTENT_MATCHER_OPTION_UNSPECIFIED UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 0 - // Selects substring matching. The match succeeds if the output contains - // the `content` string. This is the default value for checks without - // a `matcher` option, or where the value of `matcher` is - // `CONTENT_MATCHER_OPTION_UNSPECIFIED`. - UptimeCheckConfig_ContentMatcher_CONTAINS_STRING UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 1 - // Selects negation of substring matching. The match succeeds if the - // output does _NOT_ contain the `content` string. - UptimeCheckConfig_ContentMatcher_NOT_CONTAINS_STRING UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 2 - // Selects regular-expression matching. The match succeeds of the output - // matches the regular expression specified in the `content` string. - UptimeCheckConfig_ContentMatcher_MATCHES_REGEX UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 3 - // Selects negation of regular-expression matching. The match succeeds if - // the output does _NOT_ match the regular expression specified in the - // `content` string. - UptimeCheckConfig_ContentMatcher_NOT_MATCHES_REGEX UptimeCheckConfig_ContentMatcher_ContentMatcherOption = 4 -) - -var UptimeCheckConfig_ContentMatcher_ContentMatcherOption_name = map[int32]string{ - 0: "CONTENT_MATCHER_OPTION_UNSPECIFIED", - 1: "CONTAINS_STRING", - 2: "NOT_CONTAINS_STRING", - 3: "MATCHES_REGEX", - 4: "NOT_MATCHES_REGEX", -} - -var UptimeCheckConfig_ContentMatcher_ContentMatcherOption_value = map[string]int32{ - "CONTENT_MATCHER_OPTION_UNSPECIFIED": 0, - "CONTAINS_STRING": 1, - "NOT_CONTAINS_STRING": 2, - "MATCHES_REGEX": 3, - "NOT_MATCHES_REGEX": 4, -} - -func (x UptimeCheckConfig_ContentMatcher_ContentMatcherOption) String() string { - return proto.EnumName(UptimeCheckConfig_ContentMatcher_ContentMatcherOption_name, int32(x)) -} - -func (UptimeCheckConfig_ContentMatcher_ContentMatcherOption) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{1, 3, 0} -} - -// An internal checker allows Uptime checks to run on private/internal GCP -// resources. -// -// Deprecated: Do not use. -type InternalChecker struct { - // A unique resource name for this InternalChecker. The format is: - // - // `projects/[PROJECT_ID]/internalCheckers/[INTERNAL_CHECKER_ID]`. - // - // `[PROJECT_ID]` is the Stackdriver Workspace project for the - // Uptime check config associated with the internal checker. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The checker's human-readable name. The display name - // should be unique within a Stackdriver Workspace in order to make it easier - // to identify; however, uniqueness is not enforced. - DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // The [GCP VPC network](https://cloud.google.com/vpc/docs/vpc) where the - // internal resource lives (ex: "default"). - Network string `protobuf:"bytes,3,opt,name=network,proto3" json:"network,omitempty"` - // The GCP zone the Uptime check should egress from. Only respected for - // internal Uptime checks, where internal_network is specified. - GcpZone string `protobuf:"bytes,4,opt,name=gcp_zone,json=gcpZone,proto3" json:"gcp_zone,omitempty"` - // The GCP project ID where the internal checker lives. Not necessary - // the same as the Workspace project. - PeerProjectId string `protobuf:"bytes,6,opt,name=peer_project_id,json=peerProjectId,proto3" json:"peer_project_id,omitempty"` - // The current operational state of the internal checker. - State InternalChecker_State `protobuf:"varint,7,opt,name=state,proto3,enum=google.monitoring.v3.InternalChecker_State" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *InternalChecker) Reset() { *m = InternalChecker{} } -func (m *InternalChecker) String() string { return proto.CompactTextString(m) } -func (*InternalChecker) ProtoMessage() {} -func (*InternalChecker) Descriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{0} -} - -func (m *InternalChecker) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_InternalChecker.Unmarshal(m, b) -} -func (m *InternalChecker) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_InternalChecker.Marshal(b, m, deterministic) -} -func (m *InternalChecker) XXX_Merge(src proto.Message) { - xxx_messageInfo_InternalChecker.Merge(m, src) -} -func (m *InternalChecker) XXX_Size() int { - return xxx_messageInfo_InternalChecker.Size(m) -} -func (m *InternalChecker) XXX_DiscardUnknown() { - xxx_messageInfo_InternalChecker.DiscardUnknown(m) -} - -var xxx_messageInfo_InternalChecker proto.InternalMessageInfo - -func (m *InternalChecker) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *InternalChecker) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -func (m *InternalChecker) GetNetwork() string { - if m != nil { - return m.Network - } - return "" -} - -func (m *InternalChecker) GetGcpZone() string { - if m != nil { - return m.GcpZone - } - return "" -} - -func (m *InternalChecker) GetPeerProjectId() string { - if m != nil { - return m.PeerProjectId - } - return "" -} - -func (m *InternalChecker) GetState() InternalChecker_State { - if m != nil { - return m.State - } - return InternalChecker_UNSPECIFIED -} - -// This message configures which resources and services to monitor for -// availability. -type UptimeCheckConfig struct { - // A unique resource name for this Uptime check configuration. The format is: - // - // `projects/[PROJECT_ID]/uptimeCheckConfigs/[UPTIME_CHECK_ID]`. - // - // This field should be omitted when creating the Uptime check configuration; - // on create, the resource name is assigned by the server and included in the - // response. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // A human-friendly name for the Uptime check configuration. The display name - // should be unique within a Stackdriver Workspace in order to make it easier - // to identify; however, uniqueness is not enforced. Required. - DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // The resource the check is checking. Required. - // - // Types that are valid to be assigned to Resource: - // *UptimeCheckConfig_MonitoredResource - // *UptimeCheckConfig_ResourceGroup_ - Resource isUptimeCheckConfig_Resource `protobuf_oneof:"resource"` - // The type of Uptime check request. - // - // Types that are valid to be assigned to CheckRequestType: - // *UptimeCheckConfig_HttpCheck_ - // *UptimeCheckConfig_TcpCheck_ - CheckRequestType isUptimeCheckConfig_CheckRequestType `protobuf_oneof:"check_request_type"` - // How often, in seconds, the Uptime check is performed. - // Currently, the only supported values are `60s` (1 minute), `300s` - // (5 minutes), `600s` (10 minutes), and `900s` (15 minutes). Optional, - // defaults to `60s`. - Period *duration.Duration `protobuf:"bytes,7,opt,name=period,proto3" json:"period,omitempty"` - // The maximum amount of time to wait for the request to complete (must be - // between 1 and 60 seconds). Required. - Timeout *duration.Duration `protobuf:"bytes,8,opt,name=timeout,proto3" json:"timeout,omitempty"` - // The content that is expected to appear in the data returned by the target - // server against which the check is run. Currently, only the first entry - // in the `content_matchers` list is supported, and additional entries will - // be ignored. This field is optional and should only be specified if a - // content match is required as part of the/ Uptime check. - ContentMatchers []*UptimeCheckConfig_ContentMatcher `protobuf:"bytes,9,rep,name=content_matchers,json=contentMatchers,proto3" json:"content_matchers,omitempty"` - // The list of regions from which the check will be run. - // Some regions contain one location, and others contain more than one. - // If this field is specified, enough regions must be provided to include a - // minimum of 3 locations. Not specifying this field will result in Uptime - // checks running from all available regions. - SelectedRegions []UptimeCheckRegion `protobuf:"varint,10,rep,packed,name=selected_regions,json=selectedRegions,proto3,enum=google.monitoring.v3.UptimeCheckRegion" json:"selected_regions,omitempty"` - // If this is `true`, then checks are made only from the 'internal_checkers'. - // If it is `false`, then checks are made only from the 'selected_regions'. - // It is an error to provide 'selected_regions' when is_internal is `true`, - // or to provide 'internal_checkers' when is_internal is `false`. - IsInternal bool `protobuf:"varint,15,opt,name=is_internal,json=isInternal,proto3" json:"is_internal,omitempty"` // Deprecated: Do not use. - // The internal checkers that this check will egress from. If `is_internal` is - // `true` and this list is empty, the check will egress from all the - // InternalCheckers configured for the project that owns this - // `UptimeCheckConfig`. - InternalCheckers []*InternalChecker `protobuf:"bytes,14,rep,name=internal_checkers,json=internalCheckers,proto3" json:"internal_checkers,omitempty"` // Deprecated: Do not use. - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UptimeCheckConfig) Reset() { *m = UptimeCheckConfig{} } -func (m *UptimeCheckConfig) String() string { return proto.CompactTextString(m) } -func (*UptimeCheckConfig) ProtoMessage() {} -func (*UptimeCheckConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{1} -} - -func (m *UptimeCheckConfig) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UptimeCheckConfig.Unmarshal(m, b) -} -func (m *UptimeCheckConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UptimeCheckConfig.Marshal(b, m, deterministic) -} -func (m *UptimeCheckConfig) XXX_Merge(src proto.Message) { - xxx_messageInfo_UptimeCheckConfig.Merge(m, src) -} -func (m *UptimeCheckConfig) XXX_Size() int { - return xxx_messageInfo_UptimeCheckConfig.Size(m) -} -func (m *UptimeCheckConfig) XXX_DiscardUnknown() { - xxx_messageInfo_UptimeCheckConfig.DiscardUnknown(m) -} - -var xxx_messageInfo_UptimeCheckConfig proto.InternalMessageInfo - -func (m *UptimeCheckConfig) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *UptimeCheckConfig) GetDisplayName() string { - if m != nil { - return m.DisplayName - } - return "" -} - -type isUptimeCheckConfig_Resource interface { - isUptimeCheckConfig_Resource() -} - -type UptimeCheckConfig_MonitoredResource struct { - MonitoredResource *monitoredres.MonitoredResource `protobuf:"bytes,3,opt,name=monitored_resource,json=monitoredResource,proto3,oneof"` -} - -type UptimeCheckConfig_ResourceGroup_ struct { - ResourceGroup *UptimeCheckConfig_ResourceGroup `protobuf:"bytes,4,opt,name=resource_group,json=resourceGroup,proto3,oneof"` -} - -func (*UptimeCheckConfig_MonitoredResource) isUptimeCheckConfig_Resource() {} - -func (*UptimeCheckConfig_ResourceGroup_) isUptimeCheckConfig_Resource() {} - -func (m *UptimeCheckConfig) GetResource() isUptimeCheckConfig_Resource { - if m != nil { - return m.Resource - } - return nil -} - -func (m *UptimeCheckConfig) GetMonitoredResource() *monitoredres.MonitoredResource { - if x, ok := m.GetResource().(*UptimeCheckConfig_MonitoredResource); ok { - return x.MonitoredResource - } - return nil -} - -func (m *UptimeCheckConfig) GetResourceGroup() *UptimeCheckConfig_ResourceGroup { - if x, ok := m.GetResource().(*UptimeCheckConfig_ResourceGroup_); ok { - return x.ResourceGroup - } - return nil -} - -type isUptimeCheckConfig_CheckRequestType interface { - isUptimeCheckConfig_CheckRequestType() -} - -type UptimeCheckConfig_HttpCheck_ struct { - HttpCheck *UptimeCheckConfig_HttpCheck `protobuf:"bytes,5,opt,name=http_check,json=httpCheck,proto3,oneof"` -} - -type UptimeCheckConfig_TcpCheck_ struct { - TcpCheck *UptimeCheckConfig_TcpCheck `protobuf:"bytes,6,opt,name=tcp_check,json=tcpCheck,proto3,oneof"` -} - -func (*UptimeCheckConfig_HttpCheck_) isUptimeCheckConfig_CheckRequestType() {} - -func (*UptimeCheckConfig_TcpCheck_) isUptimeCheckConfig_CheckRequestType() {} - -func (m *UptimeCheckConfig) GetCheckRequestType() isUptimeCheckConfig_CheckRequestType { - if m != nil { - return m.CheckRequestType - } - return nil -} - -func (m *UptimeCheckConfig) GetHttpCheck() *UptimeCheckConfig_HttpCheck { - if x, ok := m.GetCheckRequestType().(*UptimeCheckConfig_HttpCheck_); ok { - return x.HttpCheck - } - return nil -} - -func (m *UptimeCheckConfig) GetTcpCheck() *UptimeCheckConfig_TcpCheck { - if x, ok := m.GetCheckRequestType().(*UptimeCheckConfig_TcpCheck_); ok { - return x.TcpCheck - } - return nil -} - -func (m *UptimeCheckConfig) GetPeriod() *duration.Duration { - if m != nil { - return m.Period - } - return nil -} - -func (m *UptimeCheckConfig) GetTimeout() *duration.Duration { - if m != nil { - return m.Timeout - } - return nil -} - -func (m *UptimeCheckConfig) GetContentMatchers() []*UptimeCheckConfig_ContentMatcher { - if m != nil { - return m.ContentMatchers - } - return nil -} - -func (m *UptimeCheckConfig) GetSelectedRegions() []UptimeCheckRegion { - if m != nil { - return m.SelectedRegions - } - return nil -} - -// Deprecated: Do not use. -func (m *UptimeCheckConfig) GetIsInternal() bool { - if m != nil { - return m.IsInternal - } - return false -} - -// Deprecated: Do not use. -func (m *UptimeCheckConfig) GetInternalCheckers() []*InternalChecker { - if m != nil { - return m.InternalCheckers - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*UptimeCheckConfig) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*UptimeCheckConfig_MonitoredResource)(nil), - (*UptimeCheckConfig_ResourceGroup_)(nil), - (*UptimeCheckConfig_HttpCheck_)(nil), - (*UptimeCheckConfig_TcpCheck_)(nil), - } -} - -// The resource submessage for group checks. It can be used instead of a -// monitored resource, when multiple resources are being monitored. -type UptimeCheckConfig_ResourceGroup struct { - // The group of resources being monitored. Should be only the `[GROUP_ID]`, - // and not the full-path `projects/[PROJECT_ID]/groups/[GROUP_ID]`. - GroupId string `protobuf:"bytes,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - // The resource type of the group members. - ResourceType GroupResourceType `protobuf:"varint,2,opt,name=resource_type,json=resourceType,proto3,enum=google.monitoring.v3.GroupResourceType" json:"resource_type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UptimeCheckConfig_ResourceGroup) Reset() { *m = UptimeCheckConfig_ResourceGroup{} } -func (m *UptimeCheckConfig_ResourceGroup) String() string { return proto.CompactTextString(m) } -func (*UptimeCheckConfig_ResourceGroup) ProtoMessage() {} -func (*UptimeCheckConfig_ResourceGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{1, 0} -} - -func (m *UptimeCheckConfig_ResourceGroup) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UptimeCheckConfig_ResourceGroup.Unmarshal(m, b) -} -func (m *UptimeCheckConfig_ResourceGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UptimeCheckConfig_ResourceGroup.Marshal(b, m, deterministic) -} -func (m *UptimeCheckConfig_ResourceGroup) XXX_Merge(src proto.Message) { - xxx_messageInfo_UptimeCheckConfig_ResourceGroup.Merge(m, src) -} -func (m *UptimeCheckConfig_ResourceGroup) XXX_Size() int { - return xxx_messageInfo_UptimeCheckConfig_ResourceGroup.Size(m) -} -func (m *UptimeCheckConfig_ResourceGroup) XXX_DiscardUnknown() { - xxx_messageInfo_UptimeCheckConfig_ResourceGroup.DiscardUnknown(m) -} - -var xxx_messageInfo_UptimeCheckConfig_ResourceGroup proto.InternalMessageInfo - -func (m *UptimeCheckConfig_ResourceGroup) GetGroupId() string { - if m != nil { - return m.GroupId - } - return "" -} - -func (m *UptimeCheckConfig_ResourceGroup) GetResourceType() GroupResourceType { - if m != nil { - return m.ResourceType - } - return GroupResourceType_RESOURCE_TYPE_UNSPECIFIED -} - -// Information involved in an HTTP/HTTPS Uptime check request. -type UptimeCheckConfig_HttpCheck struct { - // If `true`, use HTTPS instead of HTTP to run the check. - UseSsl bool `protobuf:"varint,1,opt,name=use_ssl,json=useSsl,proto3" json:"use_ssl,omitempty"` - // Optional (defaults to "/"). The path to the page against which to run - // the check. Will be combined with the `host` (specified within the - // `monitored_resource`) and `port` to construct the full URL. If the - // provided path does not begin with "/", a "/" will be prepended - // automatically. - Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - // Optional (defaults to 80 when `use_ssl` is `false`, and 443 when - // `use_ssl` is `true`). The TCP port on the HTTP server against which to - // run the check. Will be combined with host (specified within the - // `monitored_resource`) and `path` to construct the full URL. - Port int32 `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"` - // The authentication information. Optional when creating an HTTP check; - // defaults to empty. - AuthInfo *UptimeCheckConfig_HttpCheck_BasicAuthentication `protobuf:"bytes,4,opt,name=auth_info,json=authInfo,proto3" json:"auth_info,omitempty"` - // Boolean specifiying whether to encrypt the header information. - // Encryption should be specified for any headers related to authentication - // that you do not wish to be seen when retrieving the configuration. The - // server will be responsible for encrypting the headers. - // On Get/List calls, if `mask_headers` is set to `true` then the headers - // will be obscured with `******.` - MaskHeaders bool `protobuf:"varint,5,opt,name=mask_headers,json=maskHeaders,proto3" json:"mask_headers,omitempty"` - // The list of headers to send as part of the Uptime check request. - // If two headers have the same key and different values, they should - // be entered as a single header, with the value being a comma-separated - // list of all the desired values as described at - // https://www.w3.org/Protocols/rfc2616/rfc2616.txt (page 31). - // Entering two separate headers with the same key in a Create call will - // cause the first to be overwritten by the second. - // The maximum number of headers allowed is 100. - Headers map[string]string `protobuf:"bytes,6,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Boolean specifying whether to include SSL certificate validation as a - // part of the Uptime check. Only applies to checks where - // `monitored_resource` is set to `uptime_url`. If `use_ssl` is `false`, - // setting `validate_ssl` to `true` has no effect. - ValidateSsl bool `protobuf:"varint,7,opt,name=validate_ssl,json=validateSsl,proto3" json:"validate_ssl,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UptimeCheckConfig_HttpCheck) Reset() { *m = UptimeCheckConfig_HttpCheck{} } -func (m *UptimeCheckConfig_HttpCheck) String() string { return proto.CompactTextString(m) } -func (*UptimeCheckConfig_HttpCheck) ProtoMessage() {} -func (*UptimeCheckConfig_HttpCheck) Descriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{1, 1} -} - -func (m *UptimeCheckConfig_HttpCheck) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UptimeCheckConfig_HttpCheck.Unmarshal(m, b) -} -func (m *UptimeCheckConfig_HttpCheck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UptimeCheckConfig_HttpCheck.Marshal(b, m, deterministic) -} -func (m *UptimeCheckConfig_HttpCheck) XXX_Merge(src proto.Message) { - xxx_messageInfo_UptimeCheckConfig_HttpCheck.Merge(m, src) -} -func (m *UptimeCheckConfig_HttpCheck) XXX_Size() int { - return xxx_messageInfo_UptimeCheckConfig_HttpCheck.Size(m) -} -func (m *UptimeCheckConfig_HttpCheck) XXX_DiscardUnknown() { - xxx_messageInfo_UptimeCheckConfig_HttpCheck.DiscardUnknown(m) -} - -var xxx_messageInfo_UptimeCheckConfig_HttpCheck proto.InternalMessageInfo - -func (m *UptimeCheckConfig_HttpCheck) GetUseSsl() bool { - if m != nil { - return m.UseSsl - } - return false -} - -func (m *UptimeCheckConfig_HttpCheck) GetPath() string { - if m != nil { - return m.Path - } - return "" -} - -func (m *UptimeCheckConfig_HttpCheck) GetPort() int32 { - if m != nil { - return m.Port - } - return 0 -} - -func (m *UptimeCheckConfig_HttpCheck) GetAuthInfo() *UptimeCheckConfig_HttpCheck_BasicAuthentication { - if m != nil { - return m.AuthInfo - } - return nil -} - -func (m *UptimeCheckConfig_HttpCheck) GetMaskHeaders() bool { - if m != nil { - return m.MaskHeaders - } - return false -} - -func (m *UptimeCheckConfig_HttpCheck) GetHeaders() map[string]string { - if m != nil { - return m.Headers - } - return nil -} - -func (m *UptimeCheckConfig_HttpCheck) GetValidateSsl() bool { - if m != nil { - return m.ValidateSsl - } - return false -} - -// The authentication parameters to provide to the specified resource or -// URL that requires a username and password. Currently, only -// [Basic HTTP authentication](https://tools.ietf.org/html/rfc7617) is -// supported in Uptime checks. -type UptimeCheckConfig_HttpCheck_BasicAuthentication struct { - // The username to use when authenticating with the HTTP server. - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - // The password to use when authenticating with the HTTP server. - Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UptimeCheckConfig_HttpCheck_BasicAuthentication) Reset() { - *m = UptimeCheckConfig_HttpCheck_BasicAuthentication{} -} -func (m *UptimeCheckConfig_HttpCheck_BasicAuthentication) String() string { - return proto.CompactTextString(m) -} -func (*UptimeCheckConfig_HttpCheck_BasicAuthentication) ProtoMessage() {} -func (*UptimeCheckConfig_HttpCheck_BasicAuthentication) Descriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{1, 1, 0} -} - -func (m *UptimeCheckConfig_HttpCheck_BasicAuthentication) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UptimeCheckConfig_HttpCheck_BasicAuthentication.Unmarshal(m, b) -} -func (m *UptimeCheckConfig_HttpCheck_BasicAuthentication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UptimeCheckConfig_HttpCheck_BasicAuthentication.Marshal(b, m, deterministic) -} -func (m *UptimeCheckConfig_HttpCheck_BasicAuthentication) XXX_Merge(src proto.Message) { - xxx_messageInfo_UptimeCheckConfig_HttpCheck_BasicAuthentication.Merge(m, src) -} -func (m *UptimeCheckConfig_HttpCheck_BasicAuthentication) XXX_Size() int { - return xxx_messageInfo_UptimeCheckConfig_HttpCheck_BasicAuthentication.Size(m) -} -func (m *UptimeCheckConfig_HttpCheck_BasicAuthentication) XXX_DiscardUnknown() { - xxx_messageInfo_UptimeCheckConfig_HttpCheck_BasicAuthentication.DiscardUnknown(m) -} - -var xxx_messageInfo_UptimeCheckConfig_HttpCheck_BasicAuthentication proto.InternalMessageInfo - -func (m *UptimeCheckConfig_HttpCheck_BasicAuthentication) GetUsername() string { - if m != nil { - return m.Username - } - return "" -} - -func (m *UptimeCheckConfig_HttpCheck_BasicAuthentication) GetPassword() string { - if m != nil { - return m.Password - } - return "" -} - -// Information required for a TCP Uptime check request. -type UptimeCheckConfig_TcpCheck struct { - // The TCP port on the server against which to run the check. Will be - // combined with host (specified within the `monitored_resource`) to - // construct the full URL. Required. - Port int32 `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UptimeCheckConfig_TcpCheck) Reset() { *m = UptimeCheckConfig_TcpCheck{} } -func (m *UptimeCheckConfig_TcpCheck) String() string { return proto.CompactTextString(m) } -func (*UptimeCheckConfig_TcpCheck) ProtoMessage() {} -func (*UptimeCheckConfig_TcpCheck) Descriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{1, 2} -} - -func (m *UptimeCheckConfig_TcpCheck) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UptimeCheckConfig_TcpCheck.Unmarshal(m, b) -} -func (m *UptimeCheckConfig_TcpCheck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UptimeCheckConfig_TcpCheck.Marshal(b, m, deterministic) -} -func (m *UptimeCheckConfig_TcpCheck) XXX_Merge(src proto.Message) { - xxx_messageInfo_UptimeCheckConfig_TcpCheck.Merge(m, src) -} -func (m *UptimeCheckConfig_TcpCheck) XXX_Size() int { - return xxx_messageInfo_UptimeCheckConfig_TcpCheck.Size(m) -} -func (m *UptimeCheckConfig_TcpCheck) XXX_DiscardUnknown() { - xxx_messageInfo_UptimeCheckConfig_TcpCheck.DiscardUnknown(m) -} - -var xxx_messageInfo_UptimeCheckConfig_TcpCheck proto.InternalMessageInfo - -func (m *UptimeCheckConfig_TcpCheck) GetPort() int32 { - if m != nil { - return m.Port - } - return 0 -} - -// Optional. Used to perform content matching. This allows matching based on -// substrings and regular expressions, together with their negations. Only the -// first 4 MB of an HTTP or HTTPS check's response (and the first -// 1 MB of a TCP check's response) are examined for purposes of content -// matching. -type UptimeCheckConfig_ContentMatcher struct { - // String or regex content to match. Maximum 1024 bytes. An empty `content` - // string indicates no content matching is to be performed. - Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` - // The type of content matcher that will be applied to the server output, - // compared to the `content` string when the check is run. - Matcher UptimeCheckConfig_ContentMatcher_ContentMatcherOption `protobuf:"varint,2,opt,name=matcher,proto3,enum=google.monitoring.v3.UptimeCheckConfig_ContentMatcher_ContentMatcherOption" json:"matcher,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UptimeCheckConfig_ContentMatcher) Reset() { *m = UptimeCheckConfig_ContentMatcher{} } -func (m *UptimeCheckConfig_ContentMatcher) String() string { return proto.CompactTextString(m) } -func (*UptimeCheckConfig_ContentMatcher) ProtoMessage() {} -func (*UptimeCheckConfig_ContentMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{1, 3} -} - -func (m *UptimeCheckConfig_ContentMatcher) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UptimeCheckConfig_ContentMatcher.Unmarshal(m, b) -} -func (m *UptimeCheckConfig_ContentMatcher) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UptimeCheckConfig_ContentMatcher.Marshal(b, m, deterministic) -} -func (m *UptimeCheckConfig_ContentMatcher) XXX_Merge(src proto.Message) { - xxx_messageInfo_UptimeCheckConfig_ContentMatcher.Merge(m, src) -} -func (m *UptimeCheckConfig_ContentMatcher) XXX_Size() int { - return xxx_messageInfo_UptimeCheckConfig_ContentMatcher.Size(m) -} -func (m *UptimeCheckConfig_ContentMatcher) XXX_DiscardUnknown() { - xxx_messageInfo_UptimeCheckConfig_ContentMatcher.DiscardUnknown(m) -} - -var xxx_messageInfo_UptimeCheckConfig_ContentMatcher proto.InternalMessageInfo - -func (m *UptimeCheckConfig_ContentMatcher) GetContent() string { - if m != nil { - return m.Content - } - return "" -} - -func (m *UptimeCheckConfig_ContentMatcher) GetMatcher() UptimeCheckConfig_ContentMatcher_ContentMatcherOption { - if m != nil { - return m.Matcher - } - return UptimeCheckConfig_ContentMatcher_CONTENT_MATCHER_OPTION_UNSPECIFIED -} - -// Contains the region, location, and list of IP -// addresses where checkers in the location run from. -type UptimeCheckIp struct { - // A broad region category in which the IP address is located. - Region UptimeCheckRegion `protobuf:"varint,1,opt,name=region,proto3,enum=google.monitoring.v3.UptimeCheckRegion" json:"region,omitempty"` - // A more specific location within the region that typically encodes - // a particular city/town/metro (and its containing state/province or country) - // within the broader umbrella region category. - Location string `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"` - // The IP address from which the Uptime check originates. This is a fully - // specified IP address (not an IP address range). Most IP addresses, as of - // this publication, are in IPv4 format; however, one should not rely on the - // IP addresses being in IPv4 format indefinitely, and should support - // interpreting this field in either IPv4 or IPv6 format. - IpAddress string `protobuf:"bytes,3,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UptimeCheckIp) Reset() { *m = UptimeCheckIp{} } -func (m *UptimeCheckIp) String() string { return proto.CompactTextString(m) } -func (*UptimeCheckIp) ProtoMessage() {} -func (*UptimeCheckIp) Descriptor() ([]byte, []int) { - return fileDescriptor_7ca0e36dfc8221d8, []int{2} -} - -func (m *UptimeCheckIp) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UptimeCheckIp.Unmarshal(m, b) -} -func (m *UptimeCheckIp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UptimeCheckIp.Marshal(b, m, deterministic) -} -func (m *UptimeCheckIp) XXX_Merge(src proto.Message) { - xxx_messageInfo_UptimeCheckIp.Merge(m, src) -} -func (m *UptimeCheckIp) XXX_Size() int { - return xxx_messageInfo_UptimeCheckIp.Size(m) -} -func (m *UptimeCheckIp) XXX_DiscardUnknown() { - xxx_messageInfo_UptimeCheckIp.DiscardUnknown(m) -} - -var xxx_messageInfo_UptimeCheckIp proto.InternalMessageInfo - -func (m *UptimeCheckIp) GetRegion() UptimeCheckRegion { - if m != nil { - return m.Region - } - return UptimeCheckRegion_REGION_UNSPECIFIED -} - -func (m *UptimeCheckIp) GetLocation() string { - if m != nil { - return m.Location - } - return "" -} - -func (m *UptimeCheckIp) GetIpAddress() string { - if m != nil { - return m.IpAddress - } - return "" -} - -func init() { - proto.RegisterEnum("google.monitoring.v3.UptimeCheckRegion", UptimeCheckRegion_name, UptimeCheckRegion_value) - proto.RegisterEnum("google.monitoring.v3.GroupResourceType", GroupResourceType_name, GroupResourceType_value) - proto.RegisterEnum("google.monitoring.v3.InternalChecker_State", InternalChecker_State_name, InternalChecker_State_value) - proto.RegisterEnum("google.monitoring.v3.UptimeCheckConfig_ContentMatcher_ContentMatcherOption", UptimeCheckConfig_ContentMatcher_ContentMatcherOption_name, UptimeCheckConfig_ContentMatcher_ContentMatcherOption_value) - proto.RegisterType((*InternalChecker)(nil), "google.monitoring.v3.InternalChecker") - proto.RegisterType((*UptimeCheckConfig)(nil), "google.monitoring.v3.UptimeCheckConfig") - proto.RegisterType((*UptimeCheckConfig_ResourceGroup)(nil), "google.monitoring.v3.UptimeCheckConfig.ResourceGroup") - proto.RegisterType((*UptimeCheckConfig_HttpCheck)(nil), "google.monitoring.v3.UptimeCheckConfig.HttpCheck") - proto.RegisterMapType((map[string]string)(nil), "google.monitoring.v3.UptimeCheckConfig.HttpCheck.HeadersEntry") - proto.RegisterType((*UptimeCheckConfig_HttpCheck_BasicAuthentication)(nil), "google.monitoring.v3.UptimeCheckConfig.HttpCheck.BasicAuthentication") - proto.RegisterType((*UptimeCheckConfig_TcpCheck)(nil), "google.monitoring.v3.UptimeCheckConfig.TcpCheck") - proto.RegisterType((*UptimeCheckConfig_ContentMatcher)(nil), "google.monitoring.v3.UptimeCheckConfig.ContentMatcher") - proto.RegisterType((*UptimeCheckIp)(nil), "google.monitoring.v3.UptimeCheckIp") -} - -func init() { proto.RegisterFile("google/monitoring/v3/uptime.proto", fileDescriptor_7ca0e36dfc8221d8) } - -var fileDescriptor_7ca0e36dfc8221d8 = []byte{ - // 1290 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcf, 0x6e, 0x1b, 0x37, - 0x13, 0xcf, 0x4a, 0xb6, 0x24, 0x8f, 0x6c, 0x4b, 0x66, 0x9c, 0x2f, 0x6b, 0x01, 0x09, 0x1c, 0x07, - 0x5f, 0x3e, 0x23, 0x01, 0xa4, 0x2f, 0x16, 0x5a, 0xb4, 0x0e, 0x90, 0x62, 0xa5, 0x6c, 0x2d, 0xa1, - 0xb6, 0x24, 0x50, 0x52, 0x9a, 0xa6, 0x41, 0x89, 0xcd, 0x8a, 0x96, 0xb6, 0x96, 0x96, 0xdb, 0x25, - 0xd7, 0xa9, 0x63, 0xe4, 0x09, 0x7a, 0xef, 0xbd, 0xe8, 0x2d, 0x8f, 0xd2, 0x57, 0xe8, 0x1b, 0xf4, - 0xd2, 0x43, 0x2f, 0x3d, 0x16, 0x24, 0x77, 0x65, 0xc9, 0x76, 0x11, 0x3b, 0x37, 0xfe, 0xe6, 0xcf, - 0x8f, 0x9c, 0xe1, 0xcc, 0x90, 0x70, 0x6f, 0xc8, 0xd8, 0x70, 0x4c, 0x2b, 0x13, 0xe6, 0x7b, 0x82, - 0x85, 0x9e, 0x3f, 0xac, 0x1c, 0x57, 0x2b, 0x51, 0x20, 0xbc, 0x09, 0x2d, 0x07, 0x21, 0x13, 0x0c, - 0xad, 0x6b, 0x93, 0xf2, 0x99, 0x49, 0xf9, 0xb8, 0x5a, 0xba, 0x1f, 0x3b, 0x3a, 0x81, 0x97, 0x38, - 0xd3, 0x01, 0x09, 0x29, 0x67, 0x51, 0xe8, 0xc6, 0xae, 0xa5, 0x8d, 0x19, 0xa3, 0x73, 0xaa, 0xbb, - 0xb1, 0x4a, 0xa1, 0xd7, 0xd1, 0x61, 0x65, 0x10, 0x85, 0x8e, 0xf0, 0x98, 0xaf, 0xf5, 0x5b, 0xbf, - 0xa4, 0xa0, 0xd0, 0xf4, 0x05, 0x0d, 0x7d, 0x67, 0x5c, 0x1f, 0x51, 0xf7, 0x88, 0x86, 0x08, 0xc1, - 0x82, 0xef, 0x4c, 0xa8, 0x69, 0x6c, 0x1a, 0xdb, 0x4b, 0x58, 0xad, 0xd1, 0x3d, 0x58, 0x1e, 0x78, - 0x3c, 0x18, 0x3b, 0x27, 0x44, 0xe9, 0x52, 0x4a, 0x97, 0x8f, 0x65, 0x2d, 0x69, 0x62, 0x42, 0xd6, - 0xa7, 0xe2, 0x0d, 0x0b, 0x8f, 0xcc, 0xb4, 0xd2, 0x26, 0x10, 0x6d, 0x40, 0x6e, 0xe8, 0x06, 0xe4, - 0x2d, 0xf3, 0xa9, 0xb9, 0xa0, 0x55, 0x43, 0x37, 0x78, 0xc9, 0x7c, 0x8a, 0x1e, 0x40, 0x21, 0xa0, - 0x34, 0x24, 0x41, 0xc8, 0xbe, 0xa7, 0xae, 0x20, 0xde, 0xc0, 0xcc, 0x28, 0x8b, 0x15, 0x29, 0xee, - 0x68, 0x69, 0x73, 0x80, 0x2c, 0x58, 0xe4, 0xc2, 0x11, 0xd4, 0xcc, 0x6e, 0x1a, 0xdb, 0xab, 0x3b, - 0x8f, 0xca, 0x97, 0x65, 0xab, 0x7c, 0x2e, 0x92, 0x72, 0x57, 0xba, 0x60, 0xed, 0xb9, 0x55, 0x85, - 0x45, 0x85, 0x51, 0x01, 0xf2, 0xfd, 0x56, 0xb7, 0x63, 0xd7, 0x9b, 0x5f, 0x36, 0xed, 0x67, 0xc5, - 0x1b, 0x68, 0x19, 0x72, 0x75, 0x6c, 0x5b, 0xbd, 0x66, 0x6b, 0xaf, 0x68, 0xa0, 0x3c, 0x64, 0x71, - 0xbf, 0xd5, 0x92, 0x20, 0xb5, 0x9b, 0x32, 0x8d, 0xad, 0xbf, 0x0b, 0xb0, 0xd6, 0x57, 0x57, 0xa5, - 0x78, 0xeb, 0xcc, 0x3f, 0xf4, 0x86, 0x1f, 0x9b, 0xa5, 0x16, 0xa0, 0x8b, 0xf7, 0xa8, 0x12, 0x96, - 0xdf, 0xb9, 0x93, 0x44, 0xe5, 0x04, 0x5e, 0xf9, 0x20, 0xb1, 0xc2, 0xb1, 0x51, 0xe3, 0x06, 0x5e, - 0x9b, 0x9c, 0x17, 0xa2, 0xef, 0x60, 0x35, 0x61, 0x21, 0xc3, 0x90, 0x45, 0x81, 0xca, 0x70, 0x7e, - 0xe7, 0x93, 0xcb, 0x33, 0x74, 0x21, 0x8e, 0x72, 0xc2, 0xb4, 0x27, 0x9d, 0x1b, 0x37, 0xf0, 0x4a, - 0x38, 0x2b, 0x40, 0x18, 0x60, 0x24, 0x44, 0x40, 0x5c, 0xe9, 0x62, 0x2e, 0x2a, 0xee, 0xc7, 0x57, - 0xe5, 0x6e, 0x08, 0x11, 0x28, 0xdc, 0x30, 0xf0, 0xd2, 0x28, 0x01, 0xa8, 0x0d, 0x4b, 0xc2, 0x4d, - 0x28, 0x33, 0x8a, 0xf2, 0xff, 0x57, 0xa5, 0xec, 0xb9, 0x53, 0xc6, 0x9c, 0x88, 0xd7, 0xe8, 0x31, - 0x64, 0x02, 0x1a, 0x7a, 0x6c, 0xa0, 0xca, 0x23, 0xbf, 0xb3, 0x91, 0xb0, 0x25, 0x65, 0x5f, 0x7e, - 0x16, 0x97, 0x3d, 0x8e, 0x0d, 0x51, 0x15, 0xb2, 0x92, 0x9a, 0x45, 0xc2, 0xcc, 0x7d, 0xc8, 0x27, - 0xb1, 0x44, 0x0e, 0x14, 0x5d, 0xe6, 0x0b, 0xea, 0x0b, 0x32, 0x71, 0x84, 0x3b, 0xa2, 0x21, 0x37, - 0x97, 0x36, 0xd3, 0xdb, 0xf9, 0x9d, 0x4f, 0xaf, 0x7a, 0xfe, 0xba, 0xf6, 0x3f, 0xd0, 0xee, 0xb8, - 0xe0, 0xce, 0x61, 0x8e, 0x30, 0x14, 0x39, 0x1d, 0x53, 0x57, 0xa8, 0xf2, 0x18, 0x7a, 0xcc, 0xe7, - 0x26, 0x6c, 0xa6, 0xb7, 0x57, 0x77, 0xfe, 0xf7, 0xc1, 0x2d, 0xb0, 0xb2, 0xc7, 0x85, 0x84, 0x40, - 0x63, 0x8e, 0xee, 0x43, 0xde, 0xe3, 0xc4, 0x8b, 0x9b, 0xc3, 0x2c, 0x6c, 0x1a, 0xdb, 0xb9, 0x5a, - 0xca, 0x34, 0x30, 0x78, 0x3c, 0x69, 0x19, 0xf4, 0x1c, 0xd6, 0x12, 0x0b, 0x7d, 0x33, 0x32, 0xb8, - 0x55, 0x15, 0xdc, 0x7f, 0xaf, 0xd4, 0x6d, 0x8a, 0xb1, 0xe8, 0xcd, 0x0b, 0x79, 0xe9, 0x47, 0x58, - 0x99, 0x2b, 0x31, 0x35, 0x0d, 0xe4, 0x42, 0xf6, 0xba, 0x11, 0x4f, 0x03, 0x89, 0x9b, 0x03, 0xb4, - 0x0f, 0xd3, 0xea, 0x23, 0xe2, 0x24, 0xd0, 0x0d, 0xf4, 0xaf, 0x91, 0x2b, 0xba, 0x84, 0xbb, 0x77, - 0x12, 0x50, 0xbc, 0x1c, 0xce, 0xa0, 0xd2, 0xef, 0x69, 0x58, 0x9a, 0x56, 0x20, 0xba, 0x0d, 0xd9, - 0x88, 0x53, 0xc2, 0xf9, 0x58, 0xed, 0x9a, 0xc3, 0x99, 0x88, 0xd3, 0x2e, 0x1f, 0xcb, 0x46, 0x0e, - 0x1c, 0x31, 0x8a, 0x9b, 0x55, 0xad, 0x95, 0x8c, 0x85, 0x42, 0xf5, 0xe5, 0x22, 0x56, 0x6b, 0xf4, - 0x1a, 0x96, 0x9c, 0x48, 0x8c, 0x88, 0xe7, 0x1f, 0xb2, 0xb8, 0xc9, 0xec, 0x6b, 0x37, 0x42, 0xb9, - 0xe6, 0x70, 0xcf, 0xb5, 0x22, 0x31, 0xa2, 0xbe, 0xf0, 0x5c, 0x5d, 0x5f, 0x39, 0xc9, 0xdb, 0xf4, - 0x0f, 0x99, 0x1c, 0x20, 0x13, 0x87, 0x1f, 0x91, 0x11, 0x75, 0x06, 0x32, 0xff, 0x8b, 0xea, 0xa4, - 0x79, 0x29, 0x6b, 0x68, 0x11, 0x7a, 0x01, 0xd9, 0x44, 0x9b, 0x51, 0xb7, 0xf3, 0xf4, 0xfa, 0x87, - 0x88, 0xb9, 0x6c, 0x5f, 0x84, 0x27, 0x38, 0xa1, 0x93, 0x9b, 0x1f, 0x3b, 0x63, 0x6f, 0xe0, 0x08, - 0x9d, 0xa6, 0xac, 0xde, 0x3c, 0x91, 0x75, 0xf9, 0xb8, 0x74, 0x00, 0x37, 0x2f, 0x09, 0x00, 0x95, - 0x20, 0x17, 0x71, 0x79, 0xed, 0xd3, 0x79, 0x38, 0xc5, 0x52, 0x17, 0x38, 0x9c, 0xbf, 0x61, 0xe1, - 0x20, 0x4e, 0xf1, 0x14, 0x97, 0x76, 0x61, 0x79, 0xf6, 0x28, 0xa8, 0x08, 0xe9, 0x23, 0x7a, 0x12, - 0x53, 0xc8, 0x25, 0x5a, 0x87, 0xc5, 0x63, 0x67, 0x1c, 0x25, 0xa3, 0x54, 0x83, 0xdd, 0xd4, 0x67, - 0x46, 0xe9, 0x2e, 0xe4, 0x92, 0x59, 0x30, 0xbd, 0x2e, 0xe3, 0xec, 0xba, 0x4a, 0xef, 0x53, 0xb0, - 0x3a, 0xdf, 0x6c, 0xf2, 0x85, 0x8a, 0xdb, 0x2d, 0x29, 0xbc, 0x18, 0x22, 0x0a, 0xd9, 0xb8, 0xa1, - 0xe3, 0x92, 0xfb, 0xea, 0xe3, 0xfa, 0xf9, 0x1c, 0x6c, 0x07, 0x7a, 0x7e, 0xc4, 0xdc, 0x5b, 0x3f, - 0x1b, 0xb0, 0x7e, 0x99, 0x05, 0x7a, 0x00, 0x5b, 0xf5, 0x76, 0xab, 0x67, 0xb7, 0x7a, 0xe4, 0xc0, - 0xea, 0xd5, 0x1b, 0x36, 0x26, 0xed, 0x4e, 0xaf, 0xd9, 0x6e, 0x91, 0xf9, 0x97, 0xea, 0x26, 0x14, - 0xa4, 0x9d, 0xd5, 0x6c, 0x75, 0x49, 0xb7, 0x87, 0xf5, 0x83, 0x75, 0x1b, 0x6e, 0xb6, 0xda, 0x3d, - 0x72, 0x5e, 0x91, 0x42, 0x6b, 0xb0, 0xa2, 0xd9, 0xba, 0x04, 0xdb, 0x7b, 0xf6, 0x8b, 0x62, 0x1a, - 0xdd, 0x82, 0x35, 0x69, 0x3b, 0x2f, 0x5e, 0xd8, 0xfd, 0xcb, 0xf8, 0xc3, 0xfa, 0xd3, 0x80, 0x47, - 0x33, 0xd1, 0xea, 0xf8, 0x9d, 0xc0, 0xe3, 0x65, 0x97, 0x4d, 0x2a, 0x17, 0x1f, 0xc0, 0x27, 0xf1, - 0x9b, 0xcd, 0x2b, 0xa7, 0xf1, 0xea, 0x5d, 0xfc, 0xa3, 0x99, 0xb1, 0xe2, 0x95, 0x53, 0x2d, 0xd3, - 0x33, 0x85, 0xb8, 0x4a, 0xfa, 0x0e, 0xd9, 0x2c, 0x1c, 0x3a, 0xbe, 0xf7, 0x56, 0xd5, 0x0f, 0xaf, - 0x9c, 0xce, 0xc2, 0x6b, 0xd0, 0x7c, 0x7e, 0xc8, 0xc6, 0xb2, 0x7c, 0x2a, 0xa7, 0x7a, 0x71, 0x0d, - 0x57, 0xe3, 0x61, 0x0d, 0x20, 0x97, 0x0c, 0x8c, 0xda, 0x3a, 0x20, 0xad, 0x0f, 0xe9, 0x0f, 0x11, - 0xe5, 0x42, 0xcd, 0x9f, 0xad, 0x9f, 0x0c, 0x58, 0x99, 0x89, 0xbc, 0x19, 0xa0, 0x2f, 0x20, 0xa3, - 0xc7, 0xb2, 0x2a, 0xa1, 0x6b, 0x4c, 0xe5, 0xd8, 0x4d, 0xf6, 0xc3, 0x98, 0xe9, 0xbe, 0x49, 0xfa, - 0x21, 0xc1, 0xe8, 0x0e, 0x80, 0x17, 0x10, 0x67, 0x30, 0x08, 0x29, 0xe7, 0xf1, 0x2f, 0x6a, 0xc9, - 0x0b, 0x2c, 0x2d, 0x78, 0x48, 0xe7, 0xfe, 0x21, 0x9a, 0x17, 0xfd, 0x07, 0x10, 0xb6, 0xf7, 0x2e, - 0x96, 0x4a, 0x16, 0xd2, 0xfd, 0xae, 0x55, 0x34, 0x10, 0x40, 0xc6, 0xee, 0xe3, 0x76, 0xc7, 0xd6, - 0x15, 0xd1, 0x6d, 0xf7, 0x7b, 0x0d, 0x62, 0x1d, 0xd8, 0xb8, 0x59, 0xb7, 0x8a, 0x69, 0x54, 0x84, - 0x65, 0xab, 0xdb, 0xb4, 0x48, 0xc7, 0x92, 0xae, 0xf5, 0xe2, 0xc2, 0xc3, 0x6f, 0x61, 0xed, 0xc2, - 0x68, 0x45, 0x77, 0x60, 0x03, 0xdb, 0xdd, 0x76, 0x1f, 0xd7, 0x6d, 0xd2, 0xfb, 0xa6, 0x63, 0x93, - 0x0b, 0x5f, 0xa8, 0x66, 0xab, 0xdb, 0xb3, 0x5a, 0x75, 0xbb, 0x68, 0xa0, 0x0d, 0xb8, 0x65, 0x7d, - 0xdd, 0x25, 0xf6, 0x7e, 0x8d, 0xec, 0xb7, 0xad, 0x67, 0xa4, 0x66, 0xed, 0x4b, 0x0d, 0x2e, 0xa6, - 0x6a, 0xbf, 0x1a, 0x60, 0xba, 0x6c, 0x72, 0x69, 0xd6, 0x6a, 0x79, 0x1d, 0x5e, 0x47, 0xbe, 0xc0, - 0x1d, 0xe3, 0xe5, 0xd3, 0xd8, 0x68, 0xc8, 0xc6, 0x8e, 0x3f, 0x2c, 0xb3, 0x70, 0x58, 0x19, 0x52, - 0x5f, 0xbd, 0xcf, 0x95, 0xb3, 0xf2, 0x9c, 0xff, 0x54, 0x3f, 0x39, 0x43, 0xef, 0x53, 0xa5, 0x3d, - 0x4d, 0x50, 0x1f, 0xb3, 0x68, 0x90, 0xfc, 0xa8, 0xe4, 0x5e, 0xcf, 0xab, 0xbf, 0x25, 0xca, 0x57, - 0x4a, 0xf9, 0xea, 0x4c, 0xf9, 0xea, 0x79, 0xf5, 0x75, 0x46, 0x6d, 0x52, 0xfd, 0x27, 0x00, 0x00, - 0xff, 0xff, 0x57, 0x4f, 0xe1, 0x77, 0xb8, 0x0b, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/uptime_service.pb.go b/vendor/google.golang.org/genproto/googleapis/monitoring/v3/uptime_service.pb.go deleted file mode 100644 index 3f9631b0a..000000000 --- a/vendor/google.golang.org/genproto/googleapis/monitoring/v3/uptime_service.pb.go +++ /dev/null @@ -1,830 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/monitoring/v3/uptime_service.proto - -package monitoring - -import ( - context "context" - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" - _ "github.com/golang/protobuf/ptypes/duration" - empty "github.com/golang/protobuf/ptypes/empty" - _ "google.golang.org/genproto/googleapis/api/annotations" - field_mask "google.golang.org/genproto/protobuf/field_mask" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The protocol for the `ListUptimeCheckConfigs` request. -type ListUptimeCheckConfigsRequest struct { - // Required. The project whose Uptime check configurations are listed. The format - // is `projects/[PROJECT_ID]`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // The maximum number of results to return in a single response. The server - // may further constrain the maximum number of results returned in a single - // page. If the page_size is <=0, the server will decide the number of results - // to be returned. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If this field is not empty then it must contain the `nextPageToken` value - // returned by a previous call to this method. Using this field causes the - // method to return more results from the previous method call. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListUptimeCheckConfigsRequest) Reset() { *m = ListUptimeCheckConfigsRequest{} } -func (m *ListUptimeCheckConfigsRequest) String() string { return proto.CompactTextString(m) } -func (*ListUptimeCheckConfigsRequest) ProtoMessage() {} -func (*ListUptimeCheckConfigsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6222dd2aa0db8eee, []int{0} -} - -func (m *ListUptimeCheckConfigsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListUptimeCheckConfigsRequest.Unmarshal(m, b) -} -func (m *ListUptimeCheckConfigsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListUptimeCheckConfigsRequest.Marshal(b, m, deterministic) -} -func (m *ListUptimeCheckConfigsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListUptimeCheckConfigsRequest.Merge(m, src) -} -func (m *ListUptimeCheckConfigsRequest) XXX_Size() int { - return xxx_messageInfo_ListUptimeCheckConfigsRequest.Size(m) -} -func (m *ListUptimeCheckConfigsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListUptimeCheckConfigsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListUptimeCheckConfigsRequest proto.InternalMessageInfo - -func (m *ListUptimeCheckConfigsRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -func (m *ListUptimeCheckConfigsRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListUptimeCheckConfigsRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -// The protocol for the `ListUptimeCheckConfigs` response. -type ListUptimeCheckConfigsResponse struct { - // The returned Uptime check configurations. - UptimeCheckConfigs []*UptimeCheckConfig `protobuf:"bytes,1,rep,name=uptime_check_configs,json=uptimeCheckConfigs,proto3" json:"uptime_check_configs,omitempty"` - // This field represents the pagination token to retrieve the next page of - // results. If the value is empty, it means no further results for the - // request. To retrieve the next page of results, the value of the - // next_page_token is passed to the subsequent List method call (in the - // request message's page_token field). - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - // The total number of Uptime check configurations for the project, - // irrespective of any pagination. - TotalSize int32 `protobuf:"varint,3,opt,name=total_size,json=totalSize,proto3" json:"total_size,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListUptimeCheckConfigsResponse) Reset() { *m = ListUptimeCheckConfigsResponse{} } -func (m *ListUptimeCheckConfigsResponse) String() string { return proto.CompactTextString(m) } -func (*ListUptimeCheckConfigsResponse) ProtoMessage() {} -func (*ListUptimeCheckConfigsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6222dd2aa0db8eee, []int{1} -} - -func (m *ListUptimeCheckConfigsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListUptimeCheckConfigsResponse.Unmarshal(m, b) -} -func (m *ListUptimeCheckConfigsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListUptimeCheckConfigsResponse.Marshal(b, m, deterministic) -} -func (m *ListUptimeCheckConfigsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListUptimeCheckConfigsResponse.Merge(m, src) -} -func (m *ListUptimeCheckConfigsResponse) XXX_Size() int { - return xxx_messageInfo_ListUptimeCheckConfigsResponse.Size(m) -} -func (m *ListUptimeCheckConfigsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListUptimeCheckConfigsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListUptimeCheckConfigsResponse proto.InternalMessageInfo - -func (m *ListUptimeCheckConfigsResponse) GetUptimeCheckConfigs() []*UptimeCheckConfig { - if m != nil { - return m.UptimeCheckConfigs - } - return nil -} - -func (m *ListUptimeCheckConfigsResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -func (m *ListUptimeCheckConfigsResponse) GetTotalSize() int32 { - if m != nil { - return m.TotalSize - } - return 0 -} - -// The protocol for the `GetUptimeCheckConfig` request. -type GetUptimeCheckConfigRequest struct { - // Required. The Uptime check configuration to retrieve. The format - // is `projects/[PROJECT_ID]/uptimeCheckConfigs/[UPTIME_CHECK_ID]`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetUptimeCheckConfigRequest) Reset() { *m = GetUptimeCheckConfigRequest{} } -func (m *GetUptimeCheckConfigRequest) String() string { return proto.CompactTextString(m) } -func (*GetUptimeCheckConfigRequest) ProtoMessage() {} -func (*GetUptimeCheckConfigRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6222dd2aa0db8eee, []int{2} -} - -func (m *GetUptimeCheckConfigRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GetUptimeCheckConfigRequest.Unmarshal(m, b) -} -func (m *GetUptimeCheckConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GetUptimeCheckConfigRequest.Marshal(b, m, deterministic) -} -func (m *GetUptimeCheckConfigRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetUptimeCheckConfigRequest.Merge(m, src) -} -func (m *GetUptimeCheckConfigRequest) XXX_Size() int { - return xxx_messageInfo_GetUptimeCheckConfigRequest.Size(m) -} -func (m *GetUptimeCheckConfigRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetUptimeCheckConfigRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_GetUptimeCheckConfigRequest proto.InternalMessageInfo - -func (m *GetUptimeCheckConfigRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The protocol for the `CreateUptimeCheckConfig` request. -type CreateUptimeCheckConfigRequest struct { - // Required. The project in which to create the Uptime check. The format - // is `projects/[PROJECT_ID]`. - Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` - // Required. The new Uptime check configuration. - UptimeCheckConfig *UptimeCheckConfig `protobuf:"bytes,2,opt,name=uptime_check_config,json=uptimeCheckConfig,proto3" json:"uptime_check_config,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CreateUptimeCheckConfigRequest) Reset() { *m = CreateUptimeCheckConfigRequest{} } -func (m *CreateUptimeCheckConfigRequest) String() string { return proto.CompactTextString(m) } -func (*CreateUptimeCheckConfigRequest) ProtoMessage() {} -func (*CreateUptimeCheckConfigRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6222dd2aa0db8eee, []int{3} -} - -func (m *CreateUptimeCheckConfigRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_CreateUptimeCheckConfigRequest.Unmarshal(m, b) -} -func (m *CreateUptimeCheckConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_CreateUptimeCheckConfigRequest.Marshal(b, m, deterministic) -} -func (m *CreateUptimeCheckConfigRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CreateUptimeCheckConfigRequest.Merge(m, src) -} -func (m *CreateUptimeCheckConfigRequest) XXX_Size() int { - return xxx_messageInfo_CreateUptimeCheckConfigRequest.Size(m) -} -func (m *CreateUptimeCheckConfigRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CreateUptimeCheckConfigRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_CreateUptimeCheckConfigRequest proto.InternalMessageInfo - -func (m *CreateUptimeCheckConfigRequest) GetParent() string { - if m != nil { - return m.Parent - } - return "" -} - -func (m *CreateUptimeCheckConfigRequest) GetUptimeCheckConfig() *UptimeCheckConfig { - if m != nil { - return m.UptimeCheckConfig - } - return nil -} - -// The protocol for the `UpdateUptimeCheckConfig` request. -type UpdateUptimeCheckConfigRequest struct { - // Optional. If present, only the listed fields in the current Uptime check - // configuration are updated with values from the new configuration. If this - // field is empty, then the current configuration is completely replaced with - // the new configuration. - UpdateMask *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` - // Required. If an `updateMask` has been specified, this field gives - // the values for the set of fields mentioned in the `updateMask`. If an - // `updateMask` has not been given, this Uptime check configuration replaces - // the current configuration. If a field is mentioned in `updateMask` but - // the corresonding field is omitted in this partial Uptime check - // configuration, it has the effect of deleting/clearing the field from the - // configuration on the server. - // - // The following fields can be updated: `display_name`, - // `http_check`, `tcp_check`, `timeout`, `content_matchers`, and - // `selected_regions`. - UptimeCheckConfig *UptimeCheckConfig `protobuf:"bytes,3,opt,name=uptime_check_config,json=uptimeCheckConfig,proto3" json:"uptime_check_config,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *UpdateUptimeCheckConfigRequest) Reset() { *m = UpdateUptimeCheckConfigRequest{} } -func (m *UpdateUptimeCheckConfigRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateUptimeCheckConfigRequest) ProtoMessage() {} -func (*UpdateUptimeCheckConfigRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6222dd2aa0db8eee, []int{4} -} - -func (m *UpdateUptimeCheckConfigRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_UpdateUptimeCheckConfigRequest.Unmarshal(m, b) -} -func (m *UpdateUptimeCheckConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_UpdateUptimeCheckConfigRequest.Marshal(b, m, deterministic) -} -func (m *UpdateUptimeCheckConfigRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateUptimeCheckConfigRequest.Merge(m, src) -} -func (m *UpdateUptimeCheckConfigRequest) XXX_Size() int { - return xxx_messageInfo_UpdateUptimeCheckConfigRequest.Size(m) -} -func (m *UpdateUptimeCheckConfigRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateUptimeCheckConfigRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_UpdateUptimeCheckConfigRequest proto.InternalMessageInfo - -func (m *UpdateUptimeCheckConfigRequest) GetUpdateMask() *field_mask.FieldMask { - if m != nil { - return m.UpdateMask - } - return nil -} - -func (m *UpdateUptimeCheckConfigRequest) GetUptimeCheckConfig() *UptimeCheckConfig { - if m != nil { - return m.UptimeCheckConfig - } - return nil -} - -// The protocol for the `DeleteUptimeCheckConfig` request. -type DeleteUptimeCheckConfigRequest struct { - // Required. The Uptime check configuration to delete. The format - // is `projects/[PROJECT_ID]/uptimeCheckConfigs/[UPTIME_CHECK_ID]`. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DeleteUptimeCheckConfigRequest) Reset() { *m = DeleteUptimeCheckConfigRequest{} } -func (m *DeleteUptimeCheckConfigRequest) String() string { return proto.CompactTextString(m) } -func (*DeleteUptimeCheckConfigRequest) ProtoMessage() {} -func (*DeleteUptimeCheckConfigRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6222dd2aa0db8eee, []int{5} -} - -func (m *DeleteUptimeCheckConfigRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DeleteUptimeCheckConfigRequest.Unmarshal(m, b) -} -func (m *DeleteUptimeCheckConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DeleteUptimeCheckConfigRequest.Marshal(b, m, deterministic) -} -func (m *DeleteUptimeCheckConfigRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeleteUptimeCheckConfigRequest.Merge(m, src) -} -func (m *DeleteUptimeCheckConfigRequest) XXX_Size() int { - return xxx_messageInfo_DeleteUptimeCheckConfigRequest.Size(m) -} -func (m *DeleteUptimeCheckConfigRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DeleteUptimeCheckConfigRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DeleteUptimeCheckConfigRequest proto.InternalMessageInfo - -func (m *DeleteUptimeCheckConfigRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// The protocol for the `ListUptimeCheckIps` request. -type ListUptimeCheckIpsRequest struct { - // The maximum number of results to return in a single response. The server - // may further constrain the maximum number of results returned in a single - // page. If the page_size is <=0, the server will decide the number of results - // to be returned. - // NOTE: this field is not yet implemented - PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // If this field is not empty then it must contain the `nextPageToken` value - // returned by a previous call to this method. Using this field causes the - // method to return more results from the previous method call. - // NOTE: this field is not yet implemented - PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListUptimeCheckIpsRequest) Reset() { *m = ListUptimeCheckIpsRequest{} } -func (m *ListUptimeCheckIpsRequest) String() string { return proto.CompactTextString(m) } -func (*ListUptimeCheckIpsRequest) ProtoMessage() {} -func (*ListUptimeCheckIpsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_6222dd2aa0db8eee, []int{6} -} - -func (m *ListUptimeCheckIpsRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListUptimeCheckIpsRequest.Unmarshal(m, b) -} -func (m *ListUptimeCheckIpsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListUptimeCheckIpsRequest.Marshal(b, m, deterministic) -} -func (m *ListUptimeCheckIpsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListUptimeCheckIpsRequest.Merge(m, src) -} -func (m *ListUptimeCheckIpsRequest) XXX_Size() int { - return xxx_messageInfo_ListUptimeCheckIpsRequest.Size(m) -} -func (m *ListUptimeCheckIpsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListUptimeCheckIpsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ListUptimeCheckIpsRequest proto.InternalMessageInfo - -func (m *ListUptimeCheckIpsRequest) GetPageSize() int32 { - if m != nil { - return m.PageSize - } - return 0 -} - -func (m *ListUptimeCheckIpsRequest) GetPageToken() string { - if m != nil { - return m.PageToken - } - return "" -} - -// The protocol for the `ListUptimeCheckIps` response. -type ListUptimeCheckIpsResponse struct { - // The returned list of IP addresses (including region and location) that the - // checkers run from. - UptimeCheckIps []*UptimeCheckIp `protobuf:"bytes,1,rep,name=uptime_check_ips,json=uptimeCheckIps,proto3" json:"uptime_check_ips,omitempty"` - // This field represents the pagination token to retrieve the next page of - // results. If the value is empty, it means no further results for the - // request. To retrieve the next page of results, the value of the - // next_page_token is passed to the subsequent List method call (in the - // request message's page_token field). - // NOTE: this field is not yet implemented - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ListUptimeCheckIpsResponse) Reset() { *m = ListUptimeCheckIpsResponse{} } -func (m *ListUptimeCheckIpsResponse) String() string { return proto.CompactTextString(m) } -func (*ListUptimeCheckIpsResponse) ProtoMessage() {} -func (*ListUptimeCheckIpsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_6222dd2aa0db8eee, []int{7} -} - -func (m *ListUptimeCheckIpsResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ListUptimeCheckIpsResponse.Unmarshal(m, b) -} -func (m *ListUptimeCheckIpsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ListUptimeCheckIpsResponse.Marshal(b, m, deterministic) -} -func (m *ListUptimeCheckIpsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListUptimeCheckIpsResponse.Merge(m, src) -} -func (m *ListUptimeCheckIpsResponse) XXX_Size() int { - return xxx_messageInfo_ListUptimeCheckIpsResponse.Size(m) -} -func (m *ListUptimeCheckIpsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ListUptimeCheckIpsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ListUptimeCheckIpsResponse proto.InternalMessageInfo - -func (m *ListUptimeCheckIpsResponse) GetUptimeCheckIps() []*UptimeCheckIp { - if m != nil { - return m.UptimeCheckIps - } - return nil -} - -func (m *ListUptimeCheckIpsResponse) GetNextPageToken() string { - if m != nil { - return m.NextPageToken - } - return "" -} - -func init() { - proto.RegisterType((*ListUptimeCheckConfigsRequest)(nil), "google.monitoring.v3.ListUptimeCheckConfigsRequest") - proto.RegisterType((*ListUptimeCheckConfigsResponse)(nil), "google.monitoring.v3.ListUptimeCheckConfigsResponse") - proto.RegisterType((*GetUptimeCheckConfigRequest)(nil), "google.monitoring.v3.GetUptimeCheckConfigRequest") - proto.RegisterType((*CreateUptimeCheckConfigRequest)(nil), "google.monitoring.v3.CreateUptimeCheckConfigRequest") - proto.RegisterType((*UpdateUptimeCheckConfigRequest)(nil), "google.monitoring.v3.UpdateUptimeCheckConfigRequest") - proto.RegisterType((*DeleteUptimeCheckConfigRequest)(nil), "google.monitoring.v3.DeleteUptimeCheckConfigRequest") - proto.RegisterType((*ListUptimeCheckIpsRequest)(nil), "google.monitoring.v3.ListUptimeCheckIpsRequest") - proto.RegisterType((*ListUptimeCheckIpsResponse)(nil), "google.monitoring.v3.ListUptimeCheckIpsResponse") -} - -func init() { - proto.RegisterFile("google/monitoring/v3/uptime_service.proto", fileDescriptor_6222dd2aa0db8eee) -} - -var fileDescriptor_6222dd2aa0db8eee = []byte{ - // 900 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcf, 0x8f, 0xdb, 0x44, - 0x14, 0xd6, 0x24, 0xa5, 0x62, 0xa7, 0xe2, 0xd7, 0x74, 0xd5, 0xcd, 0x7a, 0x69, 0x08, 0x46, 0x82, - 0x25, 0x6c, 0x6d, 0xd8, 0x70, 0xa1, 0x2b, 0x2a, 0x39, 0x01, 0x56, 0x15, 0xac, 0xb4, 0x4a, 0xd9, - 0x22, 0x50, 0xa4, 0x68, 0xd6, 0x99, 0x38, 0x43, 0x6c, 0x8f, 0x6b, 0x8f, 0xb3, 0x50, 0xd4, 0x0b, - 0x37, 0xce, 0xfb, 0x1f, 0x70, 0x82, 0x4a, 0xfc, 0x05, 0x08, 0x09, 0x71, 0x2c, 0x37, 0xb8, 0xe5, - 0x80, 0x7a, 0xe0, 0xc6, 0x7f, 0xc0, 0x09, 0x79, 0x3c, 0xc6, 0x4e, 0x62, 0x7b, 0x1d, 0x69, 0x6f, - 0xc9, 0xbc, 0xe7, 0xf7, 0xbe, 0xf7, 0xbd, 0xf9, 0x3e, 0x0d, 0x7c, 0xd3, 0x62, 0xcc, 0xb2, 0x89, - 0xee, 0x30, 0x97, 0x72, 0xe6, 0x53, 0xd7, 0xd2, 0x67, 0x1d, 0x3d, 0xf4, 0x38, 0x75, 0xc8, 0x30, - 0x20, 0xfe, 0x8c, 0x9a, 0x44, 0xf3, 0x7c, 0xc6, 0x19, 0xda, 0x8c, 0x53, 0xb5, 0x34, 0x55, 0x9b, - 0x75, 0x94, 0x97, 0x65, 0x01, 0xec, 0x51, 0x1d, 0xbb, 0x2e, 0xe3, 0x98, 0x53, 0xe6, 0x06, 0xf1, - 0x37, 0xca, 0x56, 0x26, 0x6a, 0xda, 0x94, 0xb8, 0x5c, 0x06, 0x5e, 0xc9, 0x04, 0xc6, 0x94, 0xd8, - 0xa3, 0xe1, 0x29, 0x99, 0xe0, 0x19, 0x65, 0xbe, 0x4c, 0xd8, 0xce, 0x24, 0xf8, 0x24, 0x60, 0xa1, - 0x9f, 0x00, 0x51, 0x5e, 0x2d, 0xc1, 0x2c, 0x53, 0x9a, 0x32, 0x45, 0xfc, 0x3b, 0x0d, 0xc7, 0xfa, - 0x28, 0xf4, 0x05, 0x30, 0x19, 0xdf, 0x59, 0x8e, 0x13, 0xc7, 0xe3, 0x5f, 0xcb, 0x60, 0x6b, 0x39, - 0x18, 0x03, 0x74, 0x70, 0x30, 0x8d, 0x33, 0xd4, 0x1f, 0x00, 0xbc, 0xf9, 0x09, 0x0d, 0xf8, 0x89, - 0xe8, 0xd9, 0x9b, 0x10, 0x73, 0xda, 0x63, 0xee, 0x98, 0x5a, 0x41, 0x9f, 0x3c, 0x08, 0x49, 0xc0, - 0xd1, 0xc7, 0xf0, 0xaa, 0x87, 0x7d, 0xe2, 0xf2, 0x06, 0x68, 0x81, 0xdd, 0x8d, 0x6e, 0xe7, 0xa9, - 0x51, 0xfb, 0xd7, 0xb8, 0x85, 0xde, 0xca, 0xb0, 0x17, 0xb7, 0xc1, 0x1e, 0x0d, 0x34, 0x93, 0x39, - 0xfa, 0x4a, 0xb1, 0xbe, 0x2c, 0x81, 0x76, 0xe0, 0x86, 0x87, 0x2d, 0x32, 0x0c, 0xe8, 0x43, 0xd2, - 0xa8, 0xb7, 0xc0, 0xee, 0x33, 0xfd, 0x67, 0xa3, 0x83, 0x7b, 0xf4, 0x21, 0x41, 0x37, 0x21, 0x14, - 0x41, 0xce, 0xa6, 0xc4, 0x6d, 0x5c, 0x89, 0xba, 0xf5, 0x45, 0xfa, 0xa7, 0xd1, 0x81, 0xfa, 0x1b, - 0x80, 0xcd, 0x22, 0xa8, 0x81, 0xc7, 0xdc, 0x80, 0xa0, 0xcf, 0xe1, 0xa6, 0x5c, 0xb8, 0x19, 0x85, - 0x87, 0x66, 0x1c, 0x6f, 0x80, 0x56, 0x7d, 0xf7, 0xda, 0xfe, 0x1b, 0x5a, 0xde, 0xde, 0xb5, 0x55, - 0xb4, 0x28, 0x5c, 0x69, 0x81, 0x5e, 0x87, 0x2f, 0xb8, 0xe4, 0x2b, 0x3e, 0xcc, 0x20, 0xac, 0x09, - 0x84, 0xcf, 0x45, 0xc7, 0xc7, 0x09, 0xca, 0x68, 0x08, 0xce, 0x38, 0xb6, 0xb3, 0x23, 0x6e, 0x88, - 0x93, 0x68, 0x46, 0x75, 0x0c, 0x77, 0x0e, 0xc9, 0xea, 0x08, 0x09, 0xd9, 0x87, 0xf0, 0x8a, 0x8b, - 0x1d, 0xb2, 0x48, 0x35, 0x5c, 0x8b, 0x6a, 0x51, 0x40, 0xfd, 0x1d, 0xc0, 0x66, 0xcf, 0x27, 0x98, - 0x93, 0xc2, 0x5e, 0x97, 0xba, 0xd8, 0x01, 0xbc, 0x9e, 0xc3, 0xbc, 0xa0, 0xa8, 0x3a, 0xf1, 0xdd, - 0xfa, 0x53, 0xa3, 0xd6, 0x7f, 0x69, 0x85, 0x7d, 0xf5, 0x67, 0x00, 0x9b, 0x27, 0xde, 0xa8, 0x6c, - 0x9a, 0x03, 0x78, 0x2d, 0x14, 0x19, 0xe2, 0x76, 0xcb, 0xc6, 0x4a, 0xd2, 0x38, 0x11, 0x80, 0xf6, - 0x51, 0x24, 0x80, 0x23, 0x1c, 0x4c, 0xfb, 0x30, 0x4e, 0x8f, 0x7e, 0x17, 0xa1, 0xaf, 0x5f, 0x0e, - 0x7a, 0x0a, 0x9b, 0x1f, 0x10, 0x9b, 0x94, 0x80, 0xbf, 0xb4, 0xb5, 0x7f, 0x06, 0xb7, 0x97, 0x24, - 0x72, 0xd7, 0xfb, 0x5f, 0xc9, 0x0b, 0xe2, 0xab, 0x95, 0x8a, 0xaf, 0xbe, 0x2c, 0xbe, 0x73, 0x00, - 0x95, 0xbc, 0xca, 0x52, 0x78, 0x47, 0xf0, 0xc5, 0x05, 0x02, 0xa9, 0x97, 0x88, 0xee, 0xb5, 0x0b, - 0xd9, 0xbb, 0xeb, 0xf5, 0x9f, 0x0f, 0x17, 0xca, 0x56, 0x15, 0xdb, 0xfe, 0x2f, 0x10, 0xa2, 0x4c, - 0xa5, 0x7b, 0xb1, 0xcb, 0xa3, 0x5f, 0x01, 0xbc, 0x91, 0xef, 0x14, 0xa8, 0x93, 0x0f, 0xa7, 0xd4, - 0x02, 0x95, 0x77, 0xd7, 0xfb, 0x28, 0xe6, 0x44, 0x3d, 0x98, 0x1b, 0x52, 0x1d, 0xdf, 0xfe, 0xf9, - 0xf7, 0x79, 0x6d, 0x0f, 0xb5, 0x23, 0x73, 0xff, 0x26, 0x3e, 0x7a, 0xdf, 0xf3, 0xd9, 0x97, 0xc4, - 0xe4, 0x81, 0xde, 0x7e, 0xa4, 0xe7, 0xd8, 0xcd, 0x4f, 0x00, 0x6e, 0xe6, 0x19, 0x05, 0x7a, 0x27, - 0x1f, 0x4b, 0x89, 0xa9, 0x28, 0x55, 0x2f, 0xb0, 0xfa, 0xde, 0xdc, 0x10, 0xd7, 0x68, 0x01, 0x6f, - 0x74, 0x90, 0x41, 0x9b, 0x03, 0x56, 0x6f, 0x3f, 0x42, 0x7f, 0x01, 0xb8, 0x55, 0xe0, 0x37, 0xa8, - 0x80, 0xbe, 0x72, 0x7b, 0xaa, 0x8e, 0x7a, 0x34, 0x37, 0x94, 0x98, 0xd4, 0xbd, 0x1c, 0x11, 0x8b, - 0x59, 0x0c, 0x75, 0x0d, 0xee, 0x6f, 0xe7, 0x79, 0x01, 0xfa, 0x07, 0xc0, 0xad, 0x02, 0x0b, 0x2a, - 0x1a, 0xb0, 0xdc, 0xb1, 0xaa, 0x0f, 0xf8, 0x60, 0x6e, 0x5c, 0x2f, 0x9a, 0xec, 0x64, 0xff, 0x8e, - 0x98, 0x2c, 0x27, 0xae, 0x55, 0xda, 0x5c, 0xfe, 0xb4, 0xdf, 0x03, 0xb8, 0x55, 0xe0, 0x59, 0x45, - 0xd3, 0x96, 0x5b, 0x9c, 0x72, 0x63, 0xc5, 0x8a, 0x3f, 0x8c, 0x1e, 0x2a, 0x4b, 0x77, 0xae, 0xbd, - 0xce, 0x9d, 0x3b, 0x07, 0x10, 0xad, 0x7a, 0x12, 0xd2, 0x2b, 0xa9, 0x35, 0xf5, 0x45, 0xe5, 0xed, - 0xea, 0x1f, 0x48, 0x69, 0x2b, 0x02, 0xed, 0x26, 0x42, 0xe9, 0x73, 0x2d, 0xc9, 0x51, 0x7e, 0x04, - 0x4f, 0x8c, 0xed, 0x42, 0xe7, 0xfe, 0xc3, 0xf8, 0x0e, 0x4c, 0x38, 0xf7, 0x82, 0xdb, 0xba, 0x7e, - 0x76, 0x76, 0xb6, 0xec, 0xeb, 0x38, 0xe4, 0x13, 0xdd, 0xb4, 0x59, 0x38, 0xba, 0xe5, 0xd9, 0x98, - 0x8f, 0x99, 0xef, 0xec, 0x5d, 0x94, 0x9e, 0xf6, 0x5a, 0x23, 0x55, 0xf3, 0x09, 0x1e, 0x75, 0x1f, - 0x03, 0xd8, 0x30, 0x99, 0x93, 0x3b, 0x7f, 0x57, 0x3a, 0xab, 0x34, 0xd5, 0xe3, 0x68, 0x6d, 0xc7, - 0xe0, 0x8b, 0x3b, 0x32, 0xd7, 0x62, 0x36, 0x76, 0x2d, 0x8d, 0xf9, 0x96, 0x6e, 0x11, 0x57, 0x2c, - 0x55, 0x4f, 0x5b, 0x2e, 0xbe, 0x68, 0x0f, 0xd2, 0x7f, 0x8f, 0x6b, 0xca, 0x61, 0x5c, 0xa0, 0x17, - 0x4d, 0xa9, 0x1d, 0xa5, 0x2d, 0xef, 0x77, 0x9e, 0x24, 0xc1, 0x81, 0x08, 0x0e, 0xd2, 0xe0, 0xe0, - 0x7e, 0xe7, 0xf4, 0xaa, 0x68, 0xd2, 0xf9, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xd2, 0xbe, 0xa4, 0xd7, - 0xe9, 0x0b, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// UptimeCheckServiceClient is the client API for UptimeCheckService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type UptimeCheckServiceClient interface { - // Lists the existing valid Uptime check configurations for the project - // (leaving out any invalid configurations). - ListUptimeCheckConfigs(ctx context.Context, in *ListUptimeCheckConfigsRequest, opts ...grpc.CallOption) (*ListUptimeCheckConfigsResponse, error) - // Gets a single Uptime check configuration. - GetUptimeCheckConfig(ctx context.Context, in *GetUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) - // Creates a new Uptime check configuration. - CreateUptimeCheckConfig(ctx context.Context, in *CreateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) - // Updates an Uptime check configuration. You can either replace the entire - // configuration with a new one or replace only certain fields in the current - // configuration by specifying the fields to be updated via `updateMask`. - // Returns the updated configuration. - UpdateUptimeCheckConfig(ctx context.Context, in *UpdateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) - // Deletes an Uptime check configuration. Note that this method will fail - // if the Uptime check configuration is referenced by an alert policy or - // other dependent configs that would be rendered invalid by the deletion. - DeleteUptimeCheckConfig(ctx context.Context, in *DeleteUptimeCheckConfigRequest, opts ...grpc.CallOption) (*empty.Empty, error) - // Returns the list of IP addresses that checkers run from - ListUptimeCheckIps(ctx context.Context, in *ListUptimeCheckIpsRequest, opts ...grpc.CallOption) (*ListUptimeCheckIpsResponse, error) -} - -type uptimeCheckServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewUptimeCheckServiceClient(cc grpc.ClientConnInterface) UptimeCheckServiceClient { - return &uptimeCheckServiceClient{cc} -} - -func (c *uptimeCheckServiceClient) ListUptimeCheckConfigs(ctx context.Context, in *ListUptimeCheckConfigsRequest, opts ...grpc.CallOption) (*ListUptimeCheckConfigsResponse, error) { - out := new(ListUptimeCheckConfigsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckConfigs", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *uptimeCheckServiceClient) GetUptimeCheckConfig(ctx context.Context, in *GetUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { - out := new(UptimeCheckConfig) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/GetUptimeCheckConfig", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *uptimeCheckServiceClient) CreateUptimeCheckConfig(ctx context.Context, in *CreateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { - out := new(UptimeCheckConfig) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/CreateUptimeCheckConfig", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *uptimeCheckServiceClient) UpdateUptimeCheckConfig(ctx context.Context, in *UpdateUptimeCheckConfigRequest, opts ...grpc.CallOption) (*UptimeCheckConfig, error) { - out := new(UptimeCheckConfig) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/UpdateUptimeCheckConfig", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *uptimeCheckServiceClient) DeleteUptimeCheckConfig(ctx context.Context, in *DeleteUptimeCheckConfigRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/DeleteUptimeCheckConfig", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *uptimeCheckServiceClient) ListUptimeCheckIps(ctx context.Context, in *ListUptimeCheckIpsRequest, opts ...grpc.CallOption) (*ListUptimeCheckIpsResponse, error) { - out := new(ListUptimeCheckIpsResponse) - err := c.cc.Invoke(ctx, "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckIps", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// UptimeCheckServiceServer is the server API for UptimeCheckService service. -type UptimeCheckServiceServer interface { - // Lists the existing valid Uptime check configurations for the project - // (leaving out any invalid configurations). - ListUptimeCheckConfigs(context.Context, *ListUptimeCheckConfigsRequest) (*ListUptimeCheckConfigsResponse, error) - // Gets a single Uptime check configuration. - GetUptimeCheckConfig(context.Context, *GetUptimeCheckConfigRequest) (*UptimeCheckConfig, error) - // Creates a new Uptime check configuration. - CreateUptimeCheckConfig(context.Context, *CreateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) - // Updates an Uptime check configuration. You can either replace the entire - // configuration with a new one or replace only certain fields in the current - // configuration by specifying the fields to be updated via `updateMask`. - // Returns the updated configuration. - UpdateUptimeCheckConfig(context.Context, *UpdateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) - // Deletes an Uptime check configuration. Note that this method will fail - // if the Uptime check configuration is referenced by an alert policy or - // other dependent configs that would be rendered invalid by the deletion. - DeleteUptimeCheckConfig(context.Context, *DeleteUptimeCheckConfigRequest) (*empty.Empty, error) - // Returns the list of IP addresses that checkers run from - ListUptimeCheckIps(context.Context, *ListUptimeCheckIpsRequest) (*ListUptimeCheckIpsResponse, error) -} - -// UnimplementedUptimeCheckServiceServer can be embedded to have forward compatible implementations. -type UnimplementedUptimeCheckServiceServer struct { -} - -func (*UnimplementedUptimeCheckServiceServer) ListUptimeCheckConfigs(ctx context.Context, req *ListUptimeCheckConfigsRequest) (*ListUptimeCheckConfigsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListUptimeCheckConfigs not implemented") -} -func (*UnimplementedUptimeCheckServiceServer) GetUptimeCheckConfig(ctx context.Context, req *GetUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetUptimeCheckConfig not implemented") -} -func (*UnimplementedUptimeCheckServiceServer) CreateUptimeCheckConfig(ctx context.Context, req *CreateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateUptimeCheckConfig not implemented") -} -func (*UnimplementedUptimeCheckServiceServer) UpdateUptimeCheckConfig(ctx context.Context, req *UpdateUptimeCheckConfigRequest) (*UptimeCheckConfig, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateUptimeCheckConfig not implemented") -} -func (*UnimplementedUptimeCheckServiceServer) DeleteUptimeCheckConfig(ctx context.Context, req *DeleteUptimeCheckConfigRequest) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteUptimeCheckConfig not implemented") -} -func (*UnimplementedUptimeCheckServiceServer) ListUptimeCheckIps(ctx context.Context, req *ListUptimeCheckIpsRequest) (*ListUptimeCheckIpsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListUptimeCheckIps not implemented") -} - -func RegisterUptimeCheckServiceServer(s *grpc.Server, srv UptimeCheckServiceServer) { - s.RegisterService(&_UptimeCheckService_serviceDesc, srv) -} - -func _UptimeCheckService_ListUptimeCheckConfigs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListUptimeCheckConfigsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).ListUptimeCheckConfigs(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckConfigs", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).ListUptimeCheckConfigs(ctx, req.(*ListUptimeCheckConfigsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _UptimeCheckService_GetUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetUptimeCheckConfigRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).GetUptimeCheckConfig(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/GetUptimeCheckConfig", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).GetUptimeCheckConfig(ctx, req.(*GetUptimeCheckConfigRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _UptimeCheckService_CreateUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateUptimeCheckConfigRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).CreateUptimeCheckConfig(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/CreateUptimeCheckConfig", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).CreateUptimeCheckConfig(ctx, req.(*CreateUptimeCheckConfigRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _UptimeCheckService_UpdateUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateUptimeCheckConfigRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).UpdateUptimeCheckConfig(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/UpdateUptimeCheckConfig", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).UpdateUptimeCheckConfig(ctx, req.(*UpdateUptimeCheckConfigRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _UptimeCheckService_DeleteUptimeCheckConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteUptimeCheckConfigRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).DeleteUptimeCheckConfig(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/DeleteUptimeCheckConfig", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).DeleteUptimeCheckConfig(ctx, req.(*DeleteUptimeCheckConfigRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _UptimeCheckService_ListUptimeCheckIps_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListUptimeCheckIpsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UptimeCheckServiceServer).ListUptimeCheckIps(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/google.monitoring.v3.UptimeCheckService/ListUptimeCheckIps", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UptimeCheckServiceServer).ListUptimeCheckIps(ctx, req.(*ListUptimeCheckIpsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _UptimeCheckService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "google.monitoring.v3.UptimeCheckService", - HandlerType: (*UptimeCheckServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "ListUptimeCheckConfigs", - Handler: _UptimeCheckService_ListUptimeCheckConfigs_Handler, - }, - { - MethodName: "GetUptimeCheckConfig", - Handler: _UptimeCheckService_GetUptimeCheckConfig_Handler, - }, - { - MethodName: "CreateUptimeCheckConfig", - Handler: _UptimeCheckService_CreateUptimeCheckConfig_Handler, - }, - { - MethodName: "UpdateUptimeCheckConfig", - Handler: _UptimeCheckService_UpdateUptimeCheckConfig_Handler, - }, - { - MethodName: "DeleteUptimeCheckConfig", - Handler: _UptimeCheckService_DeleteUptimeCheckConfig_Handler, - }, - { - MethodName: "ListUptimeCheckIps", - Handler: _UptimeCheckService_ListUptimeCheckIps_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "google/monitoring/v3/uptime_service.proto", -} diff --git a/vendor/google.golang.org/genproto/googleapis/type/calendarperiod/calendar_period.pb.go b/vendor/google.golang.org/genproto/googleapis/type/calendarperiod/calendar_period.pb.go deleted file mode 100644 index 0ee0bd15a..000000000 --- a/vendor/google.golang.org/genproto/googleapis/type/calendarperiod/calendar_period.pb.go +++ /dev/null @@ -1,106 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/type/calendar_period.proto - -package calendarperiod - -import ( - fmt "fmt" - math "math" - - proto "github.com/golang/protobuf/proto" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// A `CalendarPeriod` represents the abstract concept of a time period that has -// a canonical start. Grammatically, "the start of the current -// `CalendarPeriod`." All calendar times begin at midnight UTC. -type CalendarPeriod int32 - -const ( - // Undefined period, raises an error. - CalendarPeriod_CALENDAR_PERIOD_UNSPECIFIED CalendarPeriod = 0 - // A day. - CalendarPeriod_DAY CalendarPeriod = 1 - // A week. Weeks begin on Monday, following - // [ISO 8601](https://en.wikipedia.org/wiki/ISO_week_date). - CalendarPeriod_WEEK CalendarPeriod = 2 - // A fortnight. The first calendar fortnight of the year begins at the start - // of week 1 according to - // [ISO 8601](https://en.wikipedia.org/wiki/ISO_week_date). - CalendarPeriod_FORTNIGHT CalendarPeriod = 3 - // A month. - CalendarPeriod_MONTH CalendarPeriod = 4 - // A quarter. Quarters start on dates 1-Jan, 1-Apr, 1-Jul, and 1-Oct of each - // year. - CalendarPeriod_QUARTER CalendarPeriod = 5 - // A half-year. Half-years start on dates 1-Jan and 1-Jul. - CalendarPeriod_HALF CalendarPeriod = 6 - // A year. - CalendarPeriod_YEAR CalendarPeriod = 7 -) - -var CalendarPeriod_name = map[int32]string{ - 0: "CALENDAR_PERIOD_UNSPECIFIED", - 1: "DAY", - 2: "WEEK", - 3: "FORTNIGHT", - 4: "MONTH", - 5: "QUARTER", - 6: "HALF", - 7: "YEAR", -} - -var CalendarPeriod_value = map[string]int32{ - "CALENDAR_PERIOD_UNSPECIFIED": 0, - "DAY": 1, - "WEEK": 2, - "FORTNIGHT": 3, - "MONTH": 4, - "QUARTER": 5, - "HALF": 6, - "YEAR": 7, -} - -func (x CalendarPeriod) String() string { - return proto.EnumName(CalendarPeriod_name, int32(x)) -} - -func (CalendarPeriod) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_52aec33199a3da0e, []int{0} -} - -func init() { - proto.RegisterEnum("google.type.CalendarPeriod", CalendarPeriod_name, CalendarPeriod_value) -} - -func init() { proto.RegisterFile("google/type/calendar_period.proto", fileDescriptor_52aec33199a3da0e) } - -var fileDescriptor_52aec33199a3da0e = []byte{ - // 248 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0x8f, 0xb1, 0x4f, 0x83, 0x40, - 0x14, 0x87, 0x6d, 0x69, 0x8b, 0x7d, 0x8d, 0x7a, 0x39, 0x47, 0x07, 0xe3, 0xea, 0x00, 0x83, 0xa3, - 0xd3, 0x15, 0x8e, 0x42, 0xac, 0x70, 0x9e, 0xd7, 0x98, 0xba, 0x10, 0x6c, 0x2f, 0x97, 0x26, 0xc8, - 0x23, 0xd8, 0x41, 0x27, 0xff, 0x17, 0xff, 0x52, 0x73, 0xc0, 0x50, 0xb6, 0xbb, 0xbc, 0xef, 0x97, - 0x7c, 0x1f, 0xdc, 0x19, 0x44, 0x53, 0x6a, 0xff, 0xf8, 0x53, 0x6b, 0x7f, 0x57, 0x94, 0xba, 0xda, - 0x17, 0x4d, 0x5e, 0xeb, 0xe6, 0x80, 0x7b, 0xaf, 0x6e, 0xf0, 0x88, 0x74, 0xd1, 0x21, 0x9e, 0x45, - 0xee, 0x7f, 0xe1, 0x32, 0xe8, 0x29, 0xd1, 0x42, 0xf4, 0x16, 0x6e, 0x02, 0xb6, 0xe6, 0x69, 0xc8, - 0x64, 0x2e, 0xb8, 0x4c, 0xb2, 0x30, 0xdf, 0xa4, 0xaf, 0x82, 0x07, 0x49, 0x94, 0xf0, 0x90, 0x9c, - 0x51, 0x17, 0x9c, 0x90, 0x6d, 0xc9, 0x88, 0x9e, 0xc3, 0xe4, 0x8d, 0xf3, 0x27, 0x32, 0xa6, 0x17, - 0x30, 0x8f, 0x32, 0xa9, 0xd2, 0x64, 0x15, 0x2b, 0xe2, 0xd0, 0x39, 0x4c, 0x9f, 0xb3, 0x54, 0xc5, - 0x64, 0x42, 0x17, 0xe0, 0xbe, 0x6c, 0x98, 0x54, 0x5c, 0x92, 0xa9, 0x1d, 0xc4, 0x6c, 0x1d, 0x91, - 0x99, 0x7d, 0x6d, 0x39, 0x93, 0xc4, 0x5d, 0x7e, 0xc3, 0xd5, 0x0e, 0x3f, 0xbd, 0x13, 0xa7, 0xe5, - 0xf5, 0xd0, 0x48, 0x58, 0x6b, 0x31, 0x7a, 0x8f, 0x7b, 0xc6, 0x60, 0x59, 0x54, 0xc6, 0xc3, 0xc6, - 0xf8, 0x46, 0x57, 0x6d, 0x93, 0xdf, 0x9d, 0x8a, 0xfa, 0xf0, 0x35, 0x2c, 0xef, 0xc2, 0x1f, 0x87, - 0xdf, 0xbf, 0xb1, 0xb3, 0x52, 0xe2, 0x63, 0xd6, 0x4e, 0x1f, 0xfe, 0x03, 0x00, 0x00, 0xff, 0xff, - 0x91, 0x18, 0xaa, 0x3f, 0x33, 0x01, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer.pb.go b/vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer.pb.go deleted file mode 100644 index 930f90ca5..000000000 --- a/vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer.pb.go +++ /dev/null @@ -1,772 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: grpc/lb/v1/load_balancer.proto - -package grpc_lb_v1 - -import ( - context "context" - fmt "fmt" - proto "github.com/golang/protobuf/proto" - duration "github.com/golang/protobuf/ptypes/duration" - timestamp "github.com/golang/protobuf/ptypes/timestamp" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -type LoadBalanceRequest struct { - // Types that are valid to be assigned to LoadBalanceRequestType: - // *LoadBalanceRequest_InitialRequest - // *LoadBalanceRequest_ClientStats - LoadBalanceRequestType isLoadBalanceRequest_LoadBalanceRequestType `protobuf_oneof:"load_balance_request_type"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LoadBalanceRequest) Reset() { *m = LoadBalanceRequest{} } -func (m *LoadBalanceRequest) String() string { return proto.CompactTextString(m) } -func (*LoadBalanceRequest) ProtoMessage() {} -func (*LoadBalanceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7cd3f6d792743fdf, []int{0} -} - -func (m *LoadBalanceRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LoadBalanceRequest.Unmarshal(m, b) -} -func (m *LoadBalanceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LoadBalanceRequest.Marshal(b, m, deterministic) -} -func (m *LoadBalanceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_LoadBalanceRequest.Merge(m, src) -} -func (m *LoadBalanceRequest) XXX_Size() int { - return xxx_messageInfo_LoadBalanceRequest.Size(m) -} -func (m *LoadBalanceRequest) XXX_DiscardUnknown() { - xxx_messageInfo_LoadBalanceRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_LoadBalanceRequest proto.InternalMessageInfo - -type isLoadBalanceRequest_LoadBalanceRequestType interface { - isLoadBalanceRequest_LoadBalanceRequestType() -} - -type LoadBalanceRequest_InitialRequest struct { - InitialRequest *InitialLoadBalanceRequest `protobuf:"bytes,1,opt,name=initial_request,json=initialRequest,proto3,oneof"` -} - -type LoadBalanceRequest_ClientStats struct { - ClientStats *ClientStats `protobuf:"bytes,2,opt,name=client_stats,json=clientStats,proto3,oneof"` -} - -func (*LoadBalanceRequest_InitialRequest) isLoadBalanceRequest_LoadBalanceRequestType() {} - -func (*LoadBalanceRequest_ClientStats) isLoadBalanceRequest_LoadBalanceRequestType() {} - -func (m *LoadBalanceRequest) GetLoadBalanceRequestType() isLoadBalanceRequest_LoadBalanceRequestType { - if m != nil { - return m.LoadBalanceRequestType - } - return nil -} - -func (m *LoadBalanceRequest) GetInitialRequest() *InitialLoadBalanceRequest { - if x, ok := m.GetLoadBalanceRequestType().(*LoadBalanceRequest_InitialRequest); ok { - return x.InitialRequest - } - return nil -} - -func (m *LoadBalanceRequest) GetClientStats() *ClientStats { - if x, ok := m.GetLoadBalanceRequestType().(*LoadBalanceRequest_ClientStats); ok { - return x.ClientStats - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*LoadBalanceRequest) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*LoadBalanceRequest_InitialRequest)(nil), - (*LoadBalanceRequest_ClientStats)(nil), - } -} - -type InitialLoadBalanceRequest struct { - // The name of the load balanced service (e.g., service.googleapis.com). Its - // length should be less than 256 bytes. - // The name might include a port number. How to handle the port number is up - // to the balancer. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *InitialLoadBalanceRequest) Reset() { *m = InitialLoadBalanceRequest{} } -func (m *InitialLoadBalanceRequest) String() string { return proto.CompactTextString(m) } -func (*InitialLoadBalanceRequest) ProtoMessage() {} -func (*InitialLoadBalanceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7cd3f6d792743fdf, []int{1} -} - -func (m *InitialLoadBalanceRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_InitialLoadBalanceRequest.Unmarshal(m, b) -} -func (m *InitialLoadBalanceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_InitialLoadBalanceRequest.Marshal(b, m, deterministic) -} -func (m *InitialLoadBalanceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_InitialLoadBalanceRequest.Merge(m, src) -} -func (m *InitialLoadBalanceRequest) XXX_Size() int { - return xxx_messageInfo_InitialLoadBalanceRequest.Size(m) -} -func (m *InitialLoadBalanceRequest) XXX_DiscardUnknown() { - xxx_messageInfo_InitialLoadBalanceRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_InitialLoadBalanceRequest proto.InternalMessageInfo - -func (m *InitialLoadBalanceRequest) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -// Contains the number of calls finished for a particular load balance token. -type ClientStatsPerToken struct { - // See Server.load_balance_token. - LoadBalanceToken string `protobuf:"bytes,1,opt,name=load_balance_token,json=loadBalanceToken,proto3" json:"load_balance_token,omitempty"` - // The total number of RPCs that finished associated with the token. - NumCalls int64 `protobuf:"varint,2,opt,name=num_calls,json=numCalls,proto3" json:"num_calls,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ClientStatsPerToken) Reset() { *m = ClientStatsPerToken{} } -func (m *ClientStatsPerToken) String() string { return proto.CompactTextString(m) } -func (*ClientStatsPerToken) ProtoMessage() {} -func (*ClientStatsPerToken) Descriptor() ([]byte, []int) { - return fileDescriptor_7cd3f6d792743fdf, []int{2} -} - -func (m *ClientStatsPerToken) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ClientStatsPerToken.Unmarshal(m, b) -} -func (m *ClientStatsPerToken) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ClientStatsPerToken.Marshal(b, m, deterministic) -} -func (m *ClientStatsPerToken) XXX_Merge(src proto.Message) { - xxx_messageInfo_ClientStatsPerToken.Merge(m, src) -} -func (m *ClientStatsPerToken) XXX_Size() int { - return xxx_messageInfo_ClientStatsPerToken.Size(m) -} -func (m *ClientStatsPerToken) XXX_DiscardUnknown() { - xxx_messageInfo_ClientStatsPerToken.DiscardUnknown(m) -} - -var xxx_messageInfo_ClientStatsPerToken proto.InternalMessageInfo - -func (m *ClientStatsPerToken) GetLoadBalanceToken() string { - if m != nil { - return m.LoadBalanceToken - } - return "" -} - -func (m *ClientStatsPerToken) GetNumCalls() int64 { - if m != nil { - return m.NumCalls - } - return 0 -} - -// Contains client level statistics that are useful to load balancing. Each -// count except the timestamp should be reset to zero after reporting the stats. -type ClientStats struct { - // The timestamp of generating the report. - Timestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // The total number of RPCs that started. - NumCallsStarted int64 `protobuf:"varint,2,opt,name=num_calls_started,json=numCallsStarted,proto3" json:"num_calls_started,omitempty"` - // The total number of RPCs that finished. - NumCallsFinished int64 `protobuf:"varint,3,opt,name=num_calls_finished,json=numCallsFinished,proto3" json:"num_calls_finished,omitempty"` - // The total number of RPCs that failed to reach a server except dropped RPCs. - NumCallsFinishedWithClientFailedToSend int64 `protobuf:"varint,6,opt,name=num_calls_finished_with_client_failed_to_send,json=numCallsFinishedWithClientFailedToSend,proto3" json:"num_calls_finished_with_client_failed_to_send,omitempty"` - // The total number of RPCs that finished and are known to have been received - // by a server. - NumCallsFinishedKnownReceived int64 `protobuf:"varint,7,opt,name=num_calls_finished_known_received,json=numCallsFinishedKnownReceived,proto3" json:"num_calls_finished_known_received,omitempty"` - // The list of dropped calls. - CallsFinishedWithDrop []*ClientStatsPerToken `protobuf:"bytes,8,rep,name=calls_finished_with_drop,json=callsFinishedWithDrop,proto3" json:"calls_finished_with_drop,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ClientStats) Reset() { *m = ClientStats{} } -func (m *ClientStats) String() string { return proto.CompactTextString(m) } -func (*ClientStats) ProtoMessage() {} -func (*ClientStats) Descriptor() ([]byte, []int) { - return fileDescriptor_7cd3f6d792743fdf, []int{3} -} - -func (m *ClientStats) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ClientStats.Unmarshal(m, b) -} -func (m *ClientStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ClientStats.Marshal(b, m, deterministic) -} -func (m *ClientStats) XXX_Merge(src proto.Message) { - xxx_messageInfo_ClientStats.Merge(m, src) -} -func (m *ClientStats) XXX_Size() int { - return xxx_messageInfo_ClientStats.Size(m) -} -func (m *ClientStats) XXX_DiscardUnknown() { - xxx_messageInfo_ClientStats.DiscardUnknown(m) -} - -var xxx_messageInfo_ClientStats proto.InternalMessageInfo - -func (m *ClientStats) GetTimestamp() *timestamp.Timestamp { - if m != nil { - return m.Timestamp - } - return nil -} - -func (m *ClientStats) GetNumCallsStarted() int64 { - if m != nil { - return m.NumCallsStarted - } - return 0 -} - -func (m *ClientStats) GetNumCallsFinished() int64 { - if m != nil { - return m.NumCallsFinished - } - return 0 -} - -func (m *ClientStats) GetNumCallsFinishedWithClientFailedToSend() int64 { - if m != nil { - return m.NumCallsFinishedWithClientFailedToSend - } - return 0 -} - -func (m *ClientStats) GetNumCallsFinishedKnownReceived() int64 { - if m != nil { - return m.NumCallsFinishedKnownReceived - } - return 0 -} - -func (m *ClientStats) GetCallsFinishedWithDrop() []*ClientStatsPerToken { - if m != nil { - return m.CallsFinishedWithDrop - } - return nil -} - -type LoadBalanceResponse struct { - // Types that are valid to be assigned to LoadBalanceResponseType: - // *LoadBalanceResponse_InitialResponse - // *LoadBalanceResponse_ServerList - // *LoadBalanceResponse_FallbackResponse - LoadBalanceResponseType isLoadBalanceResponse_LoadBalanceResponseType `protobuf_oneof:"load_balance_response_type"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LoadBalanceResponse) Reset() { *m = LoadBalanceResponse{} } -func (m *LoadBalanceResponse) String() string { return proto.CompactTextString(m) } -func (*LoadBalanceResponse) ProtoMessage() {} -func (*LoadBalanceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7cd3f6d792743fdf, []int{4} -} - -func (m *LoadBalanceResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LoadBalanceResponse.Unmarshal(m, b) -} -func (m *LoadBalanceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LoadBalanceResponse.Marshal(b, m, deterministic) -} -func (m *LoadBalanceResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_LoadBalanceResponse.Merge(m, src) -} -func (m *LoadBalanceResponse) XXX_Size() int { - return xxx_messageInfo_LoadBalanceResponse.Size(m) -} -func (m *LoadBalanceResponse) XXX_DiscardUnknown() { - xxx_messageInfo_LoadBalanceResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_LoadBalanceResponse proto.InternalMessageInfo - -type isLoadBalanceResponse_LoadBalanceResponseType interface { - isLoadBalanceResponse_LoadBalanceResponseType() -} - -type LoadBalanceResponse_InitialResponse struct { - InitialResponse *InitialLoadBalanceResponse `protobuf:"bytes,1,opt,name=initial_response,json=initialResponse,proto3,oneof"` -} - -type LoadBalanceResponse_ServerList struct { - ServerList *ServerList `protobuf:"bytes,2,opt,name=server_list,json=serverList,proto3,oneof"` -} - -type LoadBalanceResponse_FallbackResponse struct { - FallbackResponse *FallbackResponse `protobuf:"bytes,3,opt,name=fallback_response,json=fallbackResponse,proto3,oneof"` -} - -func (*LoadBalanceResponse_InitialResponse) isLoadBalanceResponse_LoadBalanceResponseType() {} - -func (*LoadBalanceResponse_ServerList) isLoadBalanceResponse_LoadBalanceResponseType() {} - -func (*LoadBalanceResponse_FallbackResponse) isLoadBalanceResponse_LoadBalanceResponseType() {} - -func (m *LoadBalanceResponse) GetLoadBalanceResponseType() isLoadBalanceResponse_LoadBalanceResponseType { - if m != nil { - return m.LoadBalanceResponseType - } - return nil -} - -func (m *LoadBalanceResponse) GetInitialResponse() *InitialLoadBalanceResponse { - if x, ok := m.GetLoadBalanceResponseType().(*LoadBalanceResponse_InitialResponse); ok { - return x.InitialResponse - } - return nil -} - -func (m *LoadBalanceResponse) GetServerList() *ServerList { - if x, ok := m.GetLoadBalanceResponseType().(*LoadBalanceResponse_ServerList); ok { - return x.ServerList - } - return nil -} - -func (m *LoadBalanceResponse) GetFallbackResponse() *FallbackResponse { - if x, ok := m.GetLoadBalanceResponseType().(*LoadBalanceResponse_FallbackResponse); ok { - return x.FallbackResponse - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*LoadBalanceResponse) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*LoadBalanceResponse_InitialResponse)(nil), - (*LoadBalanceResponse_ServerList)(nil), - (*LoadBalanceResponse_FallbackResponse)(nil), - } -} - -type FallbackResponse struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FallbackResponse) Reset() { *m = FallbackResponse{} } -func (m *FallbackResponse) String() string { return proto.CompactTextString(m) } -func (*FallbackResponse) ProtoMessage() {} -func (*FallbackResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7cd3f6d792743fdf, []int{5} -} - -func (m *FallbackResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FallbackResponse.Unmarshal(m, b) -} -func (m *FallbackResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FallbackResponse.Marshal(b, m, deterministic) -} -func (m *FallbackResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_FallbackResponse.Merge(m, src) -} -func (m *FallbackResponse) XXX_Size() int { - return xxx_messageInfo_FallbackResponse.Size(m) -} -func (m *FallbackResponse) XXX_DiscardUnknown() { - xxx_messageInfo_FallbackResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_FallbackResponse proto.InternalMessageInfo - -type InitialLoadBalanceResponse struct { - // This is an application layer redirect that indicates the client should use - // the specified server for load balancing. When this field is non-empty in - // the response, the client should open a separate connection to the - // load_balancer_delegate and call the BalanceLoad method. Its length should - // be less than 64 bytes. - LoadBalancerDelegate string `protobuf:"bytes,1,opt,name=load_balancer_delegate,json=loadBalancerDelegate,proto3" json:"load_balancer_delegate,omitempty"` - // This interval defines how often the client should send the client stats - // to the load balancer. Stats should only be reported when the duration is - // positive. - ClientStatsReportInterval *duration.Duration `protobuf:"bytes,2,opt,name=client_stats_report_interval,json=clientStatsReportInterval,proto3" json:"client_stats_report_interval,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *InitialLoadBalanceResponse) Reset() { *m = InitialLoadBalanceResponse{} } -func (m *InitialLoadBalanceResponse) String() string { return proto.CompactTextString(m) } -func (*InitialLoadBalanceResponse) ProtoMessage() {} -func (*InitialLoadBalanceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7cd3f6d792743fdf, []int{6} -} - -func (m *InitialLoadBalanceResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_InitialLoadBalanceResponse.Unmarshal(m, b) -} -func (m *InitialLoadBalanceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_InitialLoadBalanceResponse.Marshal(b, m, deterministic) -} -func (m *InitialLoadBalanceResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_InitialLoadBalanceResponse.Merge(m, src) -} -func (m *InitialLoadBalanceResponse) XXX_Size() int { - return xxx_messageInfo_InitialLoadBalanceResponse.Size(m) -} -func (m *InitialLoadBalanceResponse) XXX_DiscardUnknown() { - xxx_messageInfo_InitialLoadBalanceResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_InitialLoadBalanceResponse proto.InternalMessageInfo - -func (m *InitialLoadBalanceResponse) GetLoadBalancerDelegate() string { - if m != nil { - return m.LoadBalancerDelegate - } - return "" -} - -func (m *InitialLoadBalanceResponse) GetClientStatsReportInterval() *duration.Duration { - if m != nil { - return m.ClientStatsReportInterval - } - return nil -} - -type ServerList struct { - // Contains a list of servers selected by the load balancer. The list will - // be updated when server resolutions change or as needed to balance load - // across more servers. The client should consume the server list in order - // unless instructed otherwise via the client_config. - Servers []*Server `protobuf:"bytes,1,rep,name=servers,proto3" json:"servers,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ServerList) Reset() { *m = ServerList{} } -func (m *ServerList) String() string { return proto.CompactTextString(m) } -func (*ServerList) ProtoMessage() {} -func (*ServerList) Descriptor() ([]byte, []int) { - return fileDescriptor_7cd3f6d792743fdf, []int{7} -} - -func (m *ServerList) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ServerList.Unmarshal(m, b) -} -func (m *ServerList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ServerList.Marshal(b, m, deterministic) -} -func (m *ServerList) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServerList.Merge(m, src) -} -func (m *ServerList) XXX_Size() int { - return xxx_messageInfo_ServerList.Size(m) -} -func (m *ServerList) XXX_DiscardUnknown() { - xxx_messageInfo_ServerList.DiscardUnknown(m) -} - -var xxx_messageInfo_ServerList proto.InternalMessageInfo - -func (m *ServerList) GetServers() []*Server { - if m != nil { - return m.Servers - } - return nil -} - -// Contains server information. When the drop field is not true, use the other -// fields. -type Server struct { - // A resolved address for the server, serialized in network-byte-order. It may - // either be an IPv4 or IPv6 address. - IpAddress []byte `protobuf:"bytes,1,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"` - // A resolved port number for the server. - Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` - // An opaque but printable token for load reporting. The client must include - // the token of the picked server into the initial metadata when it starts a - // call to that server. The token is used by the server to verify the request - // and to allow the server to report load to the gRPC LB system. The token is - // also used in client stats for reporting dropped calls. - // - // Its length can be variable but must be less than 50 bytes. - LoadBalanceToken string `protobuf:"bytes,3,opt,name=load_balance_token,json=loadBalanceToken,proto3" json:"load_balance_token,omitempty"` - // Indicates whether this particular request should be dropped by the client. - // If the request is dropped, there will be a corresponding entry in - // ClientStats.calls_finished_with_drop. - Drop bool `protobuf:"varint,4,opt,name=drop,proto3" json:"drop,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Server) Reset() { *m = Server{} } -func (m *Server) String() string { return proto.CompactTextString(m) } -func (*Server) ProtoMessage() {} -func (*Server) Descriptor() ([]byte, []int) { - return fileDescriptor_7cd3f6d792743fdf, []int{8} -} - -func (m *Server) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Server.Unmarshal(m, b) -} -func (m *Server) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Server.Marshal(b, m, deterministic) -} -func (m *Server) XXX_Merge(src proto.Message) { - xxx_messageInfo_Server.Merge(m, src) -} -func (m *Server) XXX_Size() int { - return xxx_messageInfo_Server.Size(m) -} -func (m *Server) XXX_DiscardUnknown() { - xxx_messageInfo_Server.DiscardUnknown(m) -} - -var xxx_messageInfo_Server proto.InternalMessageInfo - -func (m *Server) GetIpAddress() []byte { - if m != nil { - return m.IpAddress - } - return nil -} - -func (m *Server) GetPort() int32 { - if m != nil { - return m.Port - } - return 0 -} - -func (m *Server) GetLoadBalanceToken() string { - if m != nil { - return m.LoadBalanceToken - } - return "" -} - -func (m *Server) GetDrop() bool { - if m != nil { - return m.Drop - } - return false -} - -func init() { - proto.RegisterType((*LoadBalanceRequest)(nil), "grpc.lb.v1.LoadBalanceRequest") - proto.RegisterType((*InitialLoadBalanceRequest)(nil), "grpc.lb.v1.InitialLoadBalanceRequest") - proto.RegisterType((*ClientStatsPerToken)(nil), "grpc.lb.v1.ClientStatsPerToken") - proto.RegisterType((*ClientStats)(nil), "grpc.lb.v1.ClientStats") - proto.RegisterType((*LoadBalanceResponse)(nil), "grpc.lb.v1.LoadBalanceResponse") - proto.RegisterType((*FallbackResponse)(nil), "grpc.lb.v1.FallbackResponse") - proto.RegisterType((*InitialLoadBalanceResponse)(nil), "grpc.lb.v1.InitialLoadBalanceResponse") - proto.RegisterType((*ServerList)(nil), "grpc.lb.v1.ServerList") - proto.RegisterType((*Server)(nil), "grpc.lb.v1.Server") -} - -func init() { proto.RegisterFile("grpc/lb/v1/load_balancer.proto", fileDescriptor_7cd3f6d792743fdf) } - -var fileDescriptor_7cd3f6d792743fdf = []byte{ - // 785 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x55, 0xdd, 0x6e, 0xdb, 0x36, - 0x14, 0x8e, 0x6a, 0x27, 0x75, 0x8e, 0xb3, 0xc5, 0x61, 0xb7, 0x4e, 0x71, 0xd3, 0x24, 0x13, 0xb0, - 0x22, 0x18, 0x3a, 0x79, 0xc9, 0x76, 0xb1, 0x01, 0xbb, 0xd8, 0xdc, 0x20, 0x48, 0xd3, 0x5e, 0x04, - 0x74, 0x80, 0x0e, 0x05, 0x06, 0x8e, 0x92, 0x68, 0x87, 0x08, 0x4d, 0x6a, 0x14, 0xed, 0x62, 0xd7, - 0x7b, 0x81, 0x3d, 0xc9, 0xb0, 0x57, 0xd8, 0x9b, 0x0d, 0x22, 0x29, 0x4b, 0xb1, 0x63, 0xf4, 0x4a, - 0xe4, 0x39, 0x1f, 0xbf, 0xf3, 0x7f, 0x04, 0x87, 0x13, 0x9d, 0xa7, 0x03, 0x91, 0x0c, 0xe6, 0xa7, - 0x03, 0xa1, 0x68, 0x46, 0x12, 0x2a, 0xa8, 0x4c, 0x99, 0x8e, 0x73, 0xad, 0x8c, 0x42, 0x50, 0xea, - 0x63, 0x91, 0xc4, 0xf3, 0xd3, 0xfe, 0xe1, 0x44, 0xa9, 0x89, 0x60, 0x03, 0xab, 0x49, 0x66, 0xe3, - 0x41, 0x36, 0xd3, 0xd4, 0x70, 0x25, 0x1d, 0xb6, 0x7f, 0xb4, 0xac, 0x37, 0x7c, 0xca, 0x0a, 0x43, - 0xa7, 0xb9, 0x03, 0x44, 0xff, 0x05, 0x80, 0xde, 0x2a, 0x9a, 0x0d, 0x9d, 0x0d, 0xcc, 0xfe, 0x98, - 0xb1, 0xc2, 0xa0, 0x6b, 0xd8, 0xe5, 0x92, 0x1b, 0x4e, 0x05, 0xd1, 0x4e, 0x14, 0x06, 0xc7, 0xc1, - 0x49, 0xf7, 0xec, 0xab, 0xb8, 0xb6, 0x1e, 0xbf, 0x76, 0x90, 0xd5, 0xf7, 0x97, 0x1b, 0xf8, 0x53, - 0xff, 0xbe, 0x62, 0xfc, 0x09, 0x76, 0x52, 0xc1, 0x99, 0x34, 0xa4, 0x30, 0xd4, 0x14, 0xe1, 0x23, - 0x4b, 0xf7, 0x45, 0x93, 0xee, 0x95, 0xd5, 0x8f, 0x4a, 0xf5, 0xe5, 0x06, 0xee, 0xa6, 0xf5, 0x75, - 0xf8, 0x0c, 0xf6, 0x9b, 0xa9, 0xa8, 0x9c, 0x22, 0xe6, 0xcf, 0x9c, 0x45, 0x03, 0xd8, 0x5f, 0xeb, - 0x09, 0x42, 0xd0, 0x96, 0x74, 0xca, 0xac, 0xfb, 0xdb, 0xd8, 0x9e, 0xa3, 0xdf, 0xe1, 0x49, 0xc3, - 0xd6, 0x35, 0xd3, 0x37, 0xea, 0x8e, 0x49, 0xf4, 0x12, 0xd0, 0x3d, 0x23, 0xa6, 0x94, 0xfa, 0x87, - 0x3d, 0x51, 0x53, 0x3b, 0xf4, 0x33, 0xd8, 0x96, 0xb3, 0x29, 0x49, 0xa9, 0x10, 0x2e, 0x9a, 0x16, - 0xee, 0xc8, 0xd9, 0xf4, 0x55, 0x79, 0x8f, 0xfe, 0x6d, 0x41, 0xb7, 0x61, 0x02, 0xfd, 0x00, 0xdb, - 0x8b, 0xcc, 0xfb, 0x4c, 0xf6, 0x63, 0x57, 0x9b, 0xb8, 0xaa, 0x4d, 0x7c, 0x53, 0x21, 0x70, 0x0d, - 0x46, 0x5f, 0xc3, 0xde, 0xc2, 0x4c, 0x99, 0x3a, 0x6d, 0x58, 0xe6, 0xcd, 0xed, 0x56, 0xe6, 0x46, - 0x4e, 0x5c, 0x06, 0x50, 0x63, 0xc7, 0x5c, 0xf2, 0xe2, 0x96, 0x65, 0x61, 0xcb, 0x82, 0x7b, 0x15, - 0xf8, 0xc2, 0xcb, 0xd1, 0x6f, 0xf0, 0xcd, 0x2a, 0x9a, 0x7c, 0xe0, 0xe6, 0x96, 0xf8, 0x4a, 0x8d, - 0x29, 0x17, 0x2c, 0x23, 0x46, 0x91, 0x82, 0xc9, 0x2c, 0xdc, 0xb2, 0x44, 0x2f, 0x96, 0x89, 0xde, - 0x71, 0x73, 0xeb, 0x62, 0xbd, 0xb0, 0xf8, 0x1b, 0x35, 0x62, 0x32, 0x43, 0x97, 0xf0, 0xe5, 0x03, - 0xf4, 0x77, 0x52, 0x7d, 0x90, 0x44, 0xb3, 0x94, 0xf1, 0x39, 0xcb, 0xc2, 0xc7, 0x96, 0xf2, 0xf9, - 0x32, 0xe5, 0x9b, 0x12, 0x85, 0x3d, 0x08, 0xfd, 0x0a, 0xe1, 0x43, 0x4e, 0x66, 0x5a, 0xe5, 0x61, - 0xe7, 0xb8, 0x75, 0xd2, 0x3d, 0x3b, 0x5a, 0xd3, 0x46, 0x55, 0x69, 0xf1, 0xe7, 0xe9, 0xb2, 0xc7, - 0xe7, 0x5a, 0xe5, 0x57, 0xed, 0x4e, 0xbb, 0xb7, 0x79, 0xd5, 0xee, 0x6c, 0xf6, 0xb6, 0xa2, 0xbf, - 0x1f, 0xc1, 0x93, 0x7b, 0xfd, 0x53, 0xe4, 0x4a, 0x16, 0x0c, 0x8d, 0xa0, 0x57, 0x8f, 0x82, 0x93, - 0xf9, 0x0a, 0xbe, 0xf8, 0xd8, 0x2c, 0x38, 0xf4, 0xe5, 0x06, 0xde, 0x5d, 0x0c, 0x83, 0x27, 0xfd, - 0x11, 0xba, 0x05, 0xd3, 0x73, 0xa6, 0x89, 0xe0, 0x85, 0xf1, 0xc3, 0xf0, 0xb4, 0xc9, 0x37, 0xb2, - 0xea, 0xb7, 0xdc, 0x0e, 0x13, 0x14, 0x8b, 0x1b, 0x7a, 0x03, 0x7b, 0x63, 0x2a, 0x44, 0x42, 0xd3, - 0xbb, 0xda, 0xa1, 0x96, 0x25, 0x38, 0x68, 0x12, 0x5c, 0x78, 0x50, 0xc3, 0x8d, 0xde, 0x78, 0x49, - 0x36, 0x3c, 0x80, 0xfe, 0xd2, 0x5c, 0x39, 0x85, 0x1b, 0x2c, 0x04, 0xbd, 0x65, 0x96, 0xe8, 0x9f, - 0x00, 0xfa, 0xeb, 0x63, 0x45, 0xdf, 0xc3, 0xd3, 0x7b, 0x3b, 0x8b, 0x64, 0x4c, 0xb0, 0x09, 0x35, - 0xd5, 0x00, 0x7e, 0xd6, 0x98, 0x23, 0x7d, 0xee, 0x75, 0xe8, 0x3d, 0x1c, 0x34, 0x97, 0x03, 0xd1, - 0x2c, 0x57, 0xda, 0x10, 0x2e, 0x0d, 0xd3, 0x73, 0x2a, 0x7c, 0x7e, 0xf6, 0x57, 0x26, 0xe6, 0xdc, - 0x6f, 0x3b, 0xbc, 0xdf, 0x58, 0x16, 0xd8, 0x3e, 0x7e, 0xed, 0xdf, 0x46, 0x3f, 0x03, 0xd4, 0xb9, - 0x44, 0x2f, 0xe1, 0xb1, 0xcb, 0x65, 0x11, 0x06, 0xb6, 0x75, 0xd0, 0x6a, 0xd2, 0x71, 0x05, 0xb9, - 0x6a, 0x77, 0x5a, 0xbd, 0x76, 0xf4, 0x57, 0x00, 0x5b, 0x4e, 0x83, 0x9e, 0x03, 0xf0, 0x9c, 0xd0, - 0x2c, 0xd3, 0xac, 0x28, 0x6c, 0x48, 0x3b, 0x78, 0x9b, 0xe7, 0xbf, 0x38, 0x41, 0xb9, 0x6c, 0x4a, - 0xdb, 0xd6, 0xdf, 0x4d, 0x6c, 0xcf, 0x6b, 0xb6, 0x4a, 0x6b, 0xcd, 0x56, 0x41, 0xd0, 0xb6, 0x7d, - 0xdd, 0x3e, 0x0e, 0x4e, 0x3a, 0xd8, 0x9e, 0x5d, 0x7f, 0x9e, 0x25, 0xb0, 0xd3, 0x48, 0xb8, 0x46, - 0x18, 0xba, 0xfe, 0x5c, 0x8a, 0xd1, 0x61, 0x33, 0x8e, 0xd5, 0x3d, 0xd8, 0x3f, 0x5a, 0xab, 0x77, - 0x95, 0x3b, 0x09, 0xbe, 0x0d, 0x86, 0xef, 0xe0, 0x13, 0xae, 0x1a, 0xc0, 0xe1, 0x5e, 0xd3, 0xe4, - 0x75, 0x99, 0xf6, 0xeb, 0xe0, 0xfd, 0xa9, 0x2f, 0xc3, 0x44, 0x09, 0x2a, 0x27, 0xb1, 0xd2, 0x93, - 0x81, 0xfd, 0x65, 0x55, 0x35, 0xb7, 0x37, 0x91, 0xd8, 0x0f, 0x11, 0x09, 0x99, 0x9f, 0x26, 0x5b, - 0xb6, 0x64, 0xdf, 0xfd, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x09, 0x7b, 0x39, 0x1e, 0xdc, 0x06, 0x00, - 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// LoadBalancerClient is the client API for LoadBalancer service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type LoadBalancerClient interface { - // Bidirectional rpc to get a list of servers. - BalanceLoad(ctx context.Context, opts ...grpc.CallOption) (LoadBalancer_BalanceLoadClient, error) -} - -type loadBalancerClient struct { - cc *grpc.ClientConn -} - -func NewLoadBalancerClient(cc *grpc.ClientConn) LoadBalancerClient { - return &loadBalancerClient{cc} -} - -func (c *loadBalancerClient) BalanceLoad(ctx context.Context, opts ...grpc.CallOption) (LoadBalancer_BalanceLoadClient, error) { - stream, err := c.cc.NewStream(ctx, &_LoadBalancer_serviceDesc.Streams[0], "/grpc.lb.v1.LoadBalancer/BalanceLoad", opts...) - if err != nil { - return nil, err - } - x := &loadBalancerBalanceLoadClient{stream} - return x, nil -} - -type LoadBalancer_BalanceLoadClient interface { - Send(*LoadBalanceRequest) error - Recv() (*LoadBalanceResponse, error) - grpc.ClientStream -} - -type loadBalancerBalanceLoadClient struct { - grpc.ClientStream -} - -func (x *loadBalancerBalanceLoadClient) Send(m *LoadBalanceRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *loadBalancerBalanceLoadClient) Recv() (*LoadBalanceResponse, error) { - m := new(LoadBalanceResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// LoadBalancerServer is the server API for LoadBalancer service. -type LoadBalancerServer interface { - // Bidirectional rpc to get a list of servers. - BalanceLoad(LoadBalancer_BalanceLoadServer) error -} - -// UnimplementedLoadBalancerServer can be embedded to have forward compatible implementations. -type UnimplementedLoadBalancerServer struct { -} - -func (*UnimplementedLoadBalancerServer) BalanceLoad(srv LoadBalancer_BalanceLoadServer) error { - return status.Errorf(codes.Unimplemented, "method BalanceLoad not implemented") -} - -func RegisterLoadBalancerServer(s *grpc.Server, srv LoadBalancerServer) { - s.RegisterService(&_LoadBalancer_serviceDesc, srv) -} - -func _LoadBalancer_BalanceLoad_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(LoadBalancerServer).BalanceLoad(&loadBalancerBalanceLoadServer{stream}) -} - -type LoadBalancer_BalanceLoadServer interface { - Send(*LoadBalanceResponse) error - Recv() (*LoadBalanceRequest, error) - grpc.ServerStream -} - -type loadBalancerBalanceLoadServer struct { - grpc.ServerStream -} - -func (x *loadBalancerBalanceLoadServer) Send(m *LoadBalanceResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *loadBalancerBalanceLoadServer) Recv() (*LoadBalanceRequest, error) { - m := new(LoadBalanceRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -var _LoadBalancer_serviceDesc = grpc.ServiceDesc{ - ServiceName: "grpc.lb.v1.LoadBalancer", - HandlerType: (*LoadBalancerServer)(nil), - Methods: []grpc.MethodDesc{}, - Streams: []grpc.StreamDesc{ - { - StreamName: "BalanceLoad", - Handler: _LoadBalancer_BalanceLoad_Handler, - ServerStreams: true, - ClientStreams: true, - }, - }, - Metadata: "grpc/lb/v1/load_balancer.proto", -} diff --git a/vendor/google.golang.org/grpc/balancer/grpclb/grpclb.go b/vendor/google.golang.org/grpc/balancer/grpclb/grpclb.go deleted file mode 100644 index 219ca7235..000000000 --- a/vendor/google.golang.org/grpc/balancer/grpclb/grpclb.go +++ /dev/null @@ -1,488 +0,0 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -//go:generate ./regenerate.sh - -// Package grpclb defines a grpclb balancer. -// -// To install grpclb balancer, import this package as: -// import _ "google.golang.org/grpc/balancer/grpclb" -package grpclb - -import ( - "context" - "errors" - "sync" - "time" - - durationpb "github.com/golang/protobuf/ptypes/duration" - "google.golang.org/grpc" - "google.golang.org/grpc/balancer" - lbpb "google.golang.org/grpc/balancer/grpclb/grpc_lb_v1" - "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/internal" - "google.golang.org/grpc/internal/backoff" - "google.golang.org/grpc/internal/resolver/dns" - "google.golang.org/grpc/resolver" -) - -const ( - lbTokenKey = "lb-token" - defaultFallbackTimeout = 10 * time.Second - grpclbName = "grpclb" -) - -var errServerTerminatedConnection = errors.New("grpclb: failed to recv server list: server terminated connection") - -func convertDuration(d *durationpb.Duration) time.Duration { - if d == nil { - return 0 - } - return time.Duration(d.Seconds)*time.Second + time.Duration(d.Nanos)*time.Nanosecond -} - -// Client API for LoadBalancer service. -// Mostly copied from generated pb.go file. -// To avoid circular dependency. -type loadBalancerClient struct { - cc *grpc.ClientConn -} - -func (c *loadBalancerClient) BalanceLoad(ctx context.Context, opts ...grpc.CallOption) (*balanceLoadClientStream, error) { - desc := &grpc.StreamDesc{ - StreamName: "BalanceLoad", - ServerStreams: true, - ClientStreams: true, - } - stream, err := c.cc.NewStream(ctx, desc, "/grpc.lb.v1.LoadBalancer/BalanceLoad", opts...) - if err != nil { - return nil, err - } - x := &balanceLoadClientStream{stream} - return x, nil -} - -type balanceLoadClientStream struct { - grpc.ClientStream -} - -func (x *balanceLoadClientStream) Send(m *lbpb.LoadBalanceRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *balanceLoadClientStream) Recv() (*lbpb.LoadBalanceResponse, error) { - m := new(lbpb.LoadBalanceResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func init() { - balancer.Register(newLBBuilder()) - dns.EnableSRVLookups = true -} - -// newLBBuilder creates a builder for grpclb. -func newLBBuilder() balancer.Builder { - return newLBBuilderWithFallbackTimeout(defaultFallbackTimeout) -} - -// newLBBuilderWithFallbackTimeout creates a grpclb builder with the given -// fallbackTimeout. If no response is received from the remote balancer within -// fallbackTimeout, the backend addresses from the resolved address list will be -// used. -// -// Only call this function when a non-default fallback timeout is needed. -func newLBBuilderWithFallbackTimeout(fallbackTimeout time.Duration) balancer.Builder { - return &lbBuilder{ - fallbackTimeout: fallbackTimeout, - } -} - -type lbBuilder struct { - fallbackTimeout time.Duration -} - -func (b *lbBuilder) Name() string { - return grpclbName -} - -func (b *lbBuilder) Build(cc balancer.ClientConn, opt balancer.BuildOptions) balancer.Balancer { - // This generates a manual resolver builder with a fixed scheme. This - // scheme will be used to dial to remote LB, so we can send filtered - // address updates to remote LB ClientConn using this manual resolver. - r := &lbManualResolver{scheme: "grpclb-internal", ccb: cc} - - lb := &lbBalancer{ - cc: newLBCacheClientConn(cc), - target: opt.Target.Endpoint, - opt: opt, - fallbackTimeout: b.fallbackTimeout, - doneCh: make(chan struct{}), - - manualResolver: r, - subConns: make(map[resolver.Address]balancer.SubConn), - scStates: make(map[balancer.SubConn]connectivity.State), - picker: &errPicker{err: balancer.ErrNoSubConnAvailable}, - clientStats: newRPCStats(), - backoff: backoff.DefaultExponential, // TODO: make backoff configurable. - } - - var err error - if opt.CredsBundle != nil { - lb.grpclbClientConnCreds, err = opt.CredsBundle.NewWithMode(internal.CredsBundleModeBalancer) - if err != nil { - grpclog.Warningf("lbBalancer: client connection creds NewWithMode failed: %v", err) - } - lb.grpclbBackendCreds, err = opt.CredsBundle.NewWithMode(internal.CredsBundleModeBackendFromBalancer) - if err != nil { - grpclog.Warningf("lbBalancer: backend creds NewWithMode failed: %v", err) - } - } - - return lb -} - -var _ balancer.V2Balancer = (*lbBalancer)(nil) // Assert that we implement V2Balancer - -type lbBalancer struct { - cc *lbCacheClientConn - target string - opt balancer.BuildOptions - - usePickFirst bool - - // grpclbClientConnCreds is the creds bundle to be used to connect to grpclb - // servers. If it's nil, use the TransportCredentials from BuildOptions - // instead. - grpclbClientConnCreds credentials.Bundle - // grpclbBackendCreds is the creds bundle to be used for addresses that are - // returned by grpclb server. If it's nil, don't set anything when creating - // SubConns. - grpclbBackendCreds credentials.Bundle - - fallbackTimeout time.Duration - doneCh chan struct{} - - // manualResolver is used in the remote LB ClientConn inside grpclb. When - // resolved address updates are received by grpclb, filtered updates will be - // send to remote LB ClientConn through this resolver. - manualResolver *lbManualResolver - // The ClientConn to talk to the remote balancer. - ccRemoteLB *remoteBalancerCCWrapper - // backoff for calling remote balancer. - backoff backoff.Strategy - - // Support client side load reporting. Each picker gets a reference to this, - // and will update its content. - clientStats *rpcStats - - mu sync.Mutex // guards everything following. - // The full server list including drops, used to check if the newly received - // serverList contains anything new. Each generate picker will also have - // reference to this list to do the first layer pick. - fullServerList []*lbpb.Server - // Backend addresses. It's kept so the addresses are available when - // switching between round_robin and pickfirst. - backendAddrs []resolver.Address - // All backends addresses, with metadata set to nil. This list contains all - // backend addresses in the same order and with the same duplicates as in - // serverlist. When generating picker, a SubConn slice with the same order - // but with only READY SCs will be gerenated. - backendAddrsWithoutMetadata []resolver.Address - // Roundrobin functionalities. - state connectivity.State - subConns map[resolver.Address]balancer.SubConn // Used to new/remove SubConn. - scStates map[balancer.SubConn]connectivity.State // Used to filter READY SubConns. - picker balancer.V2Picker - // Support fallback to resolved backend addresses if there's no response - // from remote balancer within fallbackTimeout. - remoteBalancerConnected bool - serverListReceived bool - inFallback bool - // resolvedBackendAddrs is resolvedAddrs minus remote balancers. It's set - // when resolved address updates are received, and read in the goroutine - // handling fallback. - resolvedBackendAddrs []resolver.Address -} - -// regeneratePicker takes a snapshot of the balancer, and generates a picker from -// it. The picker -// - always returns ErrTransientFailure if the balancer is in TransientFailure, -// - does two layer roundrobin pick otherwise. -// Caller must hold lb.mu. -func (lb *lbBalancer) regeneratePicker(resetDrop bool) { - if lb.state == connectivity.TransientFailure { - lb.picker = &errPicker{err: balancer.ErrTransientFailure} - return - } - - if lb.state == connectivity.Connecting { - lb.picker = &errPicker{err: balancer.ErrNoSubConnAvailable} - return - } - - var readySCs []balancer.SubConn - if lb.usePickFirst { - for _, sc := range lb.subConns { - readySCs = append(readySCs, sc) - break - } - } else { - for _, a := range lb.backendAddrsWithoutMetadata { - if sc, ok := lb.subConns[a]; ok { - if st, ok := lb.scStates[sc]; ok && st == connectivity.Ready { - readySCs = append(readySCs, sc) - } - } - } - } - - if len(readySCs) <= 0 { - // If there's no ready SubConns, always re-pick. This is to avoid drops - // unless at least one SubConn is ready. Otherwise we may drop more - // often than want because of drops + re-picks(which become re-drops). - // - // This doesn't seem to be necessary after the connecting check above. - // Kept for safety. - lb.picker = &errPicker{err: balancer.ErrNoSubConnAvailable} - return - } - if lb.inFallback { - lb.picker = newRRPicker(readySCs) - return - } - if resetDrop { - lb.picker = newLBPicker(lb.fullServerList, readySCs, lb.clientStats) - return - } - prevLBPicker, ok := lb.picker.(*lbPicker) - if !ok { - lb.picker = newLBPicker(lb.fullServerList, readySCs, lb.clientStats) - return - } - prevLBPicker.updateReadySCs(readySCs) -} - -// aggregateSubConnStats calculate the aggregated state of SubConns in -// lb.SubConns. These SubConns are subconns in use (when switching between -// fallback and grpclb). lb.scState contains states for all SubConns, including -// those in cache (SubConns are cached for 10 seconds after remove). -// -// The aggregated state is: -// - If at least one SubConn in Ready, the aggregated state is Ready; -// - Else if at least one SubConn in Connecting, the aggregated state is Connecting; -// - Else the aggregated state is TransientFailure. -func (lb *lbBalancer) aggregateSubConnStates() connectivity.State { - var numConnecting uint64 - - for _, sc := range lb.subConns { - if state, ok := lb.scStates[sc]; ok { - switch state { - case connectivity.Ready: - return connectivity.Ready - case connectivity.Connecting: - numConnecting++ - } - } - } - if numConnecting > 0 { - return connectivity.Connecting - } - return connectivity.TransientFailure -} - -func (lb *lbBalancer) HandleSubConnStateChange(sc balancer.SubConn, s connectivity.State) { - panic("not used") -} - -func (lb *lbBalancer) UpdateSubConnState(sc balancer.SubConn, scs balancer.SubConnState) { - s := scs.ConnectivityState - if grpclog.V(2) { - grpclog.Infof("lbBalancer: handle SubConn state change: %p, %v", sc, s) - } - lb.mu.Lock() - defer lb.mu.Unlock() - - oldS, ok := lb.scStates[sc] - if !ok { - if grpclog.V(2) { - grpclog.Infof("lbBalancer: got state changes for an unknown SubConn: %p, %v", sc, s) - } - return - } - lb.scStates[sc] = s - switch s { - case connectivity.Idle: - sc.Connect() - case connectivity.Shutdown: - // When an address was removed by resolver, b called RemoveSubConn but - // kept the sc's state in scStates. Remove state for this sc here. - delete(lb.scStates, sc) - } - // Force regenerate picker if - // - this sc became ready from not-ready - // - this sc became not-ready from ready - lb.updateStateAndPicker((oldS == connectivity.Ready) != (s == connectivity.Ready), false) - - // Enter fallback when the aggregated state is not Ready and the connection - // to remote balancer is lost. - if lb.state != connectivity.Ready { - if !lb.inFallback && !lb.remoteBalancerConnected { - // Enter fallback. - lb.refreshSubConns(lb.resolvedBackendAddrs, true, lb.usePickFirst) - } - } -} - -// updateStateAndPicker re-calculate the aggregated state, and regenerate picker -// if overall state is changed. -// -// If forceRegeneratePicker is true, picker will be regenerated. -func (lb *lbBalancer) updateStateAndPicker(forceRegeneratePicker bool, resetDrop bool) { - oldAggrState := lb.state - lb.state = lb.aggregateSubConnStates() - // Regenerate picker when one of the following happens: - // - caller wants to regenerate - // - the aggregated state changed - if forceRegeneratePicker || (lb.state != oldAggrState) { - lb.regeneratePicker(resetDrop) - } - - lb.cc.UpdateState(balancer.State{ConnectivityState: lb.state, Picker: lb.picker}) -} - -// fallbackToBackendsAfter blocks for fallbackTimeout and falls back to use -// resolved backends (backends received from resolver, not from remote balancer) -// if no connection to remote balancers was successful. -func (lb *lbBalancer) fallbackToBackendsAfter(fallbackTimeout time.Duration) { - timer := time.NewTimer(fallbackTimeout) - defer timer.Stop() - select { - case <-timer.C: - case <-lb.doneCh: - return - } - lb.mu.Lock() - if lb.inFallback || lb.serverListReceived { - lb.mu.Unlock() - return - } - // Enter fallback. - lb.refreshSubConns(lb.resolvedBackendAddrs, true, lb.usePickFirst) - lb.mu.Unlock() -} - -// HandleResolvedAddrs sends the updated remoteLB addresses to remoteLB -// clientConn. The remoteLB clientConn will handle creating/removing remoteLB -// connections. -func (lb *lbBalancer) HandleResolvedAddrs(addrs []resolver.Address, err error) { - panic("not used") -} - -func (lb *lbBalancer) handleServiceConfig(gc *grpclbServiceConfig) { - lb.mu.Lock() - defer lb.mu.Unlock() - - newUsePickFirst := childIsPickFirst(gc) - if lb.usePickFirst == newUsePickFirst { - return - } - if grpclog.V(2) { - grpclog.Infof("lbBalancer: switching mode, new usePickFirst: %+v", newUsePickFirst) - } - lb.refreshSubConns(lb.backendAddrs, lb.inFallback, newUsePickFirst) -} - -func (lb *lbBalancer) ResolverError(error) { - // Ignore resolver errors. GRPCLB is not selected unless the resolver - // works at least once. -} - -func (lb *lbBalancer) UpdateClientConnState(ccs balancer.ClientConnState) error { - if grpclog.V(2) { - grpclog.Infof("lbBalancer: UpdateClientConnState: %+v", ccs) - } - gc, _ := ccs.BalancerConfig.(*grpclbServiceConfig) - lb.handleServiceConfig(gc) - - addrs := ccs.ResolverState.Addresses - if len(addrs) == 0 { - // There should be at least one address, either grpclb server or - // fallback. Empty address is not valid. - return balancer.ErrBadResolverState - } - - var remoteBalancerAddrs, backendAddrs []resolver.Address - for _, a := range addrs { - if a.Type == resolver.GRPCLB { - a.Type = resolver.Backend - remoteBalancerAddrs = append(remoteBalancerAddrs, a) - } else { - backendAddrs = append(backendAddrs, a) - } - } - - if len(remoteBalancerAddrs) == 0 { - if lb.ccRemoteLB != nil { - lb.ccRemoteLB.close() - lb.ccRemoteLB = nil - } - } else if lb.ccRemoteLB == nil { - // First time receiving resolved addresses, create a cc to remote - // balancers. - lb.newRemoteBalancerCCWrapper() - // Start the fallback goroutine. - go lb.fallbackToBackendsAfter(lb.fallbackTimeout) - } - - if lb.ccRemoteLB != nil { - // cc to remote balancers uses lb.manualResolver. Send the updated remote - // balancer addresses to it through manualResolver. - lb.manualResolver.UpdateState(resolver.State{Addresses: remoteBalancerAddrs}) - } - - lb.mu.Lock() - lb.resolvedBackendAddrs = backendAddrs - if len(remoteBalancerAddrs) == 0 || lb.inFallback { - // If there's no remote balancer address in ClientConn update, grpclb - // enters fallback mode immediately. - // - // If a new update is received while grpclb is in fallback, update the - // list of backends being used to the new fallback backends. - lb.refreshSubConns(lb.resolvedBackendAddrs, true, lb.usePickFirst) - } - lb.mu.Unlock() - return nil -} - -func (lb *lbBalancer) Close() { - select { - case <-lb.doneCh: - return - default: - } - close(lb.doneCh) - if lb.ccRemoteLB != nil { - lb.ccRemoteLB.close() - } - lb.cc.close() -} diff --git a/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_config.go b/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_config.go deleted file mode 100644 index aac371963..000000000 --- a/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_config.go +++ /dev/null @@ -1,66 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package grpclb - -import ( - "encoding/json" - - "google.golang.org/grpc" - "google.golang.org/grpc/balancer/roundrobin" - "google.golang.org/grpc/serviceconfig" -) - -const ( - roundRobinName = roundrobin.Name - pickFirstName = grpc.PickFirstBalancerName -) - -type grpclbServiceConfig struct { - serviceconfig.LoadBalancingConfig - ChildPolicy *[]map[string]json.RawMessage -} - -func (b *lbBuilder) ParseConfig(lbConfig json.RawMessage) (serviceconfig.LoadBalancingConfig, error) { - ret := &grpclbServiceConfig{} - if err := json.Unmarshal(lbConfig, ret); err != nil { - return nil, err - } - return ret, nil -} - -func childIsPickFirst(sc *grpclbServiceConfig) bool { - if sc == nil { - return false - } - childConfigs := sc.ChildPolicy - if childConfigs == nil { - return false - } - for _, childC := range *childConfigs { - // If round_robin exists before pick_first, return false - if _, ok := childC[roundRobinName]; ok { - return false - } - // If pick_first is before round_robin, return true - if _, ok := childC[pickFirstName]; ok { - return true - } - } - return false -} diff --git a/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_picker.go b/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_picker.go deleted file mode 100644 index 39bc5cc71..000000000 --- a/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_picker.go +++ /dev/null @@ -1,202 +0,0 @@ -/* - * - * Copyright 2017 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package grpclb - -import ( - "sync" - "sync/atomic" - - "google.golang.org/grpc/balancer" - lbpb "google.golang.org/grpc/balancer/grpclb/grpc_lb_v1" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/internal/grpcrand" - "google.golang.org/grpc/status" -) - -// rpcStats is same as lbpb.ClientStats, except that numCallsDropped is a map -// instead of a slice. -type rpcStats struct { - // Only access the following fields atomically. - numCallsStarted int64 - numCallsFinished int64 - numCallsFinishedWithClientFailedToSend int64 - numCallsFinishedKnownReceived int64 - - mu sync.Mutex - // map load_balance_token -> num_calls_dropped - numCallsDropped map[string]int64 -} - -func newRPCStats() *rpcStats { - return &rpcStats{ - numCallsDropped: make(map[string]int64), - } -} - -func isZeroStats(stats *lbpb.ClientStats) bool { - return len(stats.CallsFinishedWithDrop) == 0 && - stats.NumCallsStarted == 0 && - stats.NumCallsFinished == 0 && - stats.NumCallsFinishedWithClientFailedToSend == 0 && - stats.NumCallsFinishedKnownReceived == 0 -} - -// toClientStats converts rpcStats to lbpb.ClientStats, and clears rpcStats. -func (s *rpcStats) toClientStats() *lbpb.ClientStats { - stats := &lbpb.ClientStats{ - NumCallsStarted: atomic.SwapInt64(&s.numCallsStarted, 0), - NumCallsFinished: atomic.SwapInt64(&s.numCallsFinished, 0), - NumCallsFinishedWithClientFailedToSend: atomic.SwapInt64(&s.numCallsFinishedWithClientFailedToSend, 0), - NumCallsFinishedKnownReceived: atomic.SwapInt64(&s.numCallsFinishedKnownReceived, 0), - } - s.mu.Lock() - dropped := s.numCallsDropped - s.numCallsDropped = make(map[string]int64) - s.mu.Unlock() - for token, count := range dropped { - stats.CallsFinishedWithDrop = append(stats.CallsFinishedWithDrop, &lbpb.ClientStatsPerToken{ - LoadBalanceToken: token, - NumCalls: count, - }) - } - return stats -} - -func (s *rpcStats) drop(token string) { - atomic.AddInt64(&s.numCallsStarted, 1) - s.mu.Lock() - s.numCallsDropped[token]++ - s.mu.Unlock() - atomic.AddInt64(&s.numCallsFinished, 1) -} - -func (s *rpcStats) failedToSend() { - atomic.AddInt64(&s.numCallsStarted, 1) - atomic.AddInt64(&s.numCallsFinishedWithClientFailedToSend, 1) - atomic.AddInt64(&s.numCallsFinished, 1) -} - -func (s *rpcStats) knownReceived() { - atomic.AddInt64(&s.numCallsStarted, 1) - atomic.AddInt64(&s.numCallsFinishedKnownReceived, 1) - atomic.AddInt64(&s.numCallsFinished, 1) -} - -type errPicker struct { - // Pick always returns this err. - err error -} - -func (p *errPicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { - return balancer.PickResult{}, p.err -} - -// rrPicker does roundrobin on subConns. It's typically used when there's no -// response from remote balancer, and grpclb falls back to the resolved -// backends. -// -// It guaranteed that len(subConns) > 0. -type rrPicker struct { - mu sync.Mutex - subConns []balancer.SubConn // The subConns that were READY when taking the snapshot. - subConnsNext int -} - -func newRRPicker(readySCs []balancer.SubConn) *rrPicker { - return &rrPicker{ - subConns: readySCs, - subConnsNext: grpcrand.Intn(len(readySCs)), - } -} - -func (p *rrPicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { - p.mu.Lock() - defer p.mu.Unlock() - sc := p.subConns[p.subConnsNext] - p.subConnsNext = (p.subConnsNext + 1) % len(p.subConns) - return balancer.PickResult{SubConn: sc}, nil -} - -// lbPicker does two layers of picks: -// -// First layer: roundrobin on all servers in serverList, including drops and backends. -// - If it picks a drop, the RPC will fail as being dropped. -// - If it picks a backend, do a second layer pick to pick the real backend. -// -// Second layer: roundrobin on all READY backends. -// -// It's guaranteed that len(serverList) > 0. -type lbPicker struct { - mu sync.Mutex - serverList []*lbpb.Server - serverListNext int - subConns []balancer.SubConn // The subConns that were READY when taking the snapshot. - subConnsNext int - - stats *rpcStats -} - -func newLBPicker(serverList []*lbpb.Server, readySCs []balancer.SubConn, stats *rpcStats) *lbPicker { - return &lbPicker{ - serverList: serverList, - subConns: readySCs, - subConnsNext: grpcrand.Intn(len(readySCs)), - stats: stats, - } -} - -func (p *lbPicker) Pick(balancer.PickInfo) (balancer.PickResult, error) { - p.mu.Lock() - defer p.mu.Unlock() - - // Layer one roundrobin on serverList. - s := p.serverList[p.serverListNext] - p.serverListNext = (p.serverListNext + 1) % len(p.serverList) - - // If it's a drop, return an error and fail the RPC. - if s.Drop { - p.stats.drop(s.LoadBalanceToken) - return balancer.PickResult{}, status.Errorf(codes.Unavailable, "request dropped by grpclb") - } - - // If not a drop but there's no ready subConns. - if len(p.subConns) <= 0 { - return balancer.PickResult{}, balancer.ErrNoSubConnAvailable - } - - // Return the next ready subConn in the list, also collect rpc stats. - sc := p.subConns[p.subConnsNext] - p.subConnsNext = (p.subConnsNext + 1) % len(p.subConns) - done := func(info balancer.DoneInfo) { - if !info.BytesSent { - p.stats.failedToSend() - } else if info.BytesReceived { - p.stats.knownReceived() - } - } - return balancer.PickResult{SubConn: sc, Done: done}, nil -} - -func (p *lbPicker) updateReadySCs(readySCs []balancer.SubConn) { - p.mu.Lock() - defer p.mu.Unlock() - - p.subConns = readySCs - p.subConnsNext = p.subConnsNext % len(readySCs) -} diff --git a/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_remote_balancer.go b/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_remote_balancer.go deleted file mode 100644 index e70ce7500..000000000 --- a/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_remote_balancer.go +++ /dev/null @@ -1,407 +0,0 @@ -/* - * - * Copyright 2017 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package grpclb - -import ( - "context" - "fmt" - "io" - "net" - "sync" - "time" - - "github.com/golang/protobuf/proto" - timestamppb "github.com/golang/protobuf/ptypes/timestamp" - "github.com/google/go-cmp/cmp" - "google.golang.org/grpc" - "google.golang.org/grpc/balancer" - lbpb "google.golang.org/grpc/balancer/grpclb/grpc_lb_v1" - "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/internal/backoff" - "google.golang.org/grpc/internal/channelz" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/resolver" -) - -// processServerList updates balaner's internal state, create/remove SubConns -// and regenerates picker using the received serverList. -func (lb *lbBalancer) processServerList(l *lbpb.ServerList) { - if grpclog.V(2) { - grpclog.Infof("lbBalancer: processing server list: %+v", l) - } - lb.mu.Lock() - defer lb.mu.Unlock() - - // Set serverListReceived to true so fallback will not take effect if it has - // not hit timeout. - lb.serverListReceived = true - - // If the new server list == old server list, do nothing. - if cmp.Equal(lb.fullServerList, l.Servers, cmp.Comparer(proto.Equal)) { - if grpclog.V(2) { - grpclog.Infof("lbBalancer: new serverlist same as the previous one, ignoring") - } - return - } - lb.fullServerList = l.Servers - - var backendAddrs []resolver.Address - for i, s := range l.Servers { - if s.Drop { - continue - } - - md := metadata.Pairs(lbTokenKey, s.LoadBalanceToken) - ip := net.IP(s.IpAddress) - ipStr := ip.String() - if ip.To4() == nil { - // Add square brackets to ipv6 addresses, otherwise net.Dial() and - // net.SplitHostPort() will return too many colons error. - ipStr = fmt.Sprintf("[%s]", ipStr) - } - addr := resolver.Address{ - Addr: fmt.Sprintf("%s:%d", ipStr, s.Port), - Metadata: &md, - } - if grpclog.V(2) { - grpclog.Infof("lbBalancer: server list entry[%d]: ipStr:|%s|, port:|%d|, load balancer token:|%v|", - i, ipStr, s.Port, s.LoadBalanceToken) - } - backendAddrs = append(backendAddrs, addr) - } - - // Call refreshSubConns to create/remove SubConns. If we are in fallback, - // this is also exiting fallback. - lb.refreshSubConns(backendAddrs, false, lb.usePickFirst) -} - -// refreshSubConns creates/removes SubConns with backendAddrs, and refreshes -// balancer state and picker. -// -// Caller must hold lb.mu. -func (lb *lbBalancer) refreshSubConns(backendAddrs []resolver.Address, fallback bool, pickFirst bool) { - opts := balancer.NewSubConnOptions{} - if !fallback { - opts.CredsBundle = lb.grpclbBackendCreds - } - - lb.backendAddrs = backendAddrs - lb.backendAddrsWithoutMetadata = nil - - fallbackModeChanged := lb.inFallback != fallback - lb.inFallback = fallback - if fallbackModeChanged && lb.inFallback { - // Clear previous received list when entering fallback, so if the server - // comes back and sends the same list again, the new addresses will be - // used. - lb.fullServerList = nil - } - - balancingPolicyChanged := lb.usePickFirst != pickFirst - oldUsePickFirst := lb.usePickFirst - lb.usePickFirst = pickFirst - - if fallbackModeChanged || balancingPolicyChanged { - // Remove all SubConns when switching balancing policy or switching - // fallback mode. - // - // For fallback mode switching with pickfirst, we want to recreate the - // SubConn because the creds could be different. - for a, sc := range lb.subConns { - if oldUsePickFirst { - // If old SubConn were created for pickfirst, bypass cache and - // remove directly. - lb.cc.cc.RemoveSubConn(sc) - } else { - lb.cc.RemoveSubConn(sc) - } - delete(lb.subConns, a) - } - } - - if lb.usePickFirst { - var sc balancer.SubConn - for _, sc = range lb.subConns { - break - } - if sc != nil { - sc.UpdateAddresses(backendAddrs) - sc.Connect() - return - } - // This bypasses the cc wrapper with SubConn cache. - sc, err := lb.cc.cc.NewSubConn(backendAddrs, opts) - if err != nil { - grpclog.Warningf("grpclb: failed to create new SubConn: %v", err) - return - } - sc.Connect() - lb.subConns[backendAddrs[0]] = sc - lb.scStates[sc] = connectivity.Idle - return - } - - // addrsSet is the set converted from backendAddrsWithoutMetadata, it's used to quick - // lookup for an address. - addrsSet := make(map[resolver.Address]struct{}) - // Create new SubConns. - for _, addr := range backendAddrs { - addrWithoutMD := addr - addrWithoutMD.Metadata = nil - addrsSet[addrWithoutMD] = struct{}{} - lb.backendAddrsWithoutMetadata = append(lb.backendAddrsWithoutMetadata, addrWithoutMD) - - if _, ok := lb.subConns[addrWithoutMD]; !ok { - // Use addrWithMD to create the SubConn. - sc, err := lb.cc.NewSubConn([]resolver.Address{addr}, opts) - if err != nil { - grpclog.Warningf("grpclb: failed to create new SubConn: %v", err) - continue - } - lb.subConns[addrWithoutMD] = sc // Use the addr without MD as key for the map. - if _, ok := lb.scStates[sc]; !ok { - // Only set state of new sc to IDLE. The state could already be - // READY for cached SubConns. - lb.scStates[sc] = connectivity.Idle - } - sc.Connect() - } - } - - for a, sc := range lb.subConns { - // a was removed by resolver. - if _, ok := addrsSet[a]; !ok { - lb.cc.RemoveSubConn(sc) - delete(lb.subConns, a) - // Keep the state of this sc in b.scStates until sc's state becomes Shutdown. - // The entry will be deleted in HandleSubConnStateChange. - } - } - - // Regenerate and update picker after refreshing subconns because with - // cache, even if SubConn was newed/removed, there might be no state - // changes (the subconn will be kept in cache, not actually - // newed/removed). - lb.updateStateAndPicker(true, true) -} - -type remoteBalancerCCWrapper struct { - cc *grpc.ClientConn - lb *lbBalancer - backoff backoff.Strategy - done chan struct{} - - // waitgroup to wait for all goroutines to exit. - wg sync.WaitGroup -} - -func (lb *lbBalancer) newRemoteBalancerCCWrapper() { - var dopts []grpc.DialOption - if creds := lb.opt.DialCreds; creds != nil { - dopts = append(dopts, grpc.WithTransportCredentials(creds)) - } else if bundle := lb.grpclbClientConnCreds; bundle != nil { - dopts = append(dopts, grpc.WithCredentialsBundle(bundle)) - } else { - dopts = append(dopts, grpc.WithInsecure()) - } - if lb.opt.Dialer != nil { - dopts = append(dopts, grpc.WithContextDialer(lb.opt.Dialer)) - } - // Explicitly set pickfirst as the balancer. - dopts = append(dopts, grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy":"pick_first"}`)) - dopts = append(dopts, grpc.WithResolvers(lb.manualResolver)) - if channelz.IsOn() { - dopts = append(dopts, grpc.WithChannelzParentID(lb.opt.ChannelzParentID)) - } - - // Enable Keepalive for grpclb client. - dopts = append(dopts, grpc.WithKeepaliveParams(keepalive.ClientParameters{ - Time: 20 * time.Second, - Timeout: 10 * time.Second, - PermitWithoutStream: true, - })) - - // The dial target is not important. - // - // The grpclb server addresses will set field ServerName, and creds will - // receive ServerName as authority. - cc, err := grpc.DialContext(context.Background(), lb.manualResolver.Scheme()+":///grpclb.subClientConn", dopts...) - if err != nil { - grpclog.Fatalf("failed to dial: %v", err) - } - ccw := &remoteBalancerCCWrapper{ - cc: cc, - lb: lb, - backoff: lb.backoff, - done: make(chan struct{}), - } - lb.ccRemoteLB = ccw - ccw.wg.Add(1) - go ccw.watchRemoteBalancer() -} - -// close closed the ClientConn to remote balancer, and waits until all -// goroutines to finish. -func (ccw *remoteBalancerCCWrapper) close() { - close(ccw.done) - ccw.cc.Close() - ccw.wg.Wait() -} - -func (ccw *remoteBalancerCCWrapper) readServerList(s *balanceLoadClientStream) error { - for { - reply, err := s.Recv() - if err != nil { - if err == io.EOF { - return errServerTerminatedConnection - } - return fmt.Errorf("grpclb: failed to recv server list: %v", err) - } - if serverList := reply.GetServerList(); serverList != nil { - ccw.lb.processServerList(serverList) - } - } -} - -func (ccw *remoteBalancerCCWrapper) sendLoadReport(s *balanceLoadClientStream, interval time.Duration) { - ticker := time.NewTicker(interval) - defer ticker.Stop() - lastZero := false - for { - select { - case <-ticker.C: - case <-s.Context().Done(): - return - } - stats := ccw.lb.clientStats.toClientStats() - zero := isZeroStats(stats) - if zero && lastZero { - // Quash redundant empty load reports. - continue - } - lastZero = zero - t := time.Now() - stats.Timestamp = ×tamppb.Timestamp{ - Seconds: t.Unix(), - Nanos: int32(t.Nanosecond()), - } - if err := s.Send(&lbpb.LoadBalanceRequest{ - LoadBalanceRequestType: &lbpb.LoadBalanceRequest_ClientStats{ - ClientStats: stats, - }, - }); err != nil { - return - } - } -} - -func (ccw *remoteBalancerCCWrapper) callRemoteBalancer() (backoff bool, _ error) { - lbClient := &loadBalancerClient{cc: ccw.cc} - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - stream, err := lbClient.BalanceLoad(ctx, grpc.WaitForReady(true)) - if err != nil { - return true, fmt.Errorf("grpclb: failed to perform RPC to the remote balancer %v", err) - } - ccw.lb.mu.Lock() - ccw.lb.remoteBalancerConnected = true - ccw.lb.mu.Unlock() - - // grpclb handshake on the stream. - initReq := &lbpb.LoadBalanceRequest{ - LoadBalanceRequestType: &lbpb.LoadBalanceRequest_InitialRequest{ - InitialRequest: &lbpb.InitialLoadBalanceRequest{ - Name: ccw.lb.target, - }, - }, - } - if err := stream.Send(initReq); err != nil { - return true, fmt.Errorf("grpclb: failed to send init request: %v", err) - } - reply, err := stream.Recv() - if err != nil { - return true, fmt.Errorf("grpclb: failed to recv init response: %v", err) - } - initResp := reply.GetInitialResponse() - if initResp == nil { - return true, fmt.Errorf("grpclb: reply from remote balancer did not include initial response") - } - if initResp.LoadBalancerDelegate != "" { - return true, fmt.Errorf("grpclb: Delegation is not supported") - } - - ccw.wg.Add(1) - go func() { - defer ccw.wg.Done() - if d := convertDuration(initResp.ClientStatsReportInterval); d > 0 { - ccw.sendLoadReport(stream, d) - } - }() - // No backoff if init req/resp handshake was successful. - return false, ccw.readServerList(stream) -} - -func (ccw *remoteBalancerCCWrapper) watchRemoteBalancer() { - defer ccw.wg.Done() - var retryCount int - for { - doBackoff, err := ccw.callRemoteBalancer() - select { - case <-ccw.done: - return - default: - if err != nil { - if err == errServerTerminatedConnection { - grpclog.Info(err) - } else { - grpclog.Warning(err) - } - } - } - // Trigger a re-resolve when the stream errors. - ccw.lb.cc.cc.ResolveNow(resolver.ResolveNowOptions{}) - - ccw.lb.mu.Lock() - ccw.lb.remoteBalancerConnected = false - ccw.lb.fullServerList = nil - // Enter fallback when connection to remote balancer is lost, and the - // aggregated state is not Ready. - if !ccw.lb.inFallback && ccw.lb.state != connectivity.Ready { - // Entering fallback. - ccw.lb.refreshSubConns(ccw.lb.resolvedBackendAddrs, true, ccw.lb.usePickFirst) - } - ccw.lb.mu.Unlock() - - if !doBackoff { - retryCount = 0 - continue - } - - timer := time.NewTimer(ccw.backoff.Backoff(retryCount)) // Copy backoff - select { - case <-timer.C: - case <-ccw.done: - timer.Stop() - return - } - retryCount++ - } -} diff --git a/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_util.go b/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_util.go deleted file mode 100644 index 636725e54..000000000 --- a/vendor/google.golang.org/grpc/balancer/grpclb/grpclb_util.go +++ /dev/null @@ -1,208 +0,0 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package grpclb - -import ( - "fmt" - "sync" - "time" - - "google.golang.org/grpc/balancer" - "google.golang.org/grpc/resolver" -) - -// The parent ClientConn should re-resolve when grpclb loses connection to the -// remote balancer. When the ClientConn inside grpclb gets a TransientFailure, -// it calls lbManualResolver.ResolveNow(), which calls parent ClientConn's -// ResolveNow, and eventually results in re-resolve happening in parent -// ClientConn's resolver (DNS for example). -// -// parent -// ClientConn -// +-----------------------------------------------------------------+ -// | parent +---------------------------------+ | -// | DNS ClientConn | grpclb | | -// | resolver balancerWrapper | | | -// | + + | grpclb grpclb | | -// | | | | ManualResolver ClientConn | | -// | | | | + + | | -// | | | | | | Transient | | -// | | | | | | Failure | | -// | | | | | <--------- | | | -// | | | <--------------- | ResolveNow | | | -// | | <--------- | ResolveNow | | | | | -// | | ResolveNow | | | | | | -// | | | | | | | | -// | + + | + + | | -// | +---------------------------------+ | -// +-----------------------------------------------------------------+ - -// lbManualResolver is used by the ClientConn inside grpclb. It's a manual -// resolver with a special ResolveNow() function. -// -// When ResolveNow() is called, it calls ResolveNow() on the parent ClientConn, -// so when grpclb client lose contact with remote balancers, the parent -// ClientConn's resolver will re-resolve. -type lbManualResolver struct { - scheme string - ccr resolver.ClientConn - - ccb balancer.ClientConn -} - -func (r *lbManualResolver) Build(_ resolver.Target, cc resolver.ClientConn, _ resolver.BuildOptions) (resolver.Resolver, error) { - r.ccr = cc - return r, nil -} - -func (r *lbManualResolver) Scheme() string { - return r.scheme -} - -// ResolveNow calls resolveNow on the parent ClientConn. -func (r *lbManualResolver) ResolveNow(o resolver.ResolveNowOptions) { - r.ccb.ResolveNow(o) -} - -// Close is a noop for Resolver. -func (*lbManualResolver) Close() {} - -// UpdateState calls cc.UpdateState. -func (r *lbManualResolver) UpdateState(s resolver.State) { - r.ccr.UpdateState(s) -} - -const subConnCacheTime = time.Second * 10 - -// lbCacheClientConn is a wrapper balancer.ClientConn with a SubConn cache. -// SubConns will be kept in cache for subConnCacheTime before being removed. -// -// Its new and remove methods are updated to do cache first. -type lbCacheClientConn struct { - cc balancer.ClientConn - timeout time.Duration - - mu sync.Mutex - // subConnCache only keeps subConns that are being deleted. - subConnCache map[resolver.Address]*subConnCacheEntry - subConnToAddr map[balancer.SubConn]resolver.Address -} - -type subConnCacheEntry struct { - sc balancer.SubConn - - cancel func() - abortDeleting bool -} - -func newLBCacheClientConn(cc balancer.ClientConn) *lbCacheClientConn { - return &lbCacheClientConn{ - cc: cc, - timeout: subConnCacheTime, - subConnCache: make(map[resolver.Address]*subConnCacheEntry), - subConnToAddr: make(map[balancer.SubConn]resolver.Address), - } -} - -func (ccc *lbCacheClientConn) NewSubConn(addrs []resolver.Address, opts balancer.NewSubConnOptions) (balancer.SubConn, error) { - if len(addrs) != 1 { - return nil, fmt.Errorf("grpclb calling NewSubConn with addrs of length %v", len(addrs)) - } - addrWithoutMD := addrs[0] - addrWithoutMD.Metadata = nil - - ccc.mu.Lock() - defer ccc.mu.Unlock() - if entry, ok := ccc.subConnCache[addrWithoutMD]; ok { - // If entry is in subConnCache, the SubConn was being deleted. - // cancel function will never be nil. - entry.cancel() - delete(ccc.subConnCache, addrWithoutMD) - return entry.sc, nil - } - - scNew, err := ccc.cc.NewSubConn(addrs, opts) - if err != nil { - return nil, err - } - - ccc.subConnToAddr[scNew] = addrWithoutMD - return scNew, nil -} - -func (ccc *lbCacheClientConn) RemoveSubConn(sc balancer.SubConn) { - ccc.mu.Lock() - defer ccc.mu.Unlock() - addr, ok := ccc.subConnToAddr[sc] - if !ok { - return - } - - if entry, ok := ccc.subConnCache[addr]; ok { - if entry.sc != sc { - // This could happen if NewSubConn was called multiple times for the - // same address, and those SubConns are all removed. We remove sc - // immediately here. - delete(ccc.subConnToAddr, sc) - ccc.cc.RemoveSubConn(sc) - } - return - } - - entry := &subConnCacheEntry{ - sc: sc, - } - ccc.subConnCache[addr] = entry - - timer := time.AfterFunc(ccc.timeout, func() { - ccc.mu.Lock() - defer ccc.mu.Unlock() - if entry.abortDeleting { - return - } - ccc.cc.RemoveSubConn(sc) - delete(ccc.subConnToAddr, sc) - delete(ccc.subConnCache, addr) - }) - entry.cancel = func() { - if !timer.Stop() { - // If stop was not successful, the timer has fired (this can only - // happen in a race). But the deleting function is blocked on ccc.mu - // because the mutex was held by the caller of this function. - // - // Set abortDeleting to true to abort the deleting function. When - // the lock is released, the deleting function will acquire the - // lock, check the value of abortDeleting and return. - entry.abortDeleting = true - } - } -} - -func (ccc *lbCacheClientConn) UpdateState(s balancer.State) { - ccc.cc.UpdateState(s) -} - -func (ccc *lbCacheClientConn) close() { - ccc.mu.Lock() - // Only cancel all existing timers. There's no need to remove SubConns. - for _, entry := range ccc.subConnCache { - entry.cancel() - } - ccc.mu.Unlock() -} diff --git a/vendor/google.golang.org/grpc/balancer/grpclb/regenerate.sh b/vendor/google.golang.org/grpc/balancer/grpclb/regenerate.sh deleted file mode 100644 index b8978e11b..000000000 --- a/vendor/google.golang.org/grpc/balancer/grpclb/regenerate.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash -# Copyright 2018 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eux -o pipefail - -TMP=$(mktemp -d) - -function finish { - rm -rf "$TMP" -} -trap finish EXIT - -pushd "$TMP" -mkdir -p grpc/lb/v1 -curl https://raw.githubusercontent.com/grpc/grpc-proto/master/grpc/lb/v1/load_balancer.proto > grpc/lb/v1/load_balancer.proto - -protoc --go_out=plugins=grpc,paths=source_relative:. -I. grpc/lb/v1/*.proto -popd -rm -f grpc_lb_v1/*.pb.go -cp "$TMP"/grpc/lb/v1/*.pb.go grpc_lb_v1/ - diff --git a/vendor/google.golang.org/grpc/credentials/alts/alts.go b/vendor/google.golang.org/grpc/credentials/alts/alts.go deleted file mode 100644 index 72c7f0b23..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/alts.go +++ /dev/null @@ -1,330 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package alts implements the ALTS credential support by gRPC library, which -// encapsulates all the state needed by a client to authenticate with a server -// using ALTS and make various assertions, e.g., about the client's identity, -// role, or whether it is authorized to make a particular call. -// This package is experimental. -package alts - -import ( - "context" - "errors" - "fmt" - "net" - "sync" - "time" - - "google.golang.org/grpc/credentials" - core "google.golang.org/grpc/credentials/alts/internal" - "google.golang.org/grpc/credentials/alts/internal/handshaker" - "google.golang.org/grpc/credentials/alts/internal/handshaker/service" - altspb "google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp" - "google.golang.org/grpc/grpclog" -) - -const ( - // hypervisorHandshakerServiceAddress represents the default ALTS gRPC - // handshaker service address in the hypervisor. - hypervisorHandshakerServiceAddress = "metadata.google.internal:8080" - // defaultTimeout specifies the server handshake timeout. - defaultTimeout = 30.0 * time.Second - // The following constants specify the minimum and maximum acceptable - // protocol versions. - protocolVersionMaxMajor = 2 - protocolVersionMaxMinor = 1 - protocolVersionMinMajor = 2 - protocolVersionMinMinor = 1 -) - -var ( - once sync.Once - maxRPCVersion = &altspb.RpcProtocolVersions_Version{ - Major: protocolVersionMaxMajor, - Minor: protocolVersionMaxMinor, - } - minRPCVersion = &altspb.RpcProtocolVersions_Version{ - Major: protocolVersionMinMajor, - Minor: protocolVersionMinMinor, - } - // ErrUntrustedPlatform is returned from ClientHandshake and - // ServerHandshake is running on a platform where the trustworthiness of - // the handshaker service is not guaranteed. - ErrUntrustedPlatform = errors.New("ALTS: untrusted platform. ALTS is only supported on GCP") -) - -// AuthInfo exposes security information from the ALTS handshake to the -// application. This interface is to be implemented by ALTS. Users should not -// need a brand new implementation of this interface. For situations like -// testing, any new implementation should embed this interface. This allows -// ALTS to add new methods to this interface. -type AuthInfo interface { - // ApplicationProtocol returns application protocol negotiated for the - // ALTS connection. - ApplicationProtocol() string - // RecordProtocol returns the record protocol negotiated for the ALTS - // connection. - RecordProtocol() string - // SecurityLevel returns the security level of the created ALTS secure - // channel. - SecurityLevel() altspb.SecurityLevel - // PeerServiceAccount returns the peer service account. - PeerServiceAccount() string - // LocalServiceAccount returns the local service account. - LocalServiceAccount() string - // PeerRPCVersions returns the RPC version supported by the peer. - PeerRPCVersions() *altspb.RpcProtocolVersions -} - -// ClientOptions contains the client-side options of an ALTS channel. These -// options will be passed to the underlying ALTS handshaker. -type ClientOptions struct { - // TargetServiceAccounts contains a list of expected target service - // accounts. - TargetServiceAccounts []string - // HandshakerServiceAddress represents the ALTS handshaker gRPC service - // address to connect to. - HandshakerServiceAddress string -} - -// DefaultClientOptions creates a new ClientOptions object with the default -// values. -func DefaultClientOptions() *ClientOptions { - return &ClientOptions{ - HandshakerServiceAddress: hypervisorHandshakerServiceAddress, - } -} - -// ServerOptions contains the server-side options of an ALTS channel. These -// options will be passed to the underlying ALTS handshaker. -type ServerOptions struct { - // HandshakerServiceAddress represents the ALTS handshaker gRPC service - // address to connect to. - HandshakerServiceAddress string -} - -// DefaultServerOptions creates a new ServerOptions object with the default -// values. -func DefaultServerOptions() *ServerOptions { - return &ServerOptions{ - HandshakerServiceAddress: hypervisorHandshakerServiceAddress, - } -} - -// altsTC is the credentials required for authenticating a connection using ALTS. -// It implements credentials.TransportCredentials interface. -type altsTC struct { - info *credentials.ProtocolInfo - side core.Side - accounts []string - hsAddress string -} - -// NewClientCreds constructs a client-side ALTS TransportCredentials object. -func NewClientCreds(opts *ClientOptions) credentials.TransportCredentials { - return newALTS(core.ClientSide, opts.TargetServiceAccounts, opts.HandshakerServiceAddress) -} - -// NewServerCreds constructs a server-side ALTS TransportCredentials object. -func NewServerCreds(opts *ServerOptions) credentials.TransportCredentials { - return newALTS(core.ServerSide, nil, opts.HandshakerServiceAddress) -} - -func newALTS(side core.Side, accounts []string, hsAddress string) credentials.TransportCredentials { - once.Do(func() { - vmOnGCP = isRunningOnGCP() - }) - - if hsAddress == "" { - hsAddress = hypervisorHandshakerServiceAddress - } - return &altsTC{ - info: &credentials.ProtocolInfo{ - SecurityProtocol: "alts", - SecurityVersion: "1.0", - }, - side: side, - accounts: accounts, - hsAddress: hsAddress, - } -} - -// ClientHandshake implements the client side handshake protocol. -func (g *altsTC) ClientHandshake(ctx context.Context, addr string, rawConn net.Conn) (_ net.Conn, _ credentials.AuthInfo, err error) { - if !vmOnGCP { - return nil, nil, ErrUntrustedPlatform - } - - // Connecting to ALTS handshaker service. - hsConn, err := service.Dial(g.hsAddress) - if err != nil { - return nil, nil, err - } - // Do not close hsConn since it is shared with other handshakes. - - // Possible context leak: - // The cancel function for the child context we create will only be - // called a non-nil error is returned. - var cancel context.CancelFunc - ctx, cancel = context.WithCancel(ctx) - defer func() { - if err != nil { - cancel() - } - }() - - opts := handshaker.DefaultClientHandshakerOptions() - opts.TargetName = addr - opts.TargetServiceAccounts = g.accounts - opts.RPCVersions = &altspb.RpcProtocolVersions{ - MaxRpcVersion: maxRPCVersion, - MinRpcVersion: minRPCVersion, - } - chs, err := handshaker.NewClientHandshaker(ctx, hsConn, rawConn, opts) - if err != nil { - return nil, nil, err - } - defer func() { - if err != nil { - chs.Close() - } - }() - secConn, authInfo, err := chs.ClientHandshake(ctx) - if err != nil { - return nil, nil, err - } - altsAuthInfo, ok := authInfo.(AuthInfo) - if !ok { - return nil, nil, errors.New("client-side auth info is not of type alts.AuthInfo") - } - match, _ := checkRPCVersions(opts.RPCVersions, altsAuthInfo.PeerRPCVersions()) - if !match { - return nil, nil, fmt.Errorf("server-side RPC versions are not compatible with this client, local versions: %v, peer versions: %v", opts.RPCVersions, altsAuthInfo.PeerRPCVersions()) - } - return secConn, authInfo, nil -} - -// ServerHandshake implements the server side ALTS handshaker. -func (g *altsTC) ServerHandshake(rawConn net.Conn) (_ net.Conn, _ credentials.AuthInfo, err error) { - if !vmOnGCP { - return nil, nil, ErrUntrustedPlatform - } - // Connecting to ALTS handshaker service. - hsConn, err := service.Dial(g.hsAddress) - if err != nil { - return nil, nil, err - } - // Do not close hsConn since it's shared with other handshakes. - - ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) - defer cancel() - opts := handshaker.DefaultServerHandshakerOptions() - opts.RPCVersions = &altspb.RpcProtocolVersions{ - MaxRpcVersion: maxRPCVersion, - MinRpcVersion: minRPCVersion, - } - shs, err := handshaker.NewServerHandshaker(ctx, hsConn, rawConn, opts) - if err != nil { - return nil, nil, err - } - defer func() { - if err != nil { - shs.Close() - } - }() - secConn, authInfo, err := shs.ServerHandshake(ctx) - if err != nil { - return nil, nil, err - } - altsAuthInfo, ok := authInfo.(AuthInfo) - if !ok { - return nil, nil, errors.New("server-side auth info is not of type alts.AuthInfo") - } - match, _ := checkRPCVersions(opts.RPCVersions, altsAuthInfo.PeerRPCVersions()) - if !match { - return nil, nil, fmt.Errorf("client-side RPC versions is not compatible with this server, local versions: %v, peer versions: %v", opts.RPCVersions, altsAuthInfo.PeerRPCVersions()) - } - return secConn, authInfo, nil -} - -func (g *altsTC) Info() credentials.ProtocolInfo { - return *g.info -} - -func (g *altsTC) Clone() credentials.TransportCredentials { - info := *g.info - var accounts []string - if g.accounts != nil { - accounts = make([]string, len(g.accounts)) - copy(accounts, g.accounts) - } - return &altsTC{ - info: &info, - side: g.side, - hsAddress: g.hsAddress, - accounts: accounts, - } -} - -func (g *altsTC) OverrideServerName(serverNameOverride string) error { - g.info.ServerName = serverNameOverride - return nil -} - -// compareRPCVersion returns 0 if v1 == v2, 1 if v1 > v2 and -1 if v1 < v2. -func compareRPCVersions(v1, v2 *altspb.RpcProtocolVersions_Version) int { - switch { - case v1.GetMajor() > v2.GetMajor(), - v1.GetMajor() == v2.GetMajor() && v1.GetMinor() > v2.GetMinor(): - return 1 - case v1.GetMajor() < v2.GetMajor(), - v1.GetMajor() == v2.GetMajor() && v1.GetMinor() < v2.GetMinor(): - return -1 - } - return 0 -} - -// checkRPCVersions performs a version check between local and peer rpc protocol -// versions. This function returns true if the check passes which means both -// parties agreed on a common rpc protocol to use, and false otherwise. The -// function also returns the highest common RPC protocol version both parties -// agreed on. -func checkRPCVersions(local, peer *altspb.RpcProtocolVersions) (bool, *altspb.RpcProtocolVersions_Version) { - if local == nil || peer == nil { - grpclog.Error("invalid checkRPCVersions argument, either local or peer is nil.") - return false, nil - } - - // maxCommonVersion is MIN(local.max, peer.max). - maxCommonVersion := local.GetMaxRpcVersion() - if compareRPCVersions(local.GetMaxRpcVersion(), peer.GetMaxRpcVersion()) > 0 { - maxCommonVersion = peer.GetMaxRpcVersion() - } - - // minCommonVersion is MAX(local.min, peer.min). - minCommonVersion := peer.GetMinRpcVersion() - if compareRPCVersions(local.GetMinRpcVersion(), peer.GetMinRpcVersion()) > 0 { - minCommonVersion = local.GetMinRpcVersion() - } - - if compareRPCVersions(maxCommonVersion, minCommonVersion) < 0 { - return false, nil - } - return true, maxCommonVersion -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/authinfo/authinfo.go b/vendor/google.golang.org/grpc/credentials/alts/internal/authinfo/authinfo.go deleted file mode 100644 index 9c53d6b53..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/authinfo/authinfo.go +++ /dev/null @@ -1,89 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package authinfo provide authentication information returned by handshakers. -package authinfo - -import ( - "google.golang.org/grpc/credentials" - altspb "google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp" -) - -var _ credentials.AuthInfo = (*altsAuthInfo)(nil) - -// altsAuthInfo exposes security information from the ALTS handshake to the -// application. altsAuthInfo is immutable and implements credentials.AuthInfo. -type altsAuthInfo struct { - p *altspb.AltsContext - credentials.CommonAuthInfo -} - -// New returns a new altsAuthInfo object given handshaker results. -func New(result *altspb.HandshakerResult) credentials.AuthInfo { - return newAuthInfo(result) -} - -func newAuthInfo(result *altspb.HandshakerResult) *altsAuthInfo { - return &altsAuthInfo{ - p: &altspb.AltsContext{ - ApplicationProtocol: result.GetApplicationProtocol(), - RecordProtocol: result.GetRecordProtocol(), - // TODO: assign security level from result. - SecurityLevel: altspb.SecurityLevel_INTEGRITY_AND_PRIVACY, - PeerServiceAccount: result.GetPeerIdentity().GetServiceAccount(), - LocalServiceAccount: result.GetLocalIdentity().GetServiceAccount(), - PeerRpcVersions: result.GetPeerRpcVersions(), - }, - CommonAuthInfo: credentials.CommonAuthInfo{SecurityLevel: credentials.PrivacyAndIntegrity}, - } -} - -// AuthType identifies the context as providing ALTS authentication information. -func (s *altsAuthInfo) AuthType() string { - return "alts" -} - -// ApplicationProtocol returns the context's application protocol. -func (s *altsAuthInfo) ApplicationProtocol() string { - return s.p.GetApplicationProtocol() -} - -// RecordProtocol returns the context's record protocol. -func (s *altsAuthInfo) RecordProtocol() string { - return s.p.GetRecordProtocol() -} - -// SecurityLevel returns the context's security level. -func (s *altsAuthInfo) SecurityLevel() altspb.SecurityLevel { - return s.p.GetSecurityLevel() -} - -// PeerServiceAccount returns the context's peer service account. -func (s *altsAuthInfo) PeerServiceAccount() string { - return s.p.GetPeerServiceAccount() -} - -// LocalServiceAccount returns the context's local service account. -func (s *altsAuthInfo) LocalServiceAccount() string { - return s.p.GetLocalServiceAccount() -} - -// PeerRPCVersions returns the context's peer RPC versions. -func (s *altsAuthInfo) PeerRPCVersions() *altspb.RpcProtocolVersions { - return s.p.GetPeerRpcVersions() -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/common.go b/vendor/google.golang.org/grpc/credentials/alts/internal/common.go deleted file mode 100644 index 33fba8123..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/common.go +++ /dev/null @@ -1,69 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -//go:generate ./regenerate.sh - -// Package internal contains common core functionality for ALTS. -package internal - -import ( - "context" - "net" - - "google.golang.org/grpc/credentials" -) - -const ( - // ClientSide identifies the client in this communication. - ClientSide Side = iota - // ServerSide identifies the server in this communication. - ServerSide -) - -// PeerNotRespondingError is returned when a peer server is not responding -// after a channel has been established. It is treated as a temporary connection -// error and re-connection to the server should be attempted. -var PeerNotRespondingError = &peerNotRespondingError{} - -// Side identifies the party's role: client or server. -type Side int - -type peerNotRespondingError struct{} - -// Return an error message for the purpose of logging. -func (e *peerNotRespondingError) Error() string { - return "peer server is not responding and re-connection should be attempted." -} - -// Temporary indicates if this connection error is temporary or fatal. -func (e *peerNotRespondingError) Temporary() bool { - return true -} - -// Handshaker defines a ALTS handshaker interface. -type Handshaker interface { - // ClientHandshake starts and completes a client-side handshaking and - // returns a secure connection and corresponding auth information. - ClientHandshake(ctx context.Context) (net.Conn, credentials.AuthInfo, error) - // ServerHandshake starts and completes a server-side handshaking and - // returns a secure connection and corresponding auth information. - ServerHandshake(ctx context.Context) (net.Conn, credentials.AuthInfo, error) - // Close terminates the Handshaker. It should be called when the caller - // obtains the secure connection. - Close() -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go deleted file mode 100644 index 43726e877..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aeadrekey.go +++ /dev/null @@ -1,131 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package conn - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "crypto/hmac" - "crypto/sha256" - "encoding/binary" - "fmt" - "strconv" -) - -// rekeyAEAD holds the necessary information for an AEAD based on -// AES-GCM that performs nonce-based key derivation and XORs the -// nonce with a random mask. -type rekeyAEAD struct { - kdfKey []byte - kdfCounter []byte - nonceMask []byte - nonceBuf []byte - gcmAEAD cipher.AEAD -} - -// KeySizeError signals that the given key does not have the correct size. -type KeySizeError int - -func (k KeySizeError) Error() string { - return "alts/conn: invalid key size " + strconv.Itoa(int(k)) -} - -// newRekeyAEAD creates a new instance of aes128gcm with rekeying. -// The key argument should be 44 bytes, the first 32 bytes are used as a key -// for HKDF-expand and the remainining 12 bytes are used as a random mask for -// the counter. -func newRekeyAEAD(key []byte) (*rekeyAEAD, error) { - k := len(key) - if k != kdfKeyLen+nonceLen { - return nil, KeySizeError(k) - } - return &rekeyAEAD{ - kdfKey: key[:kdfKeyLen], - kdfCounter: make([]byte, kdfCounterLen), - nonceMask: key[kdfKeyLen:], - nonceBuf: make([]byte, nonceLen), - gcmAEAD: nil, - }, nil -} - -// Seal rekeys if nonce[2:8] is different than in the last call, masks the nonce, -// and calls Seal for aes128gcm. -func (s *rekeyAEAD) Seal(dst, nonce, plaintext, additionalData []byte) []byte { - if err := s.rekeyIfRequired(nonce); err != nil { - panic(fmt.Sprintf("Rekeying failed with: %s", err.Error())) - } - maskNonce(s.nonceBuf, nonce, s.nonceMask) - return s.gcmAEAD.Seal(dst, s.nonceBuf, plaintext, additionalData) -} - -// Open rekeys if nonce[2:8] is different than in the last call, masks the nonce, -// and calls Open for aes128gcm. -func (s *rekeyAEAD) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { - if err := s.rekeyIfRequired(nonce); err != nil { - return nil, err - } - maskNonce(s.nonceBuf, nonce, s.nonceMask) - return s.gcmAEAD.Open(dst, s.nonceBuf, ciphertext, additionalData) -} - -// rekeyIfRequired creates a new aes128gcm AEAD if the existing AEAD is nil -// or cannot be used with given nonce. -func (s *rekeyAEAD) rekeyIfRequired(nonce []byte) error { - newKdfCounter := nonce[kdfCounterOffset : kdfCounterOffset+kdfCounterLen] - if s.gcmAEAD != nil && bytes.Equal(newKdfCounter, s.kdfCounter) { - return nil - } - copy(s.kdfCounter, newKdfCounter) - a, err := aes.NewCipher(hkdfExpand(s.kdfKey, s.kdfCounter)) - if err != nil { - return err - } - s.gcmAEAD, err = cipher.NewGCM(a) - return err -} - -// maskNonce XORs the given nonce with the mask and stores the result in dst. -func maskNonce(dst, nonce, mask []byte) { - nonce1 := binary.LittleEndian.Uint64(nonce[:sizeUint64]) - nonce2 := binary.LittleEndian.Uint32(nonce[sizeUint64:]) - mask1 := binary.LittleEndian.Uint64(mask[:sizeUint64]) - mask2 := binary.LittleEndian.Uint32(mask[sizeUint64:]) - binary.LittleEndian.PutUint64(dst[:sizeUint64], nonce1^mask1) - binary.LittleEndian.PutUint32(dst[sizeUint64:], nonce2^mask2) -} - -// NonceSize returns the required nonce size. -func (s *rekeyAEAD) NonceSize() int { - return s.gcmAEAD.NonceSize() -} - -// Overhead returns the ciphertext overhead. -func (s *rekeyAEAD) Overhead() int { - return s.gcmAEAD.Overhead() -} - -// hkdfExpand computes the first 16 bytes of the HKDF-expand function -// defined in RFC5869. -func hkdfExpand(key, info []byte) []byte { - mac := hmac.New(sha256.New, key) - mac.Write(info) - mac.Write([]byte{0x01}[:]) - return mac.Sum(nil)[:aeadKeyLen] -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcm.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcm.go deleted file mode 100644 index 04e0adb6c..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcm.go +++ /dev/null @@ -1,105 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package conn - -import ( - "crypto/aes" - "crypto/cipher" - - core "google.golang.org/grpc/credentials/alts/internal" -) - -const ( - // Overflow length n in bytes, never encrypt more than 2^(n*8) frames (in - // each direction). - overflowLenAES128GCM = 5 -) - -// aes128gcm is the struct that holds necessary information for ALTS record. -// The counter value is NOT included in the payload during the encryption and -// decryption operations. -type aes128gcm struct { - // inCounter is used in ALTS record to check that incoming counters are - // as expected, since ALTS record guarantees that messages are unwrapped - // in the same order that the peer wrapped them. - inCounter Counter - outCounter Counter - aead cipher.AEAD -} - -// NewAES128GCM creates an instance that uses aes128gcm for ALTS record. -func NewAES128GCM(side core.Side, key []byte) (ALTSRecordCrypto, error) { - c, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - a, err := cipher.NewGCM(c) - if err != nil { - return nil, err - } - return &aes128gcm{ - inCounter: NewInCounter(side, overflowLenAES128GCM), - outCounter: NewOutCounter(side, overflowLenAES128GCM), - aead: a, - }, nil -} - -// Encrypt is the encryption function. dst can contain bytes at the beginning of -// the ciphertext that will not be encrypted but will be authenticated. If dst -// has enough capacity to hold these bytes, the ciphertext and the tag, no -// allocation and copy operations will be performed. dst and plaintext do not -// overlap. -func (s *aes128gcm) Encrypt(dst, plaintext []byte) ([]byte, error) { - // If we need to allocate an output buffer, we want to include space for - // GCM tag to avoid forcing ALTS record to reallocate as well. - dlen := len(dst) - dst, out := SliceForAppend(dst, len(plaintext)+GcmTagSize) - seq, err := s.outCounter.Value() - if err != nil { - return nil, err - } - data := out[:len(plaintext)] - copy(data, plaintext) // data may alias plaintext - - // Seal appends the ciphertext and the tag to its first argument and - // returns the updated slice. However, SliceForAppend above ensures that - // dst has enough capacity to avoid a reallocation and copy due to the - // append. - dst = s.aead.Seal(dst[:dlen], seq, data, nil) - s.outCounter.Inc() - return dst, nil -} - -func (s *aes128gcm) EncryptionOverhead() int { - return GcmTagSize -} - -func (s *aes128gcm) Decrypt(dst, ciphertext []byte) ([]byte, error) { - seq, err := s.inCounter.Value() - if err != nil { - return nil, err - } - // If dst is equal to ciphertext[:0], ciphertext storage is reused. - plaintext, err := s.aead.Open(dst, seq, ciphertext, nil) - if err != nil { - return nil, ErrAuth - } - s.inCounter.Inc() - return plaintext, nil -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go deleted file mode 100644 index 6a9035ea2..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/aes128gcmrekey.go +++ /dev/null @@ -1,116 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package conn - -import ( - "crypto/cipher" - - core "google.golang.org/grpc/credentials/alts/internal" -) - -const ( - // Overflow length n in bytes, never encrypt more than 2^(n*8) frames (in - // each direction). - overflowLenAES128GCMRekey = 8 - nonceLen = 12 - aeadKeyLen = 16 - kdfKeyLen = 32 - kdfCounterOffset = 2 - kdfCounterLen = 6 - sizeUint64 = 8 -) - -// aes128gcmRekey is the struct that holds necessary information for ALTS record. -// The counter value is NOT included in the payload during the encryption and -// decryption operations. -type aes128gcmRekey struct { - // inCounter is used in ALTS record to check that incoming counters are - // as expected, since ALTS record guarantees that messages are unwrapped - // in the same order that the peer wrapped them. - inCounter Counter - outCounter Counter - inAEAD cipher.AEAD - outAEAD cipher.AEAD -} - -// NewAES128GCMRekey creates an instance that uses aes128gcm with rekeying -// for ALTS record. The key argument should be 44 bytes, the first 32 bytes -// are used as a key for HKDF-expand and the remainining 12 bytes are used -// as a random mask for the counter. -func NewAES128GCMRekey(side core.Side, key []byte) (ALTSRecordCrypto, error) { - inCounter := NewInCounter(side, overflowLenAES128GCMRekey) - outCounter := NewOutCounter(side, overflowLenAES128GCMRekey) - inAEAD, err := newRekeyAEAD(key) - if err != nil { - return nil, err - } - outAEAD, err := newRekeyAEAD(key) - if err != nil { - return nil, err - } - return &aes128gcmRekey{ - inCounter, - outCounter, - inAEAD, - outAEAD, - }, nil -} - -// Encrypt is the encryption function. dst can contain bytes at the beginning of -// the ciphertext that will not be encrypted but will be authenticated. If dst -// has enough capacity to hold these bytes, the ciphertext and the tag, no -// allocation and copy operations will be performed. dst and plaintext do not -// overlap. -func (s *aes128gcmRekey) Encrypt(dst, plaintext []byte) ([]byte, error) { - // If we need to allocate an output buffer, we want to include space for - // GCM tag to avoid forcing ALTS record to reallocate as well. - dlen := len(dst) - dst, out := SliceForAppend(dst, len(plaintext)+GcmTagSize) - seq, err := s.outCounter.Value() - if err != nil { - return nil, err - } - data := out[:len(plaintext)] - copy(data, plaintext) // data may alias plaintext - - // Seal appends the ciphertext and the tag to its first argument and - // returns the updated slice. However, SliceForAppend above ensures that - // dst has enough capacity to avoid a reallocation and copy due to the - // append. - dst = s.outAEAD.Seal(dst[:dlen], seq, data, nil) - s.outCounter.Inc() - return dst, nil -} - -func (s *aes128gcmRekey) EncryptionOverhead() int { - return GcmTagSize -} - -func (s *aes128gcmRekey) Decrypt(dst, ciphertext []byte) ([]byte, error) { - seq, err := s.inCounter.Value() - if err != nil { - return nil, err - } - plaintext, err := s.inAEAD.Open(dst, seq, ciphertext, nil) - if err != nil { - return nil, ErrAuth - } - s.inCounter.Inc() - return plaintext, nil -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go deleted file mode 100644 index 1795d0c9e..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/common.go +++ /dev/null @@ -1,70 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package conn - -import ( - "encoding/binary" - "errors" - "fmt" -) - -const ( - // GcmTagSize is the GCM tag size is the difference in length between - // plaintext and ciphertext. From crypto/cipher/gcm.go in Go crypto - // library. - GcmTagSize = 16 -) - -// ErrAuth occurs on authentication failure. -var ErrAuth = errors.New("message authentication failed") - -// SliceForAppend takes a slice and a requested number of bytes. It returns a -// slice with the contents of the given slice followed by that many bytes and a -// second slice that aliases into it and contains only the extra bytes. If the -// original slice has sufficient capacity then no allocation is performed. -func SliceForAppend(in []byte, n int) (head, tail []byte) { - if total := len(in) + n; cap(in) >= total { - head = in[:total] - } else { - head = make([]byte, total) - copy(head, in) - } - tail = head[len(in):] - return head, tail -} - -// ParseFramedMsg parse the provided buffer and returns a frame of the format -// msgLength+msg and any remaining bytes in that buffer. -func ParseFramedMsg(b []byte, maxLen uint32) ([]byte, []byte, error) { - // If the size field is not complete, return the provided buffer as - // remaining buffer. - if len(b) < MsgLenFieldSize { - return nil, b, nil - } - msgLenField := b[:MsgLenFieldSize] - length := binary.LittleEndian.Uint32(msgLenField) - if length > maxLen { - return nil, nil, fmt.Errorf("received the frame length %d larger than the limit %d", length, maxLen) - } - if len(b) < int(length)+4 { // account for the first 4 msg length bytes. - // Frame is not complete yet. - return nil, b, nil - } - return b[:MsgLenFieldSize+length], b[MsgLenFieldSize+length:], nil -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/counter.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/counter.go deleted file mode 100644 index 9f00aca0b..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/counter.go +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package conn - -import ( - "errors" -) - -const counterLen = 12 - -var ( - errInvalidCounter = errors.New("invalid counter") -) - -// Counter is a 96-bit, little-endian counter. -type Counter struct { - value [counterLen]byte - invalid bool - overflowLen int -} - -// Value returns the current value of the counter as a byte slice. -func (c *Counter) Value() ([]byte, error) { - if c.invalid { - return nil, errInvalidCounter - } - return c.value[:], nil -} - -// Inc increments the counter and checks for overflow. -func (c *Counter) Inc() { - // If the counter is already invalid, there is no need to increase it. - if c.invalid { - return - } - i := 0 - for ; i < c.overflowLen; i++ { - c.value[i]++ - if c.value[i] != 0 { - break - } - } - if i == c.overflowLen { - c.invalid = true - } -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go deleted file mode 100644 index fd5a53d9a..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/record.go +++ /dev/null @@ -1,271 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package conn contains an implementation of a secure channel created by gRPC -// handshakers. -package conn - -import ( - "encoding/binary" - "fmt" - "math" - "net" - - core "google.golang.org/grpc/credentials/alts/internal" -) - -// ALTSRecordCrypto is the interface for gRPC ALTS record protocol. -type ALTSRecordCrypto interface { - // Encrypt encrypts the plaintext and computes the tag (if any) of dst - // and plaintext, dst and plaintext do not overlap. - Encrypt(dst, plaintext []byte) ([]byte, error) - // EncryptionOverhead returns the tag size (if any) in bytes. - EncryptionOverhead() int - // Decrypt decrypts ciphertext and verify the tag (if any). dst and - // ciphertext may alias exactly or not at all. To reuse ciphertext's - // storage for the decrypted output, use ciphertext[:0] as dst. - Decrypt(dst, ciphertext []byte) ([]byte, error) -} - -// ALTSRecordFunc is a function type for factory functions that create -// ALTSRecordCrypto instances. -type ALTSRecordFunc func(s core.Side, keyData []byte) (ALTSRecordCrypto, error) - -const ( - // MsgLenFieldSize is the byte size of the frame length field of a - // framed message. - MsgLenFieldSize = 4 - // The byte size of the message type field of a framed message. - msgTypeFieldSize = 4 - // The bytes size limit for a ALTS record message. - altsRecordLengthLimit = 1024 * 1024 // 1 MiB - // The default bytes size of a ALTS record message. - altsRecordDefaultLength = 4 * 1024 // 4KiB - // Message type value included in ALTS record framing. - altsRecordMsgType = uint32(0x06) - // The initial write buffer size. - altsWriteBufferInitialSize = 32 * 1024 // 32KiB - // The maximum write buffer size. This *must* be multiple of - // altsRecordDefaultLength. - altsWriteBufferMaxSize = 512 * 1024 // 512KiB -) - -var ( - protocols = make(map[string]ALTSRecordFunc) -) - -// RegisterProtocol register a ALTS record encryption protocol. -func RegisterProtocol(protocol string, f ALTSRecordFunc) error { - if _, ok := protocols[protocol]; ok { - return fmt.Errorf("protocol %v is already registered", protocol) - } - protocols[protocol] = f - return nil -} - -// conn represents a secured connection. It implements the net.Conn interface. -type conn struct { - net.Conn - crypto ALTSRecordCrypto - // buf holds data that has been read from the connection and decrypted, - // but has not yet been returned by Read. - buf []byte - payloadLengthLimit int - // protected holds data read from the network but have not yet been - // decrypted. This data might not compose a complete frame. - protected []byte - // writeBuf is a buffer used to contain encrypted frames before being - // written to the network. - writeBuf []byte - // nextFrame stores the next frame (in protected buffer) info. - nextFrame []byte - // overhead is the calculated overhead of each frame. - overhead int -} - -// NewConn creates a new secure channel instance given the other party role and -// handshaking result. -func NewConn(c net.Conn, side core.Side, recordProtocol string, key []byte, protected []byte) (net.Conn, error) { - newCrypto := protocols[recordProtocol] - if newCrypto == nil { - return nil, fmt.Errorf("negotiated unknown next_protocol %q", recordProtocol) - } - crypto, err := newCrypto(side, key) - if err != nil { - return nil, fmt.Errorf("protocol %q: %v", recordProtocol, err) - } - overhead := MsgLenFieldSize + msgTypeFieldSize + crypto.EncryptionOverhead() - payloadLengthLimit := altsRecordDefaultLength - overhead - if protected == nil { - // We pre-allocate protected to be of size - // 2*altsRecordDefaultLength-1 during initialization. We only - // read from the network into protected when protected does not - // contain a complete frame, which is at most - // altsRecordDefaultLength-1 (bytes). And we read at most - // altsRecordDefaultLength (bytes) data into protected at one - // time. Therefore, 2*altsRecordDefaultLength-1 is large enough - // to buffer data read from the network. - protected = make([]byte, 0, 2*altsRecordDefaultLength-1) - } - - altsConn := &conn{ - Conn: c, - crypto: crypto, - payloadLengthLimit: payloadLengthLimit, - protected: protected, - writeBuf: make([]byte, altsWriteBufferInitialSize), - nextFrame: protected, - overhead: overhead, - } - return altsConn, nil -} - -// Read reads and decrypts a frame from the underlying connection, and copies the -// decrypted payload into b. If the size of the payload is greater than len(b), -// Read retains the remaining bytes in an internal buffer, and subsequent calls -// to Read will read from this buffer until it is exhausted. -func (p *conn) Read(b []byte) (n int, err error) { - if len(p.buf) == 0 { - var framedMsg []byte - framedMsg, p.nextFrame, err = ParseFramedMsg(p.nextFrame, altsRecordLengthLimit) - if err != nil { - return n, err - } - // Check whether the next frame to be decrypted has been - // completely received yet. - if len(framedMsg) == 0 { - copy(p.protected, p.nextFrame) - p.protected = p.protected[:len(p.nextFrame)] - // Always copy next incomplete frame to the beginning of - // the protected buffer and reset nextFrame to it. - p.nextFrame = p.protected - } - // Check whether a complete frame has been received yet. - for len(framedMsg) == 0 { - if len(p.protected) == cap(p.protected) { - tmp := make([]byte, len(p.protected), cap(p.protected)+altsRecordDefaultLength) - copy(tmp, p.protected) - p.protected = tmp - } - n, err = p.Conn.Read(p.protected[len(p.protected):min(cap(p.protected), len(p.protected)+altsRecordDefaultLength)]) - if err != nil { - return 0, err - } - p.protected = p.protected[:len(p.protected)+n] - framedMsg, p.nextFrame, err = ParseFramedMsg(p.protected, altsRecordLengthLimit) - if err != nil { - return 0, err - } - } - // Now we have a complete frame, decrypted it. - msg := framedMsg[MsgLenFieldSize:] - msgType := binary.LittleEndian.Uint32(msg[:msgTypeFieldSize]) - if msgType&0xff != altsRecordMsgType { - return 0, fmt.Errorf("received frame with incorrect message type %v, expected lower byte %v", - msgType, altsRecordMsgType) - } - ciphertext := msg[msgTypeFieldSize:] - - // Decrypt requires that if the dst and ciphertext alias, they - // must alias exactly. Code here used to use msg[:0], but msg - // starts MsgLenFieldSize+msgTypeFieldSize bytes earlier than - // ciphertext, so they alias inexactly. Using ciphertext[:0] - // arranges the appropriate aliasing without needing to copy - // ciphertext or use a separate destination buffer. For more info - // check: https://golang.org/pkg/crypto/cipher/#AEAD. - p.buf, err = p.crypto.Decrypt(ciphertext[:0], ciphertext) - if err != nil { - return 0, err - } - } - - n = copy(b, p.buf) - p.buf = p.buf[n:] - return n, nil -} - -// Write encrypts, frames, and writes bytes from b to the underlying connection. -func (p *conn) Write(b []byte) (n int, err error) { - n = len(b) - // Calculate the output buffer size with framing and encryption overhead. - numOfFrames := int(math.Ceil(float64(len(b)) / float64(p.payloadLengthLimit))) - size := len(b) + numOfFrames*p.overhead - // If writeBuf is too small, increase its size up to the maximum size. - partialBSize := len(b) - if size > altsWriteBufferMaxSize { - size = altsWriteBufferMaxSize - const numOfFramesInMaxWriteBuf = altsWriteBufferMaxSize / altsRecordDefaultLength - partialBSize = numOfFramesInMaxWriteBuf * p.payloadLengthLimit - } - if len(p.writeBuf) < size { - p.writeBuf = make([]byte, size) - } - - for partialBStart := 0; partialBStart < len(b); partialBStart += partialBSize { - partialBEnd := partialBStart + partialBSize - if partialBEnd > len(b) { - partialBEnd = len(b) - } - partialB := b[partialBStart:partialBEnd] - writeBufIndex := 0 - for len(partialB) > 0 { - payloadLen := len(partialB) - if payloadLen > p.payloadLengthLimit { - payloadLen = p.payloadLengthLimit - } - buf := partialB[:payloadLen] - partialB = partialB[payloadLen:] - - // Write buffer contains: length, type, payload, and tag - // if any. - - // 1. Fill in type field. - msg := p.writeBuf[writeBufIndex+MsgLenFieldSize:] - binary.LittleEndian.PutUint32(msg, altsRecordMsgType) - - // 2. Encrypt the payload and create a tag if any. - msg, err = p.crypto.Encrypt(msg[:msgTypeFieldSize], buf) - if err != nil { - return n, err - } - - // 3. Fill in the size field. - binary.LittleEndian.PutUint32(p.writeBuf[writeBufIndex:], uint32(len(msg))) - - // 4. Increase writeBufIndex. - writeBufIndex += len(buf) + p.overhead - } - nn, err := p.Conn.Write(p.writeBuf[:writeBufIndex]) - if err != nil { - // We need to calculate the actual data size that was - // written. This means we need to remove header, - // encryption overheads, and any partially-written - // frame data. - numOfWrittenFrames := int(math.Floor(float64(nn) / float64(altsRecordDefaultLength))) - return partialBStart + numOfWrittenFrames*p.payloadLengthLimit, err - } - } - return n, nil -} - -func min(a, b int) int { - if a < b { - return a - } - return b -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/utils.go b/vendor/google.golang.org/grpc/credentials/alts/internal/conn/utils.go deleted file mode 100644 index 84821fa25..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/conn/utils.go +++ /dev/null @@ -1,63 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package conn - -import core "google.golang.org/grpc/credentials/alts/internal" - -// NewOutCounter returns an outgoing counter initialized to the starting sequence -// number for the client/server side of a connection. -func NewOutCounter(s core.Side, overflowLen int) (c Counter) { - c.overflowLen = overflowLen - if s == core.ServerSide { - // Server counters in ALTS record have the little-endian high bit - // set. - c.value[counterLen-1] = 0x80 - } - return -} - -// NewInCounter returns an incoming counter initialized to the starting sequence -// number for the client/server side of a connection. This is used in ALTS record -// to check that incoming counters are as expected, since ALTS record guarantees -// that messages are unwrapped in the same order that the peer wrapped them. -func NewInCounter(s core.Side, overflowLen int) (c Counter) { - c.overflowLen = overflowLen - if s == core.ClientSide { - // Server counters in ALTS record have the little-endian high bit - // set. - c.value[counterLen-1] = 0x80 - } - return -} - -// CounterFromValue creates a new counter given an initial value. -func CounterFromValue(value []byte, overflowLen int) (c Counter) { - c.overflowLen = overflowLen - copy(c.value[:], value) - return -} - -// CounterSide returns the connection side (client/server) a sequence counter is -// associated with. -func CounterSide(c []byte) core.Side { - if c[counterLen-1]&0x80 == 0x80 { - return core.ServerSide - } - return core.ClientSide -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go b/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go deleted file mode 100644 index 8bc7ceee0..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/handshaker.go +++ /dev/null @@ -1,375 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package handshaker provides ALTS handshaking functionality for GCP. -package handshaker - -import ( - "context" - "errors" - "fmt" - "io" - "net" - "sync" - - grpc "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - core "google.golang.org/grpc/credentials/alts/internal" - "google.golang.org/grpc/credentials/alts/internal/authinfo" - "google.golang.org/grpc/credentials/alts/internal/conn" - altsgrpc "google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp" - altspb "google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp" -) - -const ( - // The maximum byte size of receive frames. - frameLimit = 64 * 1024 // 64 KB - rekeyRecordProtocolName = "ALTSRP_GCM_AES128_REKEY" - // maxPendingHandshakes represents the maximum number of concurrent - // handshakes. - maxPendingHandshakes = 100 -) - -var ( - hsProtocol = altspb.HandshakeProtocol_ALTS - appProtocols = []string{"grpc"} - recordProtocols = []string{rekeyRecordProtocolName} - keyLength = map[string]int{ - rekeyRecordProtocolName: 44, - } - altsRecordFuncs = map[string]conn.ALTSRecordFunc{ - // ALTS handshaker protocols. - rekeyRecordProtocolName: func(s core.Side, keyData []byte) (conn.ALTSRecordCrypto, error) { - return conn.NewAES128GCMRekey(s, keyData) - }, - } - // control number of concurrent created (but not closed) handshakers. - mu sync.Mutex - concurrentHandshakes = int64(0) - // errDropped occurs when maxPendingHandshakes is reached. - errDropped = errors.New("maximum number of concurrent ALTS handshakes is reached") - // errOutOfBound occurs when the handshake service returns a consumed - // bytes value larger than the buffer that was passed to it originally. - errOutOfBound = errors.New("handshaker service consumed bytes value is out-of-bound") -) - -func init() { - for protocol, f := range altsRecordFuncs { - if err := conn.RegisterProtocol(protocol, f); err != nil { - panic(err) - } - } -} - -func acquire() bool { - mu.Lock() - // If we need n to be configurable, we can pass it as an argument. - n := int64(1) - success := maxPendingHandshakes-concurrentHandshakes >= n - if success { - concurrentHandshakes += n - } - mu.Unlock() - return success -} - -func release() { - mu.Lock() - // If we need n to be configurable, we can pass it as an argument. - n := int64(1) - concurrentHandshakes -= n - if concurrentHandshakes < 0 { - mu.Unlock() - panic("bad release") - } - mu.Unlock() -} - -// ClientHandshakerOptions contains the client handshaker options that can -// provided by the caller. -type ClientHandshakerOptions struct { - // ClientIdentity is the handshaker client local identity. - ClientIdentity *altspb.Identity - // TargetName is the server service account name for secure name - // checking. - TargetName string - // TargetServiceAccounts contains a list of expected target service - // accounts. One of these accounts should match one of the accounts in - // the handshaker results. Otherwise, the handshake fails. - TargetServiceAccounts []string - // RPCVersions specifies the gRPC versions accepted by the client. - RPCVersions *altspb.RpcProtocolVersions -} - -// ServerHandshakerOptions contains the server handshaker options that can -// provided by the caller. -type ServerHandshakerOptions struct { - // RPCVersions specifies the gRPC versions accepted by the server. - RPCVersions *altspb.RpcProtocolVersions -} - -// DefaultClientHandshakerOptions returns the default client handshaker options. -func DefaultClientHandshakerOptions() *ClientHandshakerOptions { - return &ClientHandshakerOptions{} -} - -// DefaultServerHandshakerOptions returns the default client handshaker options. -func DefaultServerHandshakerOptions() *ServerHandshakerOptions { - return &ServerHandshakerOptions{} -} - -// TODO: add support for future local and remote endpoint in both client options -// and server options (server options struct does not exist now. When -// caller can provide endpoints, it should be created. - -// altsHandshaker is used to complete a ALTS handshaking between client and -// server. This handshaker talks to the ALTS handshaker service in the metadata -// server. -type altsHandshaker struct { - // RPC stream used to access the ALTS Handshaker service. - stream altsgrpc.HandshakerService_DoHandshakeClient - // the connection to the peer. - conn net.Conn - // client handshake options. - clientOpts *ClientHandshakerOptions - // server handshake options. - serverOpts *ServerHandshakerOptions - // defines the side doing the handshake, client or server. - side core.Side -} - -// NewClientHandshaker creates a ALTS handshaker for GCP which contains an RPC -// stub created using the passed conn and used to talk to the ALTS Handshaker -// service in the metadata server. -func NewClientHandshaker(ctx context.Context, conn *grpc.ClientConn, c net.Conn, opts *ClientHandshakerOptions) (core.Handshaker, error) { - stream, err := altsgrpc.NewHandshakerServiceClient(conn).DoHandshake(ctx, grpc.WaitForReady(true)) - if err != nil { - return nil, err - } - return &altsHandshaker{ - stream: stream, - conn: c, - clientOpts: opts, - side: core.ClientSide, - }, nil -} - -// NewServerHandshaker creates a ALTS handshaker for GCP which contains an RPC -// stub created using the passed conn and used to talk to the ALTS Handshaker -// service in the metadata server. -func NewServerHandshaker(ctx context.Context, conn *grpc.ClientConn, c net.Conn, opts *ServerHandshakerOptions) (core.Handshaker, error) { - stream, err := altsgrpc.NewHandshakerServiceClient(conn).DoHandshake(ctx, grpc.WaitForReady(true)) - if err != nil { - return nil, err - } - return &altsHandshaker{ - stream: stream, - conn: c, - serverOpts: opts, - side: core.ServerSide, - }, nil -} - -// ClientHandshake starts and completes a client ALTS handshaking for GCP. Once -// done, ClientHandshake returns a secure connection. -func (h *altsHandshaker) ClientHandshake(ctx context.Context) (net.Conn, credentials.AuthInfo, error) { - if !acquire() { - return nil, nil, errDropped - } - defer release() - - if h.side != core.ClientSide { - return nil, nil, errors.New("only handshakers created using NewClientHandshaker can perform a client handshaker") - } - - // Create target identities from service account list. - targetIdentities := make([]*altspb.Identity, 0, len(h.clientOpts.TargetServiceAccounts)) - for _, account := range h.clientOpts.TargetServiceAccounts { - targetIdentities = append(targetIdentities, &altspb.Identity{ - IdentityOneof: &altspb.Identity_ServiceAccount{ - ServiceAccount: account, - }, - }) - } - req := &altspb.HandshakerReq{ - ReqOneof: &altspb.HandshakerReq_ClientStart{ - ClientStart: &altspb.StartClientHandshakeReq{ - HandshakeSecurityProtocol: hsProtocol, - ApplicationProtocols: appProtocols, - RecordProtocols: recordProtocols, - TargetIdentities: targetIdentities, - LocalIdentity: h.clientOpts.ClientIdentity, - TargetName: h.clientOpts.TargetName, - RpcVersions: h.clientOpts.RPCVersions, - }, - }, - } - - conn, result, err := h.doHandshake(req) - if err != nil { - return nil, nil, err - } - authInfo := authinfo.New(result) - return conn, authInfo, nil -} - -// ServerHandshake starts and completes a server ALTS handshaking for GCP. Once -// done, ServerHandshake returns a secure connection. -func (h *altsHandshaker) ServerHandshake(ctx context.Context) (net.Conn, credentials.AuthInfo, error) { - if !acquire() { - return nil, nil, errDropped - } - defer release() - - if h.side != core.ServerSide { - return nil, nil, errors.New("only handshakers created using NewServerHandshaker can perform a server handshaker") - } - - p := make([]byte, frameLimit) - n, err := h.conn.Read(p) - if err != nil { - return nil, nil, err - } - - // Prepare server parameters. - // TODO: currently only ALTS parameters are provided. Might need to use - // more options in the future. - params := make(map[int32]*altspb.ServerHandshakeParameters) - params[int32(altspb.HandshakeProtocol_ALTS)] = &altspb.ServerHandshakeParameters{ - RecordProtocols: recordProtocols, - } - req := &altspb.HandshakerReq{ - ReqOneof: &altspb.HandshakerReq_ServerStart{ - ServerStart: &altspb.StartServerHandshakeReq{ - ApplicationProtocols: appProtocols, - HandshakeParameters: params, - InBytes: p[:n], - RpcVersions: h.serverOpts.RPCVersions, - }, - }, - } - - conn, result, err := h.doHandshake(req) - if err != nil { - return nil, nil, err - } - authInfo := authinfo.New(result) - return conn, authInfo, nil -} - -func (h *altsHandshaker) doHandshake(req *altspb.HandshakerReq) (net.Conn, *altspb.HandshakerResult, error) { - resp, err := h.accessHandshakerService(req) - if err != nil { - return nil, nil, err - } - // Check of the returned status is an error. - if resp.GetStatus() != nil { - if got, want := resp.GetStatus().Code, uint32(codes.OK); got != want { - return nil, nil, fmt.Errorf("%v", resp.GetStatus().Details) - } - } - - var extra []byte - if req.GetServerStart() != nil { - if resp.GetBytesConsumed() > uint32(len(req.GetServerStart().GetInBytes())) { - return nil, nil, errOutOfBound - } - extra = req.GetServerStart().GetInBytes()[resp.GetBytesConsumed():] - } - result, extra, err := h.processUntilDone(resp, extra) - if err != nil { - return nil, nil, err - } - // The handshaker returns a 128 bytes key. It should be truncated based - // on the returned record protocol. - keyLen, ok := keyLength[result.RecordProtocol] - if !ok { - return nil, nil, fmt.Errorf("unknown resulted record protocol %v", result.RecordProtocol) - } - sc, err := conn.NewConn(h.conn, h.side, result.GetRecordProtocol(), result.KeyData[:keyLen], extra) - if err != nil { - return nil, nil, err - } - return sc, result, nil -} - -func (h *altsHandshaker) accessHandshakerService(req *altspb.HandshakerReq) (*altspb.HandshakerResp, error) { - if err := h.stream.Send(req); err != nil { - return nil, err - } - resp, err := h.stream.Recv() - if err != nil { - return nil, err - } - return resp, nil -} - -// processUntilDone processes the handshake until the handshaker service returns -// the results. Handshaker service takes care of frame parsing, so we read -// whatever received from the network and send it to the handshaker service. -func (h *altsHandshaker) processUntilDone(resp *altspb.HandshakerResp, extra []byte) (*altspb.HandshakerResult, []byte, error) { - for { - if len(resp.OutFrames) > 0 { - if _, err := h.conn.Write(resp.OutFrames); err != nil { - return nil, nil, err - } - } - if resp.Result != nil { - return resp.Result, extra, nil - } - buf := make([]byte, frameLimit) - n, err := h.conn.Read(buf) - if err != nil && err != io.EOF { - return nil, nil, err - } - // If there is nothing to send to the handshaker service, and - // nothing is received from the peer, then we are stuck. - // This covers the case when the peer is not responding. Note - // that handshaker service connection issues are caught in - // accessHandshakerService before we even get here. - if len(resp.OutFrames) == 0 && n == 0 { - return nil, nil, core.PeerNotRespondingError - } - // Append extra bytes from the previous interaction with the - // handshaker service with the current buffer read from conn. - p := append(extra, buf[:n]...) - // From here on, p and extra point to the same slice. - resp, err = h.accessHandshakerService(&altspb.HandshakerReq{ - ReqOneof: &altspb.HandshakerReq_Next{ - Next: &altspb.NextHandshakeMessageReq{ - InBytes: p, - }, - }, - }) - if err != nil { - return nil, nil, err - } - // Set extra based on handshaker service response. - if resp.GetBytesConsumed() > uint32(len(p)) { - return nil, nil, errOutOfBound - } - extra = p[resp.GetBytesConsumed():] - } -} - -// Close terminates the Handshaker. It should be called when the caller obtains -// the secure connection. -func (h *altsHandshaker) Close() { - h.stream.CloseSend() -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go b/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go deleted file mode 100644 index 0c7b56835..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/handshaker/service/service.go +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package service manages connections between the VM application and the ALTS -// handshaker service. -package service - -import ( - "sync" - - grpc "google.golang.org/grpc" -) - -var ( - // hsConn represents a connection to hypervisor handshaker service. - hsConn *grpc.ClientConn - mu sync.Mutex - // hsDialer will be reassigned in tests. - hsDialer = grpc.Dial -) - -// Dial dials the handshake service in the hypervisor. If a connection has -// already been established, this function returns it. Otherwise, a new -// connection is created. -func Dial(hsAddress string) (*grpc.ClientConn, error) { - mu.Lock() - defer mu.Unlock() - - if hsConn == nil { - // Create a new connection to the handshaker service. Note that - // this connection stays open until the application is closed. - var err error - hsConn, err = hsDialer(hsAddress, grpc.WithInsecure()) - if err != nil { - return nil, err - } - } - return hsConn, nil -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go deleted file mode 100644 index 38c4832df..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/altscontext.pb.go +++ /dev/null @@ -1,152 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: grpc/gcp/altscontext.proto - -package grpc_gcp - -import ( - fmt "fmt" - proto "github.com/golang/protobuf/proto" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -type AltsContext struct { - // The application protocol negotiated for this connection. - ApplicationProtocol string `protobuf:"bytes,1,opt,name=application_protocol,json=applicationProtocol,proto3" json:"application_protocol,omitempty"` - // The record protocol negotiated for this connection. - RecordProtocol string `protobuf:"bytes,2,opt,name=record_protocol,json=recordProtocol,proto3" json:"record_protocol,omitempty"` - // The security level of the created secure channel. - SecurityLevel SecurityLevel `protobuf:"varint,3,opt,name=security_level,json=securityLevel,proto3,enum=grpc.gcp.SecurityLevel" json:"security_level,omitempty"` - // The peer service account. - PeerServiceAccount string `protobuf:"bytes,4,opt,name=peer_service_account,json=peerServiceAccount,proto3" json:"peer_service_account,omitempty"` - // The local service account. - LocalServiceAccount string `protobuf:"bytes,5,opt,name=local_service_account,json=localServiceAccount,proto3" json:"local_service_account,omitempty"` - // The RPC protocol versions supported by the peer. - PeerRpcVersions *RpcProtocolVersions `protobuf:"bytes,6,opt,name=peer_rpc_versions,json=peerRpcVersions,proto3" json:"peer_rpc_versions,omitempty"` - // Additional attributes of the peer. - PeerAttributes map[string]string `protobuf:"bytes,7,rep,name=peer_attributes,json=peerAttributes,proto3" json:"peer_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AltsContext) Reset() { *m = AltsContext{} } -func (m *AltsContext) String() string { return proto.CompactTextString(m) } -func (*AltsContext) ProtoMessage() {} -func (*AltsContext) Descriptor() ([]byte, []int) { - return fileDescriptor_6647a41e53a575a3, []int{0} -} - -func (m *AltsContext) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AltsContext.Unmarshal(m, b) -} -func (m *AltsContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AltsContext.Marshal(b, m, deterministic) -} -func (m *AltsContext) XXX_Merge(src proto.Message) { - xxx_messageInfo_AltsContext.Merge(m, src) -} -func (m *AltsContext) XXX_Size() int { - return xxx_messageInfo_AltsContext.Size(m) -} -func (m *AltsContext) XXX_DiscardUnknown() { - xxx_messageInfo_AltsContext.DiscardUnknown(m) -} - -var xxx_messageInfo_AltsContext proto.InternalMessageInfo - -func (m *AltsContext) GetApplicationProtocol() string { - if m != nil { - return m.ApplicationProtocol - } - return "" -} - -func (m *AltsContext) GetRecordProtocol() string { - if m != nil { - return m.RecordProtocol - } - return "" -} - -func (m *AltsContext) GetSecurityLevel() SecurityLevel { - if m != nil { - return m.SecurityLevel - } - return SecurityLevel_SECURITY_NONE -} - -func (m *AltsContext) GetPeerServiceAccount() string { - if m != nil { - return m.PeerServiceAccount - } - return "" -} - -func (m *AltsContext) GetLocalServiceAccount() string { - if m != nil { - return m.LocalServiceAccount - } - return "" -} - -func (m *AltsContext) GetPeerRpcVersions() *RpcProtocolVersions { - if m != nil { - return m.PeerRpcVersions - } - return nil -} - -func (m *AltsContext) GetPeerAttributes() map[string]string { - if m != nil { - return m.PeerAttributes - } - return nil -} - -func init() { - proto.RegisterType((*AltsContext)(nil), "grpc.gcp.AltsContext") - proto.RegisterMapType((map[string]string)(nil), "grpc.gcp.AltsContext.PeerAttributesEntry") -} - -func init() { proto.RegisterFile("grpc/gcp/altscontext.proto", fileDescriptor_6647a41e53a575a3) } - -var fileDescriptor_6647a41e53a575a3 = []byte{ - // 411 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0x4d, 0x6f, 0x13, 0x31, - 0x10, 0x86, 0xb5, 0x0d, 0x2d, 0xe0, 0x88, 0xb4, 0xb8, 0xa9, 0x58, 0x45, 0x42, 0x8a, 0xb8, 0xb0, - 0x5c, 0x76, 0x21, 0x5c, 0x10, 0x07, 0x50, 0x8a, 0x38, 0x20, 0x71, 0x88, 0xb6, 0x12, 0x07, 0x2e, - 0x2b, 0x77, 0x3a, 0xb2, 0x2c, 0x5c, 0x8f, 0x35, 0x76, 0x22, 0xf2, 0xb3, 0xf9, 0x07, 0x68, 0xed, - 0xcd, 0x07, 0x1f, 0xb7, 0x9d, 0x79, 0x9f, 0x19, 0xbf, 0xb3, 0x33, 0x62, 0xa6, 0xd9, 0x43, 0xa3, - 0xc1, 0x37, 0xca, 0xc6, 0x00, 0xe4, 0x22, 0xfe, 0x8c, 0xb5, 0x67, 0x8a, 0x24, 0x1f, 0xf5, 0x5a, - 0xad, 0xc1, 0xcf, 0xaa, 0x3d, 0x15, 0x59, 0xb9, 0xe0, 0x89, 0x63, 0x17, 0x10, 0xd6, 0x6c, 0xe2, - 0xb6, 0x03, 0xba, 0xbf, 0x27, 0x97, 0x6b, 0x5e, 0xfc, 0x1a, 0x89, 0xf1, 0xd2, 0xc6, 0xf0, 0x29, - 0x77, 0x92, 0x6f, 0xc4, 0x54, 0x79, 0x6f, 0x0d, 0xa8, 0x68, 0xc8, 0x75, 0x09, 0x02, 0xb2, 0x65, - 0x31, 0x2f, 0xaa, 0xc7, 0xed, 0xe5, 0x91, 0xb6, 0x1a, 0x24, 0xf9, 0x52, 0x9c, 0x33, 0x02, 0xf1, - 0xdd, 0x81, 0x3e, 0x49, 0xf4, 0x24, 0xa7, 0xf7, 0xe0, 0x07, 0x31, 0xd9, 0x9b, 0xb0, 0xb8, 0x41, - 0x5b, 0x8e, 0xe6, 0x45, 0x35, 0x59, 0x3c, 0xab, 0x77, 0xc6, 0xeb, 0x9b, 0x41, 0xff, 0xda, 0xcb, - 0xed, 0x93, 0x70, 0x1c, 0xca, 0xd7, 0x62, 0xea, 0x11, 0xb9, 0x0b, 0xc8, 0x1b, 0x03, 0xd8, 0x29, - 0x00, 0x5a, 0xbb, 0x58, 0x3e, 0x48, 0xaf, 0xc9, 0x5e, 0xbb, 0xc9, 0xd2, 0x32, 0x2b, 0x72, 0x21, - 0xae, 0x2c, 0x81, 0xb2, 0xff, 0x94, 0x9c, 0xe6, 0x71, 0x92, 0xf8, 0x57, 0xcd, 0x17, 0xf1, 0x34, - 0xbd, 0xc2, 0x1e, 0xba, 0x0d, 0x72, 0x30, 0xe4, 0x42, 0x79, 0x36, 0x2f, 0xaa, 0xf1, 0xe2, 0xf9, - 0xc1, 0x68, 0xeb, 0x61, 0x37, 0xd7, 0xb7, 0x01, 0x6a, 0xcf, 0xfb, 0xba, 0xd6, 0xc3, 0x2e, 0x21, - 0x5b, 0x91, 0x52, 0x9d, 0x8a, 0x91, 0xcd, 0xed, 0x3a, 0x62, 0x28, 0x1f, 0xce, 0x47, 0xd5, 0x78, - 0xf1, 0xea, 0xd0, 0xe8, 0xe8, 0xe7, 0xd7, 0x2b, 0x44, 0x5e, 0xee, 0xd9, 0xcf, 0x2e, 0xf2, 0xb6, - 0x9d, 0xf8, 0x3f, 0x92, 0xb3, 0xa5, 0xb8, 0xfc, 0x0f, 0x26, 0x2f, 0xc4, 0xe8, 0x07, 0x6e, 0x87, - 0x35, 0xf5, 0x9f, 0x72, 0x2a, 0x4e, 0x37, 0xca, 0xae, 0x71, 0x58, 0x46, 0x0e, 0xde, 0x9f, 0xbc, - 0x2b, 0xae, 0xad, 0xb8, 0x32, 0x94, 0x1d, 0xf4, 0x47, 0x54, 0x1b, 0x17, 0x91, 0x9d, 0xb2, 0xd7, - 0x17, 0x47, 0x66, 0xd2, 0x74, 0xab, 0xe2, 0xfb, 0x47, 0x4d, 0xa4, 0x2d, 0xd6, 0x9a, 0xac, 0x72, - 0xba, 0x26, 0xd6, 0x4d, 0x3a, 0x2e, 0x60, 0xbc, 0x43, 0x17, 0x8d, 0xb2, 0x21, 0x9d, 0x62, 0xb3, - 0xeb, 0xd2, 0xa4, 0x2b, 0x48, 0x50, 0xa7, 0xc1, 0xdf, 0x9e, 0xa5, 0xf8, 0xed, 0xef, 0x00, 0x00, - 0x00, 0xff, 0xff, 0x9b, 0x8c, 0xe4, 0x6a, 0xba, 0x02, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go deleted file mode 100644 index 4d1fc4c4d..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker.pb.go +++ /dev/null @@ -1,1105 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: grpc/gcp/handshaker.proto - -package grpc_gcp - -import ( - context "context" - fmt "fmt" - proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -type HandshakeProtocol int32 - -const ( - // Default value. - HandshakeProtocol_HANDSHAKE_PROTOCOL_UNSPECIFIED HandshakeProtocol = 0 - // TLS handshake protocol. - HandshakeProtocol_TLS HandshakeProtocol = 1 - // Application Layer Transport Security handshake protocol. - HandshakeProtocol_ALTS HandshakeProtocol = 2 -) - -var HandshakeProtocol_name = map[int32]string{ - 0: "HANDSHAKE_PROTOCOL_UNSPECIFIED", - 1: "TLS", - 2: "ALTS", -} - -var HandshakeProtocol_value = map[string]int32{ - "HANDSHAKE_PROTOCOL_UNSPECIFIED": 0, - "TLS": 1, - "ALTS": 2, -} - -func (x HandshakeProtocol) String() string { - return proto.EnumName(HandshakeProtocol_name, int32(x)) -} - -func (HandshakeProtocol) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{0} -} - -type NetworkProtocol int32 - -const ( - NetworkProtocol_NETWORK_PROTOCOL_UNSPECIFIED NetworkProtocol = 0 - NetworkProtocol_TCP NetworkProtocol = 1 - NetworkProtocol_UDP NetworkProtocol = 2 -) - -var NetworkProtocol_name = map[int32]string{ - 0: "NETWORK_PROTOCOL_UNSPECIFIED", - 1: "TCP", - 2: "UDP", -} - -var NetworkProtocol_value = map[string]int32{ - "NETWORK_PROTOCOL_UNSPECIFIED": 0, - "TCP": 1, - "UDP": 2, -} - -func (x NetworkProtocol) String() string { - return proto.EnumName(NetworkProtocol_name, int32(x)) -} - -func (NetworkProtocol) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{1} -} - -type Endpoint struct { - // IP address. It should contain an IPv4 or IPv6 string literal, e.g. - // "192.168.0.1" or "2001:db8::1". - IpAddress string `protobuf:"bytes,1,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"` - // Port number. - Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` - // Network protocol (e.g., TCP, UDP) associated with this endpoint. - Protocol NetworkProtocol `protobuf:"varint,3,opt,name=protocol,proto3,enum=grpc.gcp.NetworkProtocol" json:"protocol,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Endpoint) Reset() { *m = Endpoint{} } -func (m *Endpoint) String() string { return proto.CompactTextString(m) } -func (*Endpoint) ProtoMessage() {} -func (*Endpoint) Descriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{0} -} - -func (m *Endpoint) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Endpoint.Unmarshal(m, b) -} -func (m *Endpoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Endpoint.Marshal(b, m, deterministic) -} -func (m *Endpoint) XXX_Merge(src proto.Message) { - xxx_messageInfo_Endpoint.Merge(m, src) -} -func (m *Endpoint) XXX_Size() int { - return xxx_messageInfo_Endpoint.Size(m) -} -func (m *Endpoint) XXX_DiscardUnknown() { - xxx_messageInfo_Endpoint.DiscardUnknown(m) -} - -var xxx_messageInfo_Endpoint proto.InternalMessageInfo - -func (m *Endpoint) GetIpAddress() string { - if m != nil { - return m.IpAddress - } - return "" -} - -func (m *Endpoint) GetPort() int32 { - if m != nil { - return m.Port - } - return 0 -} - -func (m *Endpoint) GetProtocol() NetworkProtocol { - if m != nil { - return m.Protocol - } - return NetworkProtocol_NETWORK_PROTOCOL_UNSPECIFIED -} - -type Identity struct { - // Types that are valid to be assigned to IdentityOneof: - // *Identity_ServiceAccount - // *Identity_Hostname - IdentityOneof isIdentity_IdentityOneof `protobuf_oneof:"identity_oneof"` - // Additional attributes of the identity. - Attributes map[string]string `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Identity) Reset() { *m = Identity{} } -func (m *Identity) String() string { return proto.CompactTextString(m) } -func (*Identity) ProtoMessage() {} -func (*Identity) Descriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{1} -} - -func (m *Identity) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Identity.Unmarshal(m, b) -} -func (m *Identity) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Identity.Marshal(b, m, deterministic) -} -func (m *Identity) XXX_Merge(src proto.Message) { - xxx_messageInfo_Identity.Merge(m, src) -} -func (m *Identity) XXX_Size() int { - return xxx_messageInfo_Identity.Size(m) -} -func (m *Identity) XXX_DiscardUnknown() { - xxx_messageInfo_Identity.DiscardUnknown(m) -} - -var xxx_messageInfo_Identity proto.InternalMessageInfo - -type isIdentity_IdentityOneof interface { - isIdentity_IdentityOneof() -} - -type Identity_ServiceAccount struct { - ServiceAccount string `protobuf:"bytes,1,opt,name=service_account,json=serviceAccount,proto3,oneof"` -} - -type Identity_Hostname struct { - Hostname string `protobuf:"bytes,2,opt,name=hostname,proto3,oneof"` -} - -func (*Identity_ServiceAccount) isIdentity_IdentityOneof() {} - -func (*Identity_Hostname) isIdentity_IdentityOneof() {} - -func (m *Identity) GetIdentityOneof() isIdentity_IdentityOneof { - if m != nil { - return m.IdentityOneof - } - return nil -} - -func (m *Identity) GetServiceAccount() string { - if x, ok := m.GetIdentityOneof().(*Identity_ServiceAccount); ok { - return x.ServiceAccount - } - return "" -} - -func (m *Identity) GetHostname() string { - if x, ok := m.GetIdentityOneof().(*Identity_Hostname); ok { - return x.Hostname - } - return "" -} - -func (m *Identity) GetAttributes() map[string]string { - if m != nil { - return m.Attributes - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Identity) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Identity_ServiceAccount)(nil), - (*Identity_Hostname)(nil), - } -} - -type StartClientHandshakeReq struct { - // Handshake security protocol requested by the client. - HandshakeSecurityProtocol HandshakeProtocol `protobuf:"varint,1,opt,name=handshake_security_protocol,json=handshakeSecurityProtocol,proto3,enum=grpc.gcp.HandshakeProtocol" json:"handshake_security_protocol,omitempty"` - // The application protocols supported by the client, e.g., "h2" (for http2), - // "grpc". - ApplicationProtocols []string `protobuf:"bytes,2,rep,name=application_protocols,json=applicationProtocols,proto3" json:"application_protocols,omitempty"` - // The record protocols supported by the client, e.g., - // "ALTSRP_GCM_AES128". - RecordProtocols []string `protobuf:"bytes,3,rep,name=record_protocols,json=recordProtocols,proto3" json:"record_protocols,omitempty"` - // (Optional) Describes which server identities are acceptable by the client. - // If target identities are provided and none of them matches the peer - // identity of the server, handshake will fail. - TargetIdentities []*Identity `protobuf:"bytes,4,rep,name=target_identities,json=targetIdentities,proto3" json:"target_identities,omitempty"` - // (Optional) Application may specify a local identity. Otherwise, the - // handshaker chooses a default local identity. - LocalIdentity *Identity `protobuf:"bytes,5,opt,name=local_identity,json=localIdentity,proto3" json:"local_identity,omitempty"` - // (Optional) Local endpoint information of the connection to the server, - // such as local IP address, port number, and network protocol. - LocalEndpoint *Endpoint `protobuf:"bytes,6,opt,name=local_endpoint,json=localEndpoint,proto3" json:"local_endpoint,omitempty"` - // (Optional) Endpoint information of the remote server, such as IP address, - // port number, and network protocol. - RemoteEndpoint *Endpoint `protobuf:"bytes,7,opt,name=remote_endpoint,json=remoteEndpoint,proto3" json:"remote_endpoint,omitempty"` - // (Optional) If target name is provided, a secure naming check is performed - // to verify that the peer authenticated identity is indeed authorized to run - // the target name. - TargetName string `protobuf:"bytes,8,opt,name=target_name,json=targetName,proto3" json:"target_name,omitempty"` - // (Optional) RPC protocol versions supported by the client. - RpcVersions *RpcProtocolVersions `protobuf:"bytes,9,opt,name=rpc_versions,json=rpcVersions,proto3" json:"rpc_versions,omitempty"` - // (Optional) Maximum frame size supported by the client. - MaxFrameSize uint32 `protobuf:"varint,10,opt,name=max_frame_size,json=maxFrameSize,proto3" json:"max_frame_size,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StartClientHandshakeReq) Reset() { *m = StartClientHandshakeReq{} } -func (m *StartClientHandshakeReq) String() string { return proto.CompactTextString(m) } -func (*StartClientHandshakeReq) ProtoMessage() {} -func (*StartClientHandshakeReq) Descriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{2} -} - -func (m *StartClientHandshakeReq) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StartClientHandshakeReq.Unmarshal(m, b) -} -func (m *StartClientHandshakeReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StartClientHandshakeReq.Marshal(b, m, deterministic) -} -func (m *StartClientHandshakeReq) XXX_Merge(src proto.Message) { - xxx_messageInfo_StartClientHandshakeReq.Merge(m, src) -} -func (m *StartClientHandshakeReq) XXX_Size() int { - return xxx_messageInfo_StartClientHandshakeReq.Size(m) -} -func (m *StartClientHandshakeReq) XXX_DiscardUnknown() { - xxx_messageInfo_StartClientHandshakeReq.DiscardUnknown(m) -} - -var xxx_messageInfo_StartClientHandshakeReq proto.InternalMessageInfo - -func (m *StartClientHandshakeReq) GetHandshakeSecurityProtocol() HandshakeProtocol { - if m != nil { - return m.HandshakeSecurityProtocol - } - return HandshakeProtocol_HANDSHAKE_PROTOCOL_UNSPECIFIED -} - -func (m *StartClientHandshakeReq) GetApplicationProtocols() []string { - if m != nil { - return m.ApplicationProtocols - } - return nil -} - -func (m *StartClientHandshakeReq) GetRecordProtocols() []string { - if m != nil { - return m.RecordProtocols - } - return nil -} - -func (m *StartClientHandshakeReq) GetTargetIdentities() []*Identity { - if m != nil { - return m.TargetIdentities - } - return nil -} - -func (m *StartClientHandshakeReq) GetLocalIdentity() *Identity { - if m != nil { - return m.LocalIdentity - } - return nil -} - -func (m *StartClientHandshakeReq) GetLocalEndpoint() *Endpoint { - if m != nil { - return m.LocalEndpoint - } - return nil -} - -func (m *StartClientHandshakeReq) GetRemoteEndpoint() *Endpoint { - if m != nil { - return m.RemoteEndpoint - } - return nil -} - -func (m *StartClientHandshakeReq) GetTargetName() string { - if m != nil { - return m.TargetName - } - return "" -} - -func (m *StartClientHandshakeReq) GetRpcVersions() *RpcProtocolVersions { - if m != nil { - return m.RpcVersions - } - return nil -} - -func (m *StartClientHandshakeReq) GetMaxFrameSize() uint32 { - if m != nil { - return m.MaxFrameSize - } - return 0 -} - -type ServerHandshakeParameters struct { - // The record protocols supported by the server, e.g., - // "ALTSRP_GCM_AES128". - RecordProtocols []string `protobuf:"bytes,1,rep,name=record_protocols,json=recordProtocols,proto3" json:"record_protocols,omitempty"` - // (Optional) A list of local identities supported by the server, if - // specified. Otherwise, the handshaker chooses a default local identity. - LocalIdentities []*Identity `protobuf:"bytes,2,rep,name=local_identities,json=localIdentities,proto3" json:"local_identities,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ServerHandshakeParameters) Reset() { *m = ServerHandshakeParameters{} } -func (m *ServerHandshakeParameters) String() string { return proto.CompactTextString(m) } -func (*ServerHandshakeParameters) ProtoMessage() {} -func (*ServerHandshakeParameters) Descriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{3} -} - -func (m *ServerHandshakeParameters) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ServerHandshakeParameters.Unmarshal(m, b) -} -func (m *ServerHandshakeParameters) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ServerHandshakeParameters.Marshal(b, m, deterministic) -} -func (m *ServerHandshakeParameters) XXX_Merge(src proto.Message) { - xxx_messageInfo_ServerHandshakeParameters.Merge(m, src) -} -func (m *ServerHandshakeParameters) XXX_Size() int { - return xxx_messageInfo_ServerHandshakeParameters.Size(m) -} -func (m *ServerHandshakeParameters) XXX_DiscardUnknown() { - xxx_messageInfo_ServerHandshakeParameters.DiscardUnknown(m) -} - -var xxx_messageInfo_ServerHandshakeParameters proto.InternalMessageInfo - -func (m *ServerHandshakeParameters) GetRecordProtocols() []string { - if m != nil { - return m.RecordProtocols - } - return nil -} - -func (m *ServerHandshakeParameters) GetLocalIdentities() []*Identity { - if m != nil { - return m.LocalIdentities - } - return nil -} - -type StartServerHandshakeReq struct { - // The application protocols supported by the server, e.g., "h2" (for http2), - // "grpc". - ApplicationProtocols []string `protobuf:"bytes,1,rep,name=application_protocols,json=applicationProtocols,proto3" json:"application_protocols,omitempty"` - // Handshake parameters (record protocols and local identities supported by - // the server) mapped by the handshake protocol. Each handshake security - // protocol (e.g., TLS or ALTS) has its own set of record protocols and local - // identities. Since protobuf does not support enum as key to the map, the key - // to handshake_parameters is the integer value of HandshakeProtocol enum. - HandshakeParameters map[int32]*ServerHandshakeParameters `protobuf:"bytes,2,rep,name=handshake_parameters,json=handshakeParameters,proto3" json:"handshake_parameters,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Bytes in out_frames returned from the peer's HandshakerResp. It is possible - // that the peer's out_frames are split into multiple HandshakReq messages. - InBytes []byte `protobuf:"bytes,3,opt,name=in_bytes,json=inBytes,proto3" json:"in_bytes,omitempty"` - // (Optional) Local endpoint information of the connection to the client, - // such as local IP address, port number, and network protocol. - LocalEndpoint *Endpoint `protobuf:"bytes,4,opt,name=local_endpoint,json=localEndpoint,proto3" json:"local_endpoint,omitempty"` - // (Optional) Endpoint information of the remote client, such as IP address, - // port number, and network protocol. - RemoteEndpoint *Endpoint `protobuf:"bytes,5,opt,name=remote_endpoint,json=remoteEndpoint,proto3" json:"remote_endpoint,omitempty"` - // (Optional) RPC protocol versions supported by the server. - RpcVersions *RpcProtocolVersions `protobuf:"bytes,6,opt,name=rpc_versions,json=rpcVersions,proto3" json:"rpc_versions,omitempty"` - // (Optional) Maximum frame size supported by the server. - MaxFrameSize uint32 `protobuf:"varint,7,opt,name=max_frame_size,json=maxFrameSize,proto3" json:"max_frame_size,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StartServerHandshakeReq) Reset() { *m = StartServerHandshakeReq{} } -func (m *StartServerHandshakeReq) String() string { return proto.CompactTextString(m) } -func (*StartServerHandshakeReq) ProtoMessage() {} -func (*StartServerHandshakeReq) Descriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{4} -} - -func (m *StartServerHandshakeReq) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StartServerHandshakeReq.Unmarshal(m, b) -} -func (m *StartServerHandshakeReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StartServerHandshakeReq.Marshal(b, m, deterministic) -} -func (m *StartServerHandshakeReq) XXX_Merge(src proto.Message) { - xxx_messageInfo_StartServerHandshakeReq.Merge(m, src) -} -func (m *StartServerHandshakeReq) XXX_Size() int { - return xxx_messageInfo_StartServerHandshakeReq.Size(m) -} -func (m *StartServerHandshakeReq) XXX_DiscardUnknown() { - xxx_messageInfo_StartServerHandshakeReq.DiscardUnknown(m) -} - -var xxx_messageInfo_StartServerHandshakeReq proto.InternalMessageInfo - -func (m *StartServerHandshakeReq) GetApplicationProtocols() []string { - if m != nil { - return m.ApplicationProtocols - } - return nil -} - -func (m *StartServerHandshakeReq) GetHandshakeParameters() map[int32]*ServerHandshakeParameters { - if m != nil { - return m.HandshakeParameters - } - return nil -} - -func (m *StartServerHandshakeReq) GetInBytes() []byte { - if m != nil { - return m.InBytes - } - return nil -} - -func (m *StartServerHandshakeReq) GetLocalEndpoint() *Endpoint { - if m != nil { - return m.LocalEndpoint - } - return nil -} - -func (m *StartServerHandshakeReq) GetRemoteEndpoint() *Endpoint { - if m != nil { - return m.RemoteEndpoint - } - return nil -} - -func (m *StartServerHandshakeReq) GetRpcVersions() *RpcProtocolVersions { - if m != nil { - return m.RpcVersions - } - return nil -} - -func (m *StartServerHandshakeReq) GetMaxFrameSize() uint32 { - if m != nil { - return m.MaxFrameSize - } - return 0 -} - -type NextHandshakeMessageReq struct { - // Bytes in out_frames returned from the peer's HandshakerResp. It is possible - // that the peer's out_frames are split into multiple NextHandshakerMessageReq - // messages. - InBytes []byte `protobuf:"bytes,1,opt,name=in_bytes,json=inBytes,proto3" json:"in_bytes,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NextHandshakeMessageReq) Reset() { *m = NextHandshakeMessageReq{} } -func (m *NextHandshakeMessageReq) String() string { return proto.CompactTextString(m) } -func (*NextHandshakeMessageReq) ProtoMessage() {} -func (*NextHandshakeMessageReq) Descriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{5} -} - -func (m *NextHandshakeMessageReq) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NextHandshakeMessageReq.Unmarshal(m, b) -} -func (m *NextHandshakeMessageReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NextHandshakeMessageReq.Marshal(b, m, deterministic) -} -func (m *NextHandshakeMessageReq) XXX_Merge(src proto.Message) { - xxx_messageInfo_NextHandshakeMessageReq.Merge(m, src) -} -func (m *NextHandshakeMessageReq) XXX_Size() int { - return xxx_messageInfo_NextHandshakeMessageReq.Size(m) -} -func (m *NextHandshakeMessageReq) XXX_DiscardUnknown() { - xxx_messageInfo_NextHandshakeMessageReq.DiscardUnknown(m) -} - -var xxx_messageInfo_NextHandshakeMessageReq proto.InternalMessageInfo - -func (m *NextHandshakeMessageReq) GetInBytes() []byte { - if m != nil { - return m.InBytes - } - return nil -} - -type HandshakerReq struct { - // Types that are valid to be assigned to ReqOneof: - // *HandshakerReq_ClientStart - // *HandshakerReq_ServerStart - // *HandshakerReq_Next - ReqOneof isHandshakerReq_ReqOneof `protobuf_oneof:"req_oneof"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *HandshakerReq) Reset() { *m = HandshakerReq{} } -func (m *HandshakerReq) String() string { return proto.CompactTextString(m) } -func (*HandshakerReq) ProtoMessage() {} -func (*HandshakerReq) Descriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{6} -} - -func (m *HandshakerReq) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_HandshakerReq.Unmarshal(m, b) -} -func (m *HandshakerReq) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_HandshakerReq.Marshal(b, m, deterministic) -} -func (m *HandshakerReq) XXX_Merge(src proto.Message) { - xxx_messageInfo_HandshakerReq.Merge(m, src) -} -func (m *HandshakerReq) XXX_Size() int { - return xxx_messageInfo_HandshakerReq.Size(m) -} -func (m *HandshakerReq) XXX_DiscardUnknown() { - xxx_messageInfo_HandshakerReq.DiscardUnknown(m) -} - -var xxx_messageInfo_HandshakerReq proto.InternalMessageInfo - -type isHandshakerReq_ReqOneof interface { - isHandshakerReq_ReqOneof() -} - -type HandshakerReq_ClientStart struct { - ClientStart *StartClientHandshakeReq `protobuf:"bytes,1,opt,name=client_start,json=clientStart,proto3,oneof"` -} - -type HandshakerReq_ServerStart struct { - ServerStart *StartServerHandshakeReq `protobuf:"bytes,2,opt,name=server_start,json=serverStart,proto3,oneof"` -} - -type HandshakerReq_Next struct { - Next *NextHandshakeMessageReq `protobuf:"bytes,3,opt,name=next,proto3,oneof"` -} - -func (*HandshakerReq_ClientStart) isHandshakerReq_ReqOneof() {} - -func (*HandshakerReq_ServerStart) isHandshakerReq_ReqOneof() {} - -func (*HandshakerReq_Next) isHandshakerReq_ReqOneof() {} - -func (m *HandshakerReq) GetReqOneof() isHandshakerReq_ReqOneof { - if m != nil { - return m.ReqOneof - } - return nil -} - -func (m *HandshakerReq) GetClientStart() *StartClientHandshakeReq { - if x, ok := m.GetReqOneof().(*HandshakerReq_ClientStart); ok { - return x.ClientStart - } - return nil -} - -func (m *HandshakerReq) GetServerStart() *StartServerHandshakeReq { - if x, ok := m.GetReqOneof().(*HandshakerReq_ServerStart); ok { - return x.ServerStart - } - return nil -} - -func (m *HandshakerReq) GetNext() *NextHandshakeMessageReq { - if x, ok := m.GetReqOneof().(*HandshakerReq_Next); ok { - return x.Next - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*HandshakerReq) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*HandshakerReq_ClientStart)(nil), - (*HandshakerReq_ServerStart)(nil), - (*HandshakerReq_Next)(nil), - } -} - -type HandshakerResult struct { - // The application protocol negotiated for this connection. - ApplicationProtocol string `protobuf:"bytes,1,opt,name=application_protocol,json=applicationProtocol,proto3" json:"application_protocol,omitempty"` - // The record protocol negotiated for this connection. - RecordProtocol string `protobuf:"bytes,2,opt,name=record_protocol,json=recordProtocol,proto3" json:"record_protocol,omitempty"` - // Cryptographic key data. The key data may be more than the key length - // required for the record protocol, thus the client of the handshaker - // service needs to truncate the key data into the right key length. - KeyData []byte `protobuf:"bytes,3,opt,name=key_data,json=keyData,proto3" json:"key_data,omitempty"` - // The authenticated identity of the peer. - PeerIdentity *Identity `protobuf:"bytes,4,opt,name=peer_identity,json=peerIdentity,proto3" json:"peer_identity,omitempty"` - // The local identity used in the handshake. - LocalIdentity *Identity `protobuf:"bytes,5,opt,name=local_identity,json=localIdentity,proto3" json:"local_identity,omitempty"` - // Indicate whether the handshaker service client should keep the channel - // between the handshaker service open, e.g., in order to handle - // post-handshake messages in the future. - KeepChannelOpen bool `protobuf:"varint,6,opt,name=keep_channel_open,json=keepChannelOpen,proto3" json:"keep_channel_open,omitempty"` - // The RPC protocol versions supported by the peer. - PeerRpcVersions *RpcProtocolVersions `protobuf:"bytes,7,opt,name=peer_rpc_versions,json=peerRpcVersions,proto3" json:"peer_rpc_versions,omitempty"` - // The maximum frame size of the peer. - MaxFrameSize uint32 `protobuf:"varint,8,opt,name=max_frame_size,json=maxFrameSize,proto3" json:"max_frame_size,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *HandshakerResult) Reset() { *m = HandshakerResult{} } -func (m *HandshakerResult) String() string { return proto.CompactTextString(m) } -func (*HandshakerResult) ProtoMessage() {} -func (*HandshakerResult) Descriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{7} -} - -func (m *HandshakerResult) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_HandshakerResult.Unmarshal(m, b) -} -func (m *HandshakerResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_HandshakerResult.Marshal(b, m, deterministic) -} -func (m *HandshakerResult) XXX_Merge(src proto.Message) { - xxx_messageInfo_HandshakerResult.Merge(m, src) -} -func (m *HandshakerResult) XXX_Size() int { - return xxx_messageInfo_HandshakerResult.Size(m) -} -func (m *HandshakerResult) XXX_DiscardUnknown() { - xxx_messageInfo_HandshakerResult.DiscardUnknown(m) -} - -var xxx_messageInfo_HandshakerResult proto.InternalMessageInfo - -func (m *HandshakerResult) GetApplicationProtocol() string { - if m != nil { - return m.ApplicationProtocol - } - return "" -} - -func (m *HandshakerResult) GetRecordProtocol() string { - if m != nil { - return m.RecordProtocol - } - return "" -} - -func (m *HandshakerResult) GetKeyData() []byte { - if m != nil { - return m.KeyData - } - return nil -} - -func (m *HandshakerResult) GetPeerIdentity() *Identity { - if m != nil { - return m.PeerIdentity - } - return nil -} - -func (m *HandshakerResult) GetLocalIdentity() *Identity { - if m != nil { - return m.LocalIdentity - } - return nil -} - -func (m *HandshakerResult) GetKeepChannelOpen() bool { - if m != nil { - return m.KeepChannelOpen - } - return false -} - -func (m *HandshakerResult) GetPeerRpcVersions() *RpcProtocolVersions { - if m != nil { - return m.PeerRpcVersions - } - return nil -} - -func (m *HandshakerResult) GetMaxFrameSize() uint32 { - if m != nil { - return m.MaxFrameSize - } - return 0 -} - -type HandshakerStatus struct { - // The status code. This could be the gRPC status code. - Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - // The status details. - Details string `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *HandshakerStatus) Reset() { *m = HandshakerStatus{} } -func (m *HandshakerStatus) String() string { return proto.CompactTextString(m) } -func (*HandshakerStatus) ProtoMessage() {} -func (*HandshakerStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{8} -} - -func (m *HandshakerStatus) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_HandshakerStatus.Unmarshal(m, b) -} -func (m *HandshakerStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_HandshakerStatus.Marshal(b, m, deterministic) -} -func (m *HandshakerStatus) XXX_Merge(src proto.Message) { - xxx_messageInfo_HandshakerStatus.Merge(m, src) -} -func (m *HandshakerStatus) XXX_Size() int { - return xxx_messageInfo_HandshakerStatus.Size(m) -} -func (m *HandshakerStatus) XXX_DiscardUnknown() { - xxx_messageInfo_HandshakerStatus.DiscardUnknown(m) -} - -var xxx_messageInfo_HandshakerStatus proto.InternalMessageInfo - -func (m *HandshakerStatus) GetCode() uint32 { - if m != nil { - return m.Code - } - return 0 -} - -func (m *HandshakerStatus) GetDetails() string { - if m != nil { - return m.Details - } - return "" -} - -type HandshakerResp struct { - // Frames to be given to the peer for the NextHandshakeMessageReq. May be - // empty if no out_frames have to be sent to the peer or if in_bytes in the - // HandshakerReq are incomplete. All the non-empty out frames must be sent to - // the peer even if the handshaker status is not OK as these frames may - // contain the alert frames. - OutFrames []byte `protobuf:"bytes,1,opt,name=out_frames,json=outFrames,proto3" json:"out_frames,omitempty"` - // Number of bytes in the in_bytes consumed by the handshaker. It is possible - // that part of in_bytes in HandshakerReq was unrelated to the handshake - // process. - BytesConsumed uint32 `protobuf:"varint,2,opt,name=bytes_consumed,json=bytesConsumed,proto3" json:"bytes_consumed,omitempty"` - // This is set iff the handshake was successful. out_frames may still be set - // to frames that needs to be forwarded to the peer. - Result *HandshakerResult `protobuf:"bytes,3,opt,name=result,proto3" json:"result,omitempty"` - // Status of the handshaker. - Status *HandshakerStatus `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *HandshakerResp) Reset() { *m = HandshakerResp{} } -func (m *HandshakerResp) String() string { return proto.CompactTextString(m) } -func (*HandshakerResp) ProtoMessage() {} -func (*HandshakerResp) Descriptor() ([]byte, []int) { - return fileDescriptor_54c074f40c7c7e99, []int{9} -} - -func (m *HandshakerResp) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_HandshakerResp.Unmarshal(m, b) -} -func (m *HandshakerResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_HandshakerResp.Marshal(b, m, deterministic) -} -func (m *HandshakerResp) XXX_Merge(src proto.Message) { - xxx_messageInfo_HandshakerResp.Merge(m, src) -} -func (m *HandshakerResp) XXX_Size() int { - return xxx_messageInfo_HandshakerResp.Size(m) -} -func (m *HandshakerResp) XXX_DiscardUnknown() { - xxx_messageInfo_HandshakerResp.DiscardUnknown(m) -} - -var xxx_messageInfo_HandshakerResp proto.InternalMessageInfo - -func (m *HandshakerResp) GetOutFrames() []byte { - if m != nil { - return m.OutFrames - } - return nil -} - -func (m *HandshakerResp) GetBytesConsumed() uint32 { - if m != nil { - return m.BytesConsumed - } - return 0 -} - -func (m *HandshakerResp) GetResult() *HandshakerResult { - if m != nil { - return m.Result - } - return nil -} - -func (m *HandshakerResp) GetStatus() *HandshakerStatus { - if m != nil { - return m.Status - } - return nil -} - -func init() { - proto.RegisterEnum("grpc.gcp.HandshakeProtocol", HandshakeProtocol_name, HandshakeProtocol_value) - proto.RegisterEnum("grpc.gcp.NetworkProtocol", NetworkProtocol_name, NetworkProtocol_value) - proto.RegisterType((*Endpoint)(nil), "grpc.gcp.Endpoint") - proto.RegisterType((*Identity)(nil), "grpc.gcp.Identity") - proto.RegisterMapType((map[string]string)(nil), "grpc.gcp.Identity.AttributesEntry") - proto.RegisterType((*StartClientHandshakeReq)(nil), "grpc.gcp.StartClientHandshakeReq") - proto.RegisterType((*ServerHandshakeParameters)(nil), "grpc.gcp.ServerHandshakeParameters") - proto.RegisterType((*StartServerHandshakeReq)(nil), "grpc.gcp.StartServerHandshakeReq") - proto.RegisterMapType((map[int32]*ServerHandshakeParameters)(nil), "grpc.gcp.StartServerHandshakeReq.HandshakeParametersEntry") - proto.RegisterType((*NextHandshakeMessageReq)(nil), "grpc.gcp.NextHandshakeMessageReq") - proto.RegisterType((*HandshakerReq)(nil), "grpc.gcp.HandshakerReq") - proto.RegisterType((*HandshakerResult)(nil), "grpc.gcp.HandshakerResult") - proto.RegisterType((*HandshakerStatus)(nil), "grpc.gcp.HandshakerStatus") - proto.RegisterType((*HandshakerResp)(nil), "grpc.gcp.HandshakerResp") -} - -func init() { proto.RegisterFile("grpc/gcp/handshaker.proto", fileDescriptor_54c074f40c7c7e99) } - -var fileDescriptor_54c074f40c7c7e99 = []byte{ - // 1203 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xdd, 0x6e, 0x1b, 0x45, - 0x14, 0xce, 0xda, 0x4e, 0xe2, 0x1c, 0xc7, 0x3f, 0x99, 0xa6, 0xea, 0x26, 0x6d, 0xc1, 0x18, 0x10, - 0x6e, 0x2f, 0x6c, 0x70, 0x41, 0xa5, 0x45, 0x55, 0x6b, 0x3b, 0x8e, 0x1c, 0x5a, 0x1c, 0x6b, 0x9d, - 0x82, 0x44, 0x2f, 0x56, 0xd3, 0xf5, 0xd4, 0x59, 0x79, 0x3d, 0xb3, 0x9d, 0x19, 0x87, 0xb8, 0xf7, - 0xbc, 0x04, 0xf7, 0xbc, 0x06, 0x2f, 0xc1, 0x33, 0x20, 0xf1, 0x18, 0x68, 0x67, 0x7f, 0x6d, 0xaf, - 0xab, 0x22, 0xb8, 0xdb, 0x39, 0xf3, 0x7d, 0x67, 0xce, 0x9c, 0xf3, 0x9d, 0xb3, 0x03, 0x47, 0x13, - 0xee, 0x5a, 0xcd, 0x89, 0xe5, 0x36, 0x2f, 0x31, 0x1d, 0x8b, 0x4b, 0x3c, 0x25, 0xbc, 0xe1, 0x72, - 0x26, 0x19, 0xca, 0x7b, 0x5b, 0x8d, 0x89, 0xe5, 0x1e, 0xd7, 0x23, 0x90, 0xe4, 0x98, 0x0a, 0x97, - 0x71, 0x69, 0x0a, 0x62, 0xcd, 0xb9, 0x2d, 0x17, 0xa6, 0xc5, 0x66, 0x33, 0x46, 0x7d, 0x4e, 0x4d, - 0x42, 0xbe, 0x47, 0xc7, 0x2e, 0xb3, 0xa9, 0x44, 0x77, 0x01, 0x6c, 0xd7, 0xc4, 0xe3, 0x31, 0x27, - 0x42, 0xe8, 0x5a, 0x55, 0xab, 0xef, 0x19, 0x7b, 0xb6, 0xdb, 0xf6, 0x0d, 0x08, 0x41, 0xce, 0x73, - 0xa4, 0x67, 0xaa, 0x5a, 0x7d, 0xdb, 0x50, 0xdf, 0xe8, 0x1b, 0xc8, 0x2b, 0x3f, 0x16, 0x73, 0xf4, - 0x6c, 0x55, 0xab, 0x97, 0x5a, 0x47, 0x8d, 0x30, 0x8a, 0xc6, 0x80, 0xc8, 0x5f, 0x18, 0x9f, 0x0e, - 0x03, 0x80, 0x11, 0x41, 0x6b, 0x7f, 0x6b, 0x90, 0x3f, 0x1b, 0x13, 0x2a, 0x6d, 0xb9, 0x40, 0xf7, - 0xa0, 0x2c, 0x08, 0xbf, 0xb2, 0x2d, 0x62, 0x62, 0xcb, 0x62, 0x73, 0x2a, 0xfd, 0xb3, 0xfb, 0x5b, - 0x46, 0x29, 0xd8, 0x68, 0xfb, 0x76, 0x74, 0x07, 0xf2, 0x97, 0x4c, 0x48, 0x8a, 0x67, 0x44, 0x85, - 0xe1, 0x61, 0x22, 0x0b, 0xea, 0x00, 0x60, 0x29, 0xb9, 0xfd, 0x7a, 0x2e, 0x89, 0xd0, 0xb3, 0xd5, - 0x6c, 0xbd, 0xd0, 0xaa, 0xc5, 0xe1, 0x84, 0x07, 0x36, 0xda, 0x11, 0xa8, 0x47, 0x25, 0x5f, 0x18, - 0x09, 0xd6, 0xf1, 0x13, 0x28, 0xaf, 0x6c, 0xa3, 0x0a, 0x64, 0xa7, 0x64, 0x11, 0xe4, 0xc3, 0xfb, - 0x44, 0x87, 0xb0, 0x7d, 0x85, 0x9d, 0x79, 0x10, 0x83, 0xe1, 0x2f, 0x1e, 0x67, 0xbe, 0xd5, 0x3a, - 0x15, 0x28, 0xd9, 0xc1, 0x31, 0x26, 0xa3, 0x84, 0xbd, 0xa9, 0xfd, 0x99, 0x83, 0x5b, 0x23, 0x89, - 0xb9, 0xec, 0x3a, 0x36, 0xa1, 0xb2, 0x1f, 0x16, 0xcd, 0x20, 0x6f, 0xd1, 0x2b, 0xb8, 0x1d, 0x15, - 0x31, 0xae, 0x4f, 0x94, 0x50, 0x4d, 0x25, 0xf4, 0x76, 0x7c, 0x83, 0x88, 0x1c, 0xa5, 0xf4, 0x28, - 0xe2, 0x8f, 0x02, 0x7a, 0xb8, 0x85, 0x1e, 0xc0, 0x4d, 0xec, 0xba, 0x8e, 0x6d, 0x61, 0x69, 0x33, - 0x1a, 0x79, 0x15, 0x7a, 0xa6, 0x9a, 0xad, 0xef, 0x19, 0x87, 0x89, 0xcd, 0x90, 0x23, 0xd0, 0x3d, - 0xa8, 0x70, 0x62, 0x31, 0x3e, 0x4e, 0xe0, 0xb3, 0x0a, 0x5f, 0xf6, 0xed, 0x31, 0xf4, 0x29, 0x1c, - 0x48, 0xcc, 0x27, 0x44, 0x9a, 0xc1, 0x8d, 0x6d, 0x22, 0xf4, 0x9c, 0x4a, 0x3a, 0x5a, 0x4f, 0xba, - 0x51, 0xf1, 0xc1, 0x67, 0x11, 0x16, 0x3d, 0x82, 0x92, 0xc3, 0x2c, 0xec, 0x84, 0xfc, 0x85, 0xbe, - 0x5d, 0xd5, 0x36, 0xb0, 0x8b, 0x0a, 0x19, 0x49, 0x26, 0xa2, 0x92, 0x40, 0xbb, 0xfa, 0xce, 0x2a, - 0x35, 0x54, 0x75, 0x40, 0x8d, 0x44, 0xfe, 0x1d, 0x94, 0x39, 0x99, 0x31, 0x49, 0x62, 0xee, 0xee, - 0x46, 0x6e, 0xc9, 0x87, 0x46, 0xe4, 0x8f, 0xa1, 0x10, 0xdc, 0x59, 0x49, 0x30, 0xaf, 0xca, 0x0f, - 0xbe, 0x69, 0xe0, 0x49, 0xf0, 0x19, 0xec, 0x73, 0xd7, 0x32, 0xaf, 0x08, 0x17, 0x36, 0xa3, 0x42, - 0xdf, 0x53, 0xae, 0xef, 0xc6, 0xae, 0x0d, 0xd7, 0x0a, 0x53, 0xf8, 0x63, 0x00, 0x32, 0x0a, 0xdc, - 0xb5, 0xc2, 0x05, 0xfa, 0x0c, 0x4a, 0x33, 0x7c, 0x6d, 0xbe, 0xe1, 0x78, 0x46, 0x4c, 0x61, 0xbf, - 0x23, 0x3a, 0x54, 0xb5, 0x7a, 0xd1, 0xd8, 0x9f, 0xe1, 0xeb, 0x53, 0xcf, 0x38, 0xb2, 0xdf, 0x91, - 0xda, 0xaf, 0x1a, 0x1c, 0x8d, 0x08, 0xbf, 0x22, 0x3c, 0xd6, 0x04, 0xf6, 0x76, 0x25, 0xe1, 0xe9, - 0x55, 0xd4, 0xd2, 0xab, 0xf8, 0x04, 0x2a, 0x4b, 0x45, 0xf0, 0x8a, 0x98, 0xd9, 0x58, 0xc4, 0x72, - 0xb2, 0x0c, 0x36, 0x11, 0xb5, 0xdf, 0x43, 0x75, 0xaf, 0x04, 0xe3, 0xa9, 0x7b, 0xa3, 0x00, 0xb5, - 0xf7, 0x08, 0x70, 0x06, 0x87, 0x71, 0x4b, 0xb8, 0xd1, 0x95, 0x82, 0x98, 0x1e, 0xc7, 0x31, 0x6d, - 0x38, 0xb5, 0x91, 0x92, 0x0f, 0xbf, 0xcb, 0x6f, 0x5c, 0xa6, 0x64, 0xea, 0x08, 0xf2, 0x36, 0x35, - 0x5f, 0x2f, 0xfc, 0x81, 0xa1, 0xd5, 0xf7, 0x8d, 0x5d, 0x9b, 0x76, 0xbc, 0x65, 0x8a, 0xc6, 0x72, - 0xff, 0x41, 0x63, 0xdb, 0x1f, 0xac, 0xb1, 0x55, 0x09, 0xed, 0xfc, 0x0f, 0x12, 0xda, 0x5d, 0x97, - 0xd0, 0xf1, 0x14, 0xf4, 0x4d, 0xb9, 0x4a, 0x8e, 0xbc, 0x6d, 0x7f, 0xe4, 0x3d, 0x4a, 0x8e, 0xbc, - 0x42, 0xeb, 0xd3, 0x44, 0x21, 0x36, 0xc9, 0x30, 0x31, 0x17, 0x6b, 0x5f, 0xc3, 0xad, 0x01, 0xb9, - 0x8e, 0xa7, 0xdf, 0x0f, 0x44, 0x08, 0x3c, 0x51, 0x32, 0x49, 0x96, 0x40, 0x5b, 0x2a, 0x41, 0xed, - 0x2f, 0x0d, 0x8a, 0x11, 0x85, 0x7b, 0xe0, 0x53, 0xd8, 0xb7, 0xd4, 0x1c, 0x35, 0x85, 0x57, 0x7f, - 0x45, 0x28, 0xb4, 0x3e, 0x59, 0x91, 0xc5, 0xfa, 0xa8, 0xed, 0x6f, 0x19, 0x05, 0x9f, 0xa8, 0x00, - 0x9e, 0x1f, 0xa1, 0xe2, 0x0e, 0xfc, 0x64, 0x52, 0xfd, 0xac, 0xcb, 0xcb, 0xf3, 0xe3, 0x13, 0x7d, - 0x3f, 0x0f, 0x21, 0x47, 0xc9, 0xb5, 0x54, 0xda, 0x59, 0xe2, 0x6f, 0xb8, 0x6d, 0x7f, 0xcb, 0x50, - 0x84, 0x4e, 0x01, 0xf6, 0x38, 0x79, 0x1b, 0xfc, 0x23, 0x7e, 0xcb, 0x42, 0x25, 0x79, 0x4f, 0x31, - 0x77, 0x24, 0xfa, 0x0a, 0x0e, 0xd3, 0xda, 0x27, 0xf8, 0x0f, 0xdd, 0x48, 0xe9, 0x1e, 0xf4, 0x05, - 0x94, 0x57, 0xfa, 0x3e, 0xf8, 0x43, 0x95, 0x96, 0xdb, 0xde, 0xcb, 0xf9, 0x94, 0x2c, 0xcc, 0x31, - 0x96, 0x38, 0x94, 0xfd, 0x94, 0x2c, 0x4e, 0xb0, 0xc4, 0xe8, 0x21, 0x14, 0x5d, 0x42, 0x78, 0x3c, - 0x94, 0x73, 0x1b, 0x87, 0xf2, 0xbe, 0x07, 0x5c, 0x9f, 0xc9, 0xff, 0x7e, 0x9c, 0xdf, 0x87, 0x83, - 0x29, 0x21, 0xae, 0x69, 0x5d, 0x62, 0x4a, 0x89, 0x63, 0x32, 0x97, 0x50, 0xa5, 0xfb, 0xbc, 0x51, - 0xf6, 0x36, 0xba, 0xbe, 0xfd, 0xdc, 0x25, 0x14, 0x9d, 0xc1, 0x81, 0x8a, 0x6f, 0xa9, 0x47, 0x76, - 0x3f, 0xa4, 0x47, 0xca, 0x1e, 0xcf, 0x78, 0x6f, 0x9f, 0xe4, 0x53, 0x46, 0xed, 0xb3, 0x64, 0x6d, - 0x46, 0x12, 0xcb, 0xb9, 0x7a, 0x0a, 0x59, 0x6c, 0x4c, 0x54, 0x2d, 0x8a, 0x86, 0xfa, 0x46, 0x3a, - 0xec, 0x8e, 0x89, 0xc4, 0xb6, 0xfa, 0xc3, 0x7a, 0x49, 0x0f, 0x97, 0xb5, 0x3f, 0x34, 0x28, 0x2d, - 0x95, 0xd7, 0xf5, 0x9e, 0x5a, 0x6c, 0x2e, 0xfd, 0xa3, 0x43, 0xd9, 0xef, 0xb1, 0xb9, 0x54, 0xc7, - 0x0a, 0xf4, 0x39, 0x94, 0x54, 0x43, 0x98, 0x16, 0xa3, 0x62, 0x3e, 0x23, 0x63, 0xe5, 0xb2, 0x68, - 0x14, 0x95, 0xb5, 0x1b, 0x18, 0x51, 0x0b, 0x76, 0xb8, 0x12, 0x4b, 0xa0, 0xbf, 0xe3, 0x94, 0xa7, - 0x42, 0x20, 0x27, 0x23, 0x40, 0x7a, 0x1c, 0xa1, 0x2e, 0x11, 0x14, 0x36, 0x95, 0xe3, 0x5f, 0xd3, - 0x08, 0x90, 0xf7, 0xbf, 0x87, 0x83, 0xb5, 0xa7, 0x07, 0xaa, 0xc1, 0x47, 0xfd, 0xf6, 0xe0, 0x64, - 0xd4, 0x6f, 0x3f, 0xef, 0x99, 0x43, 0xe3, 0xfc, 0xe2, 0xbc, 0x7b, 0xfe, 0xc2, 0x7c, 0x39, 0x18, - 0x0d, 0x7b, 0xdd, 0xb3, 0xd3, 0xb3, 0xde, 0x49, 0x65, 0x0b, 0xed, 0x42, 0xf6, 0xe2, 0xc5, 0xa8, - 0xa2, 0xa1, 0x3c, 0xe4, 0xda, 0x2f, 0x2e, 0x46, 0x95, 0xcc, 0xfd, 0x1e, 0x94, 0x57, 0xde, 0x85, - 0xa8, 0x0a, 0x77, 0x06, 0xbd, 0x8b, 0x9f, 0xce, 0x8d, 0xe7, 0xef, 0xf3, 0xd3, 0x1d, 0x56, 0x34, - 0xef, 0xe3, 0xe5, 0xc9, 0xb0, 0x92, 0x69, 0xbd, 0x4a, 0x84, 0xc4, 0x47, 0xfe, 0x2b, 0x11, 0x9d, - 0x42, 0xe1, 0x84, 0x45, 0x66, 0x74, 0x2b, 0x3d, 0x1d, 0x6f, 0x8f, 0xf5, 0x0d, 0x79, 0x72, 0x6b, - 0x5b, 0x75, 0xed, 0x4b, 0xad, 0x33, 0x85, 0x9b, 0x36, 0xf3, 0x31, 0xd8, 0x91, 0xa2, 0x61, 0x53, - 0x49, 0x38, 0xc5, 0x4e, 0xa7, 0x1c, 0xc3, 0x55, 0xf4, 0x43, 0xed, 0xe7, 0xa7, 0x13, 0xc6, 0x26, - 0x0e, 0x69, 0x4c, 0x98, 0x83, 0xe9, 0xa4, 0xc1, 0xf8, 0xa4, 0xa9, 0x1e, 0xdf, 0x16, 0x27, 0x4a, - 0xde, 0xd8, 0x11, 0x4d, 0xcf, 0x49, 0x33, 0x74, 0xd2, 0x54, 0xbd, 0xa9, 0x40, 0xe6, 0xc4, 0x72, - 0x5f, 0xef, 0xa8, 0xf5, 0x83, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc1, 0xf9, 0x9d, 0xf2, 0xd9, - 0x0b, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// HandshakerServiceClient is the client API for HandshakerService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type HandshakerServiceClient interface { - // Handshaker service accepts a stream of handshaker request, returning a - // stream of handshaker response. Client is expected to send exactly one - // message with either client_start or server_start followed by one or more - // messages with next. Each time client sends a request, the handshaker - // service expects to respond. Client does not have to wait for service's - // response before sending next request. - DoHandshake(ctx context.Context, opts ...grpc.CallOption) (HandshakerService_DoHandshakeClient, error) -} - -type handshakerServiceClient struct { - cc *grpc.ClientConn -} - -func NewHandshakerServiceClient(cc *grpc.ClientConn) HandshakerServiceClient { - return &handshakerServiceClient{cc} -} - -func (c *handshakerServiceClient) DoHandshake(ctx context.Context, opts ...grpc.CallOption) (HandshakerService_DoHandshakeClient, error) { - stream, err := c.cc.NewStream(ctx, &_HandshakerService_serviceDesc.Streams[0], "/grpc.gcp.HandshakerService/DoHandshake", opts...) - if err != nil { - return nil, err - } - x := &handshakerServiceDoHandshakeClient{stream} - return x, nil -} - -type HandshakerService_DoHandshakeClient interface { - Send(*HandshakerReq) error - Recv() (*HandshakerResp, error) - grpc.ClientStream -} - -type handshakerServiceDoHandshakeClient struct { - grpc.ClientStream -} - -func (x *handshakerServiceDoHandshakeClient) Send(m *HandshakerReq) error { - return x.ClientStream.SendMsg(m) -} - -func (x *handshakerServiceDoHandshakeClient) Recv() (*HandshakerResp, error) { - m := new(HandshakerResp) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// HandshakerServiceServer is the server API for HandshakerService service. -type HandshakerServiceServer interface { - // Handshaker service accepts a stream of handshaker request, returning a - // stream of handshaker response. Client is expected to send exactly one - // message with either client_start or server_start followed by one or more - // messages with next. Each time client sends a request, the handshaker - // service expects to respond. Client does not have to wait for service's - // response before sending next request. - DoHandshake(HandshakerService_DoHandshakeServer) error -} - -// UnimplementedHandshakerServiceServer can be embedded to have forward compatible implementations. -type UnimplementedHandshakerServiceServer struct { -} - -func (*UnimplementedHandshakerServiceServer) DoHandshake(srv HandshakerService_DoHandshakeServer) error { - return status.Errorf(codes.Unimplemented, "method DoHandshake not implemented") -} - -func RegisterHandshakerServiceServer(s *grpc.Server, srv HandshakerServiceServer) { - s.RegisterService(&_HandshakerService_serviceDesc, srv) -} - -func _HandshakerService_DoHandshake_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(HandshakerServiceServer).DoHandshake(&handshakerServiceDoHandshakeServer{stream}) -} - -type HandshakerService_DoHandshakeServer interface { - Send(*HandshakerResp) error - Recv() (*HandshakerReq, error) - grpc.ServerStream -} - -type handshakerServiceDoHandshakeServer struct { - grpc.ServerStream -} - -func (x *handshakerServiceDoHandshakeServer) Send(m *HandshakerResp) error { - return x.ServerStream.SendMsg(m) -} - -func (x *handshakerServiceDoHandshakeServer) Recv() (*HandshakerReq, error) { - m := new(HandshakerReq) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -var _HandshakerService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "grpc.gcp.HandshakerService", - HandlerType: (*HandshakerServiceServer)(nil), - Methods: []grpc.MethodDesc{}, - Streams: []grpc.StreamDesc{ - { - StreamName: "DoHandshake", - Handler: _HandshakerService_DoHandshake_Handler, - ServerStreams: true, - ClientStreams: true, - }, - }, - Metadata: "grpc/gcp/handshaker.proto", -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go b/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go deleted file mode 100644 index 992805165..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/transport_security_common.pb.go +++ /dev/null @@ -1,184 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: grpc/gcp/transport_security_common.proto - -package grpc_gcp - -import ( - fmt "fmt" - proto "github.com/golang/protobuf/proto" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// The security level of the created channel. The list is sorted in increasing -// level of security. This order must always be maintained. -type SecurityLevel int32 - -const ( - SecurityLevel_SECURITY_NONE SecurityLevel = 0 - SecurityLevel_INTEGRITY_ONLY SecurityLevel = 1 - SecurityLevel_INTEGRITY_AND_PRIVACY SecurityLevel = 2 -) - -var SecurityLevel_name = map[int32]string{ - 0: "SECURITY_NONE", - 1: "INTEGRITY_ONLY", - 2: "INTEGRITY_AND_PRIVACY", -} - -var SecurityLevel_value = map[string]int32{ - "SECURITY_NONE": 0, - "INTEGRITY_ONLY": 1, - "INTEGRITY_AND_PRIVACY": 2, -} - -func (x SecurityLevel) String() string { - return proto.EnumName(SecurityLevel_name, int32(x)) -} - -func (SecurityLevel) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_b97e31e3cc23582a, []int{0} -} - -// Max and min supported RPC protocol versions. -type RpcProtocolVersions struct { - // Maximum supported RPC version. - MaxRpcVersion *RpcProtocolVersions_Version `protobuf:"bytes,1,opt,name=max_rpc_version,json=maxRpcVersion,proto3" json:"max_rpc_version,omitempty"` - // Minimum supported RPC version. - MinRpcVersion *RpcProtocolVersions_Version `protobuf:"bytes,2,opt,name=min_rpc_version,json=minRpcVersion,proto3" json:"min_rpc_version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RpcProtocolVersions) Reset() { *m = RpcProtocolVersions{} } -func (m *RpcProtocolVersions) String() string { return proto.CompactTextString(m) } -func (*RpcProtocolVersions) ProtoMessage() {} -func (*RpcProtocolVersions) Descriptor() ([]byte, []int) { - return fileDescriptor_b97e31e3cc23582a, []int{0} -} - -func (m *RpcProtocolVersions) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RpcProtocolVersions.Unmarshal(m, b) -} -func (m *RpcProtocolVersions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RpcProtocolVersions.Marshal(b, m, deterministic) -} -func (m *RpcProtocolVersions) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcProtocolVersions.Merge(m, src) -} -func (m *RpcProtocolVersions) XXX_Size() int { - return xxx_messageInfo_RpcProtocolVersions.Size(m) -} -func (m *RpcProtocolVersions) XXX_DiscardUnknown() { - xxx_messageInfo_RpcProtocolVersions.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcProtocolVersions proto.InternalMessageInfo - -func (m *RpcProtocolVersions) GetMaxRpcVersion() *RpcProtocolVersions_Version { - if m != nil { - return m.MaxRpcVersion - } - return nil -} - -func (m *RpcProtocolVersions) GetMinRpcVersion() *RpcProtocolVersions_Version { - if m != nil { - return m.MinRpcVersion - } - return nil -} - -// RPC version contains a major version and a minor version. -type RpcProtocolVersions_Version struct { - Major uint32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` - Minor uint32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RpcProtocolVersions_Version) Reset() { *m = RpcProtocolVersions_Version{} } -func (m *RpcProtocolVersions_Version) String() string { return proto.CompactTextString(m) } -func (*RpcProtocolVersions_Version) ProtoMessage() {} -func (*RpcProtocolVersions_Version) Descriptor() ([]byte, []int) { - return fileDescriptor_b97e31e3cc23582a, []int{0, 0} -} - -func (m *RpcProtocolVersions_Version) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RpcProtocolVersions_Version.Unmarshal(m, b) -} -func (m *RpcProtocolVersions_Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RpcProtocolVersions_Version.Marshal(b, m, deterministic) -} -func (m *RpcProtocolVersions_Version) XXX_Merge(src proto.Message) { - xxx_messageInfo_RpcProtocolVersions_Version.Merge(m, src) -} -func (m *RpcProtocolVersions_Version) XXX_Size() int { - return xxx_messageInfo_RpcProtocolVersions_Version.Size(m) -} -func (m *RpcProtocolVersions_Version) XXX_DiscardUnknown() { - xxx_messageInfo_RpcProtocolVersions_Version.DiscardUnknown(m) -} - -var xxx_messageInfo_RpcProtocolVersions_Version proto.InternalMessageInfo - -func (m *RpcProtocolVersions_Version) GetMajor() uint32 { - if m != nil { - return m.Major - } - return 0 -} - -func (m *RpcProtocolVersions_Version) GetMinor() uint32 { - if m != nil { - return m.Minor - } - return 0 -} - -func init() { - proto.RegisterEnum("grpc.gcp.SecurityLevel", SecurityLevel_name, SecurityLevel_value) - proto.RegisterType((*RpcProtocolVersions)(nil), "grpc.gcp.RpcProtocolVersions") - proto.RegisterType((*RpcProtocolVersions_Version)(nil), "grpc.gcp.RpcProtocolVersions.Version") -} - -func init() { - proto.RegisterFile("grpc/gcp/transport_security_common.proto", fileDescriptor_b97e31e3cc23582a) -} - -var fileDescriptor_b97e31e3cc23582a = []byte{ - // 323 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x91, 0x41, 0x4b, 0x3b, 0x31, - 0x10, 0xc5, 0xff, 0x5b, 0xf8, 0xab, 0x44, 0x56, 0xeb, 0x6a, 0x41, 0xc5, 0x83, 0x08, 0x42, 0xf1, - 0x90, 0x05, 0xc5, 0xb3, 0xb4, 0xb5, 0x48, 0xa1, 0x6e, 0xeb, 0xb6, 0x16, 0xea, 0x25, 0xc4, 0x18, - 0x42, 0x24, 0x9b, 0x09, 0xb3, 0xb1, 0xd4, 0xaf, 0xec, 0xa7, 0x90, 0x4d, 0xbb, 0x14, 0xc1, 0x8b, - 0xb7, 0xbc, 0xc7, 0xcc, 0x6f, 0x32, 0xf3, 0x48, 0x5b, 0xa1, 0x13, 0xa9, 0x12, 0x2e, 0xf5, 0xc8, - 0x6d, 0xe9, 0x00, 0x3d, 0x2b, 0xa5, 0xf8, 0x40, 0xed, 0x3f, 0x99, 0x80, 0xa2, 0x00, 0x4b, 0x1d, - 0x82, 0x87, 0x64, 0xa7, 0xaa, 0xa4, 0x4a, 0xb8, 0x8b, 0xaf, 0x88, 0x1c, 0xe6, 0x4e, 0x8c, 0x2b, - 0x5b, 0x80, 0x99, 0x49, 0x2c, 0x35, 0xd8, 0x32, 0x79, 0x24, 0xfb, 0x05, 0x5f, 0x32, 0x74, 0x82, - 0x2d, 0x56, 0xde, 0x71, 0x74, 0x1e, 0xb5, 0x77, 0xaf, 0x2f, 0x69, 0xdd, 0x4b, 0x7f, 0xe9, 0xa3, - 0xeb, 0x47, 0x1e, 0x17, 0x7c, 0x99, 0x3b, 0xb1, 0x96, 0x01, 0xa7, 0xed, 0x0f, 0x5c, 0xe3, 0x6f, - 0x38, 0x6d, 0x37, 0xb8, 0xd3, 0x5b, 0xb2, 0x5d, 0x93, 0x8f, 0xc8, 0xff, 0x82, 0xbf, 0x03, 0x86, - 0xef, 0xc5, 0xf9, 0x4a, 0x04, 0x57, 0x5b, 0xc0, 0x30, 0xa5, 0x72, 0x2b, 0x71, 0xf5, 0x44, 0xe2, - 0xc9, 0xfa, 0x1e, 0x43, 0xb9, 0x90, 0x26, 0x39, 0x20, 0xf1, 0xa4, 0xdf, 0x7b, 0xce, 0x07, 0xd3, - 0x39, 0xcb, 0x46, 0x59, 0xbf, 0xf9, 0x2f, 0x49, 0xc8, 0xde, 0x20, 0x9b, 0xf6, 0x1f, 0x82, 0x37, - 0xca, 0x86, 0xf3, 0x66, 0x94, 0x9c, 0x90, 0xd6, 0xc6, 0xeb, 0x64, 0xf7, 0x6c, 0x9c, 0x0f, 0x66, - 0x9d, 0xde, 0xbc, 0xd9, 0xe8, 0x2e, 0x49, 0x4b, 0xc3, 0x6a, 0x07, 0x6e, 0x7c, 0x49, 0xb5, 0xf5, - 0x12, 0x2d, 0x37, 0xdd, 0xb3, 0x69, 0x9d, 0x41, 0x3d, 0xb2, 0x17, 0x12, 0x08, 0x2b, 0x8e, 0xa3, - 0x97, 0x3b, 0x05, 0xa0, 0x8c, 0xa4, 0x0a, 0x0c, 0xb7, 0x8a, 0x02, 0xaa, 0x34, 0xc4, 0x27, 0x50, - 0xbe, 0x49, 0xeb, 0x35, 0x37, 0x65, 0x5a, 0x11, 0xd3, 0x9a, 0x98, 0x86, 0xe8, 0x42, 0x11, 0x53, - 0xc2, 0xbd, 0x6e, 0x05, 0x7d, 0xf3, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x31, 0x14, 0xb4, 0x11, 0xf6, - 0x01, 0x00, 0x00, -} diff --git a/vendor/google.golang.org/grpc/credentials/alts/internal/regenerate.sh b/vendor/google.golang.org/grpc/credentials/alts/internal/regenerate.sh deleted file mode 100644 index a79c4201b..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/internal/regenerate.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -# Copyright 2018 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eux -o pipefail - -TMP=$(mktemp -d) - -function finish { - rm -rf "$TMP" -} -trap finish EXIT - -pushd "$TMP" -mkdir -p grpc/gcp -curl https://raw.githubusercontent.com/grpc/grpc-proto/master/grpc/gcp/altscontext.proto > grpc/gcp/altscontext.proto -curl https://raw.githubusercontent.com/grpc/grpc-proto/master/grpc/gcp/handshaker.proto > grpc/gcp/handshaker.proto -curl https://raw.githubusercontent.com/grpc/grpc-proto/master/grpc/gcp/transport_security_common.proto > grpc/gcp/transport_security_common.proto - -protoc --go_out=plugins=grpc,paths=source_relative:. -I. grpc/gcp/*.proto -popd -rm -f proto/grpc_gcp/*.pb.go -cp "$TMP"/grpc/gcp/*.pb.go proto/grpc_gcp/ - diff --git a/vendor/google.golang.org/grpc/credentials/alts/utils.go b/vendor/google.golang.org/grpc/credentials/alts/utils.go deleted file mode 100644 index e46280ad5..000000000 --- a/vendor/google.golang.org/grpc/credentials/alts/utils.go +++ /dev/null @@ -1,163 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package alts - -import ( - "context" - "errors" - "fmt" - "io" - "io/ioutil" - "log" - "os" - "os/exec" - "regexp" - "runtime" - "strings" - - "google.golang.org/grpc/codes" - "google.golang.org/grpc/peer" - "google.golang.org/grpc/status" -) - -const ( - linuxProductNameFile = "/sys/class/dmi/id/product_name" - windowsCheckCommand = "powershell.exe" - windowsCheckCommandArgs = "Get-WmiObject -Class Win32_BIOS" - powershellOutputFilter = "Manufacturer" - windowsManufacturerRegex = ":(.*)" -) - -type platformError string - -func (k platformError) Error() string { - return fmt.Sprintf("%s is not supported", string(k)) -} - -var ( - // The following two variables will be reassigned in tests. - runningOS = runtime.GOOS - manufacturerReader = func() (io.Reader, error) { - switch runningOS { - case "linux": - return os.Open(linuxProductNameFile) - case "windows": - cmd := exec.Command(windowsCheckCommand, windowsCheckCommandArgs) - out, err := cmd.Output() - if err != nil { - return nil, err - } - - for _, line := range strings.Split(strings.TrimSuffix(string(out), "\n"), "\n") { - if strings.HasPrefix(line, powershellOutputFilter) { - re := regexp.MustCompile(windowsManufacturerRegex) - name := re.FindString(line) - name = strings.TrimLeft(name, ":") - return strings.NewReader(name), nil - } - } - - return nil, errors.New("cannot determine the machine's manufacturer") - default: - return nil, platformError(runningOS) - } - } - vmOnGCP bool -) - -// isRunningOnGCP checks whether the local system, without doing a network request is -// running on GCP. -func isRunningOnGCP() bool { - manufacturer, err := readManufacturer() - if os.IsNotExist(err) { - return false - } - if err != nil { - log.Fatalf("failure to read manufacturer information: %v", err) - } - name := string(manufacturer) - switch runningOS { - case "linux": - name = strings.TrimSpace(name) - return name == "Google" || name == "Google Compute Engine" - case "windows": - name = strings.Replace(name, " ", "", -1) - name = strings.Replace(name, "\n", "", -1) - name = strings.Replace(name, "\r", "", -1) - return name == "Google" - default: - log.Fatal(platformError(runningOS)) - } - return false -} - -func readManufacturer() ([]byte, error) { - reader, err := manufacturerReader() - if err != nil { - return nil, err - } - if reader == nil { - return nil, errors.New("got nil reader") - } - manufacturer, err := ioutil.ReadAll(reader) - if err != nil { - return nil, fmt.Errorf("failed reading %v: %v", linuxProductNameFile, err) - } - return manufacturer, nil -} - -// AuthInfoFromContext extracts the alts.AuthInfo object from the given context, -// if it exists. This API should be used by gRPC server RPC handlers to get -// information about the communicating peer. For client-side, use grpc.Peer() -// CallOption. -func AuthInfoFromContext(ctx context.Context) (AuthInfo, error) { - p, ok := peer.FromContext(ctx) - if !ok { - return nil, errors.New("no Peer found in Context") - } - return AuthInfoFromPeer(p) -} - -// AuthInfoFromPeer extracts the alts.AuthInfo object from the given peer, if it -// exists. This API should be used by gRPC clients after obtaining a peer object -// using the grpc.Peer() CallOption. -func AuthInfoFromPeer(p *peer.Peer) (AuthInfo, error) { - altsAuthInfo, ok := p.AuthInfo.(AuthInfo) - if !ok { - return nil, errors.New("no alts.AuthInfo found in Peer") - } - return altsAuthInfo, nil -} - -// ClientAuthorizationCheck checks whether the client is authorized to access -// the requested resources based on the given expected client service accounts. -// This API should be used by gRPC server RPC handlers. This API should not be -// used by clients. -func ClientAuthorizationCheck(ctx context.Context, expectedServiceAccounts []string) error { - authInfo, err := AuthInfoFromContext(ctx) - if err != nil { - return status.Newf(codes.PermissionDenied, "The context is not an ALTS-compatible context: %v", err).Err() - } - for _, sa := range expectedServiceAccounts { - if authInfo.PeerServiceAccount() == sa { - return nil - } - } - return status.Newf(codes.PermissionDenied, "Client %v is not authorized", authInfo.PeerServiceAccount()).Err() -} diff --git a/vendor/google.golang.org/grpc/credentials/google/google.go b/vendor/google.golang.org/grpc/credentials/google/google.go deleted file mode 100644 index 04b349abc..000000000 --- a/vendor/google.golang.org/grpc/credentials/google/google.go +++ /dev/null @@ -1,125 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package google defines credentials for google cloud services. -package google - -import ( - "context" - "fmt" - "time" - - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/credentials/alts" - "google.golang.org/grpc/credentials/oauth" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/internal" -) - -const tokenRequestTimeout = 30 * time.Second - -// NewDefaultCredentials returns a credentials bundle that is configured to work -// with google services. -// -// This API is experimental. -func NewDefaultCredentials() credentials.Bundle { - c := &creds{ - newPerRPCCreds: func() credentials.PerRPCCredentials { - ctx, cancel := context.WithTimeout(context.Background(), tokenRequestTimeout) - defer cancel() - perRPCCreds, err := oauth.NewApplicationDefault(ctx) - if err != nil { - grpclog.Warningf("google default creds: failed to create application oauth: %v", err) - } - return perRPCCreds - }, - } - bundle, err := c.NewWithMode(internal.CredsBundleModeFallback) - if err != nil { - grpclog.Warningf("google default creds: failed to create new creds: %v", err) - } - return bundle -} - -// NewComputeEngineCredentials returns a credentials bundle that is configured to work -// with google services. This API must only be used when running on GCE. Authentication configured -// by this API represents the GCE VM's default service account. -// -// This API is experimental. -func NewComputeEngineCredentials() credentials.Bundle { - c := &creds{ - newPerRPCCreds: func() credentials.PerRPCCredentials { - return oauth.NewComputeEngine() - }, - } - bundle, err := c.NewWithMode(internal.CredsBundleModeFallback) - if err != nil { - grpclog.Warningf("compute engine creds: failed to create new creds: %v", err) - } - return bundle -} - -// creds implements credentials.Bundle. -type creds struct { - // Supported modes are defined in internal/internal.go. - mode string - // The transport credentials associated with this bundle. - transportCreds credentials.TransportCredentials - // The per RPC credentials associated with this bundle. - perRPCCreds credentials.PerRPCCredentials - // Creates new per RPC credentials - newPerRPCCreds func() credentials.PerRPCCredentials -} - -func (c *creds) TransportCredentials() credentials.TransportCredentials { - return c.transportCreds -} - -func (c *creds) PerRPCCredentials() credentials.PerRPCCredentials { - if c == nil { - return nil - } - return c.perRPCCreds -} - -// NewWithMode should make a copy of Bundle, and switch mode. Modifying the -// existing Bundle may cause races. -func (c *creds) NewWithMode(mode string) (credentials.Bundle, error) { - newCreds := &creds{ - mode: mode, - newPerRPCCreds: c.newPerRPCCreds, - } - - // Create transport credentials. - switch mode { - case internal.CredsBundleModeFallback: - newCreds.transportCreds = credentials.NewTLS(nil) - case internal.CredsBundleModeBackendFromBalancer, internal.CredsBundleModeBalancer: - // Only the clients can use google default credentials, so we only need - // to create new ALTS client creds here. - newCreds.transportCreds = alts.NewClientCreds(alts.DefaultClientOptions()) - default: - return nil, fmt.Errorf("unsupported mode: %v", mode) - } - - if mode == internal.CredsBundleModeFallback || mode == internal.CredsBundleModeBackendFromBalancer { - newCreds.perRPCCreds = newCreds.newPerRPCCreds() - } - - return newCreds, nil -} diff --git a/vendor/google.golang.org/grpc/credentials/oauth/oauth.go b/vendor/google.golang.org/grpc/credentials/oauth/oauth.go deleted file mode 100644 index 899e3372c..000000000 --- a/vendor/google.golang.org/grpc/credentials/oauth/oauth.go +++ /dev/null @@ -1,185 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Package oauth implements gRPC credentials using OAuth. -package oauth - -import ( - "context" - "fmt" - "io/ioutil" - "sync" - - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - "golang.org/x/oauth2/jwt" - "google.golang.org/grpc/credentials" -) - -// TokenSource supplies PerRPCCredentials from an oauth2.TokenSource. -type TokenSource struct { - oauth2.TokenSource -} - -// GetRequestMetadata gets the request metadata as a map from a TokenSource. -func (ts TokenSource) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - token, err := ts.Token() - if err != nil { - return nil, err - } - if err = credentials.CheckSecurityLevel(ctx, credentials.PrivacyAndIntegrity); err != nil { - return nil, fmt.Errorf("unable to transfer TokenSource PerRPCCredentials: %v", err) - } - return map[string]string{ - "authorization": token.Type() + " " + token.AccessToken, - }, nil -} - -// RequireTransportSecurity indicates whether the credentials requires transport security. -func (ts TokenSource) RequireTransportSecurity() bool { - return true -} - -type jwtAccess struct { - jsonKey []byte -} - -// NewJWTAccessFromFile creates PerRPCCredentials from the given keyFile. -func NewJWTAccessFromFile(keyFile string) (credentials.PerRPCCredentials, error) { - jsonKey, err := ioutil.ReadFile(keyFile) - if err != nil { - return nil, fmt.Errorf("credentials: failed to read the service account key file: %v", err) - } - return NewJWTAccessFromKey(jsonKey) -} - -// NewJWTAccessFromKey creates PerRPCCredentials from the given jsonKey. -func NewJWTAccessFromKey(jsonKey []byte) (credentials.PerRPCCredentials, error) { - return jwtAccess{jsonKey}, nil -} - -func (j jwtAccess) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - ts, err := google.JWTAccessTokenSourceFromJSON(j.jsonKey, uri[0]) - if err != nil { - return nil, err - } - token, err := ts.Token() - if err != nil { - return nil, err - } - if err = credentials.CheckSecurityLevel(ctx, credentials.PrivacyAndIntegrity); err != nil { - return nil, fmt.Errorf("unable to transfer jwtAccess PerRPCCredentials: %v", err) - } - return map[string]string{ - "authorization": token.Type() + " " + token.AccessToken, - }, nil -} - -func (j jwtAccess) RequireTransportSecurity() bool { - return true -} - -// oauthAccess supplies PerRPCCredentials from a given token. -type oauthAccess struct { - token oauth2.Token -} - -// NewOauthAccess constructs the PerRPCCredentials using a given token. -func NewOauthAccess(token *oauth2.Token) credentials.PerRPCCredentials { - return oauthAccess{token: *token} -} - -func (oa oauthAccess) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - if err := credentials.CheckSecurityLevel(ctx, credentials.PrivacyAndIntegrity); err != nil { - return nil, fmt.Errorf("unable to transfer oauthAccess PerRPCCredentials: %v", err) - } - return map[string]string{ - "authorization": oa.token.Type() + " " + oa.token.AccessToken, - }, nil -} - -func (oa oauthAccess) RequireTransportSecurity() bool { - return true -} - -// NewComputeEngine constructs the PerRPCCredentials that fetches access tokens from -// Google Compute Engine (GCE)'s metadata server. It is only valid to use this -// if your program is running on a GCE instance. -// TODO(dsymonds): Deprecate and remove this. -func NewComputeEngine() credentials.PerRPCCredentials { - return TokenSource{google.ComputeTokenSource("")} -} - -// serviceAccount represents PerRPCCredentials via JWT signing key. -type serviceAccount struct { - mu sync.Mutex - config *jwt.Config - t *oauth2.Token -} - -func (s *serviceAccount) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - s.mu.Lock() - defer s.mu.Unlock() - if !s.t.Valid() { - var err error - s.t, err = s.config.TokenSource(ctx).Token() - if err != nil { - return nil, err - } - } - if err := credentials.CheckSecurityLevel(ctx, credentials.PrivacyAndIntegrity); err != nil { - return nil, fmt.Errorf("unable to transfer serviceAccount PerRPCCredentials: %v", err) - } - return map[string]string{ - "authorization": s.t.Type() + " " + s.t.AccessToken, - }, nil -} - -func (s *serviceAccount) RequireTransportSecurity() bool { - return true -} - -// NewServiceAccountFromKey constructs the PerRPCCredentials using the JSON key slice -// from a Google Developers service account. -func NewServiceAccountFromKey(jsonKey []byte, scope ...string) (credentials.PerRPCCredentials, error) { - config, err := google.JWTConfigFromJSON(jsonKey, scope...) - if err != nil { - return nil, err - } - return &serviceAccount{config: config}, nil -} - -// NewServiceAccountFromFile constructs the PerRPCCredentials using the JSON key file -// of a Google Developers service account. -func NewServiceAccountFromFile(keyFile string, scope ...string) (credentials.PerRPCCredentials, error) { - jsonKey, err := ioutil.ReadFile(keyFile) - if err != nil { - return nil, fmt.Errorf("credentials: failed to read the service account key file: %v", err) - } - return NewServiceAccountFromKey(jsonKey, scope...) -} - -// NewApplicationDefault returns "Application Default Credentials". For more -// detail, see https://developers.google.com/accounts/docs/application-default-credentials. -func NewApplicationDefault(ctx context.Context, scope ...string) (credentials.PerRPCCredentials, error) { - t, err := google.DefaultTokenSource(ctx, scope...) - if err != nil { - return nil, err - } - return TokenSource{t}, nil -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 9de1bd44f..3d7d19716 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,49 +1,5 @@ -# cloud.google.com/go v0.45.1 -cloud.google.com/go/compute/metadata -cloud.google.com/go/container/apiv1 -cloud.google.com/go/internal/version -cloud.google.com/go/monitoring/apiv3 -cloud.google.com/go/trace/apiv2 -# contrib.go.opencensus.io/exporter/prometheus v0.1.0 -contrib.go.opencensus.io/exporter/prometheus -# contrib.go.opencensus.io/exporter/stackdriver v0.12.7 -contrib.go.opencensus.io/exporter/stackdriver -contrib.go.opencensus.io/exporter/stackdriver/monitoredresource # github.com/RoaringBitmap/roaring v0.4.21 github.com/RoaringBitmap/roaring -# github.com/aws/aws-sdk-go v1.23.16 -github.com/aws/aws-sdk-go/aws -github.com/aws/aws-sdk-go/aws/awserr -github.com/aws/aws-sdk-go/aws/awsutil -github.com/aws/aws-sdk-go/aws/client -github.com/aws/aws-sdk-go/aws/client/metadata -github.com/aws/aws-sdk-go/aws/corehandlers -github.com/aws/aws-sdk-go/aws/credentials -github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds -github.com/aws/aws-sdk-go/aws/credentials/endpointcreds -github.com/aws/aws-sdk-go/aws/credentials/processcreds -github.com/aws/aws-sdk-go/aws/credentials/stscreds -github.com/aws/aws-sdk-go/aws/csm -github.com/aws/aws-sdk-go/aws/defaults -github.com/aws/aws-sdk-go/aws/ec2metadata -github.com/aws/aws-sdk-go/aws/endpoints -github.com/aws/aws-sdk-go/aws/request -github.com/aws/aws-sdk-go/aws/session -github.com/aws/aws-sdk-go/aws/signer/v4 -github.com/aws/aws-sdk-go/internal/ini -github.com/aws/aws-sdk-go/internal/sdkio -github.com/aws/aws-sdk-go/internal/sdkmath -github.com/aws/aws-sdk-go/internal/sdkrand -github.com/aws/aws-sdk-go/internal/sdkuri -github.com/aws/aws-sdk-go/internal/shareddefaults -github.com/aws/aws-sdk-go/private/protocol -github.com/aws/aws-sdk-go/private/protocol/json/jsonutil -github.com/aws/aws-sdk-go/private/protocol/query -github.com/aws/aws-sdk-go/private/protocol/query/queryutil -github.com/aws/aws-sdk-go/private/protocol/rest -github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil -github.com/aws/aws-sdk-go/service/sts -github.com/aws/aws-sdk-go/service/sts/stsiface # github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 github.com/beorn7/perks/quantile # github.com/blevesearch/bleve v0.8.2 @@ -92,10 +48,6 @@ github.com/blevesearch/segment # github.com/blevesearch/snowballstem v0.0.0-20200325004757-48afb64082dd github.com/blevesearch/snowballstem github.com/blevesearch/snowballstem/english -# github.com/census-instrumentation/opencensus-proto v0.2.1 -github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1 -github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1 -github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1 # github.com/couchbase/vellum v0.0.0-20190829182332-ef2e028c01fd github.com/couchbase/vellum github.com/couchbase/vellum/levenshtein @@ -118,8 +70,6 @@ github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx github.com/gobuffalo/packr # github.com/gofrs/uuid v0.0.0-20190510204422-abfe1881e60e github.com/gofrs/uuid -# github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 -github.com/golang/groupcache/lru # github.com/golang/protobuf v1.3.5 github.com/golang/protobuf/descriptor github.com/golang/protobuf/jsonpb @@ -134,15 +84,6 @@ github.com/golang/protobuf/ptypes/timestamp github.com/golang/protobuf/ptypes/wrappers # github.com/golang/snappy v0.0.1 github.com/golang/snappy -# github.com/google/go-cmp v0.3.1 -github.com/google/go-cmp/cmp -github.com/google/go-cmp/cmp/cmpopts -github.com/google/go-cmp/cmp/internal/diff -github.com/google/go-cmp/cmp/internal/flags -github.com/google/go-cmp/cmp/internal/function -github.com/google/go-cmp/cmp/internal/value -# github.com/googleapis/gax-go/v2 v2.0.5 -github.com/googleapis/gax-go/v2 # github.com/gorilla/handlers v1.4.2 github.com/gorilla/handlers # github.com/gorilla/mux v1.7.4 @@ -166,10 +107,19 @@ github.com/jackc/pgx/pgio github.com/jackc/pgx/pgproto3 github.com/jackc/pgx/pgtype github.com/jackc/pgx/stdlib -# github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af -github.com/jmespath/go-jmespath # github.com/joho/godotenv v1.3.0 github.com/joho/godotenv +# github.com/m3db/prometheus_client_golang v0.8.1 +github.com/m3db/prometheus_client_golang/prometheus +github.com/m3db/prometheus_client_golang/prometheus/promhttp +# github.com/m3db/prometheus_client_model v0.1.0 +github.com/m3db/prometheus_client_model/go +# github.com/m3db/prometheus_common v0.1.0 +github.com/m3db/prometheus_common/expfmt +github.com/m3db/prometheus_common/internal/bitbucket.org/ww/goautoneg +github.com/m3db/prometheus_common/model +# github.com/m3db/prometheus_procfs v0.8.1 +github.com/m3db/prometheus_procfs # github.com/matttproud/golang_protobuf_extensions v1.0.1 github.com/matttproud/golang_protobuf_extensions/pbutil # github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae @@ -180,21 +130,6 @@ github.com/philhofer/fwd github.com/pkg/errors # github.com/pmezard/go-difflib v1.0.0 github.com/pmezard/go-difflib/difflib -# github.com/prometheus/client_golang v0.9.2 -github.com/prometheus/client_golang/prometheus -github.com/prometheus/client_golang/prometheus/internal -github.com/prometheus/client_golang/prometheus/promhttp -# github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 -github.com/prometheus/client_model/go -# github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 -github.com/prometheus/common/expfmt -github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg -github.com/prometheus/common/model -# github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a -github.com/prometheus/procfs -github.com/prometheus/procfs/internal/util -github.com/prometheus/procfs/nfs -github.com/prometheus/procfs/xfs # github.com/rogpeppe/go-internal v1.3.1 github.com/rogpeppe/go-internal/modfile github.com/rogpeppe/go-internal/module @@ -208,32 +143,13 @@ github.com/steveyen/gtreap github.com/stretchr/testify/assert # github.com/tinylib/msgp v1.1.2 github.com/tinylib/msgp/msgp +# github.com/uber-go/tally v3.3.16+incompatible +github.com/uber-go/tally +github.com/uber-go/tally/prometheus # github.com/willf/bitset v1.1.10 github.com/willf/bitset # go.etcd.io/bbolt v1.3.4 go.etcd.io/bbolt -# go.opencensus.io v0.22.3 -go.opencensus.io -go.opencensus.io/internal -go.opencensus.io/internal/tagencoding -go.opencensus.io/metric/metricdata -go.opencensus.io/metric/metricexport -go.opencensus.io/metric/metricproducer -go.opencensus.io/plugin/ocgrpc -go.opencensus.io/plugin/ochttp -go.opencensus.io/plugin/ochttp/propagation/b3 -go.opencensus.io/resource -go.opencensus.io/resource/resourcekeys -go.opencensus.io/stats -go.opencensus.io/stats/internal -go.opencensus.io/stats/view -go.opencensus.io/tag -go.opencensus.io/trace -go.opencensus.io/trace/internal -go.opencensus.io/trace/propagation -go.opencensus.io/trace/tracestate -go.opencensus.io/zpages -go.opencensus.io/zpages/internal # go.uber.org/atomic v1.6.0 go.uber.org/atomic # go.uber.org/multierr v1.5.0 @@ -250,22 +166,12 @@ golang.org/x/crypto/bcrypt golang.org/x/crypto/blowfish golang.org/x/crypto/pbkdf2 # golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e -golang.org/x/net/context -golang.org/x/net/context/ctxhttp golang.org/x/net/http/httpguts golang.org/x/net/http2 golang.org/x/net/http2/hpack golang.org/x/net/idna golang.org/x/net/internal/timeseries golang.org/x/net/trace -# golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 -golang.org/x/oauth2 -golang.org/x/oauth2/google -golang.org/x/oauth2/internal -golang.org/x/oauth2/jws -golang.org/x/oauth2/jwt -# golang.org/x/sync v0.0.0-20190423024810-112230192c58 -golang.org/x/sync/semaphore # golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd golang.org/x/sys/unix golang.org/x/sys/windows @@ -283,42 +189,10 @@ golang.org/x/text/transform golang.org/x/text/unicode/bidi golang.org/x/text/unicode/norm golang.org/x/text/width -# google.golang.org/api v0.10.0 -google.golang.org/api/googleapi/transport -google.golang.org/api/internal -google.golang.org/api/iterator -google.golang.org/api/option -google.golang.org/api/support/bundler -google.golang.org/api/transport -google.golang.org/api/transport/grpc -google.golang.org/api/transport/http -google.golang.org/api/transport/http/internal/propagation -# google.golang.org/appengine v1.6.2 -google.golang.org/appengine -google.golang.org/appengine/internal -google.golang.org/appengine/internal/app_identity -google.golang.org/appengine/internal/base -google.golang.org/appengine/internal/datastore -google.golang.org/appengine/internal/log -google.golang.org/appengine/internal/modules -google.golang.org/appengine/internal/remote_api -google.golang.org/appengine/internal/socket -google.golang.org/appengine/internal/urlfetch -google.golang.org/appengine/socket -google.golang.org/appengine/urlfetch # google.golang.org/genproto v0.0.0-20200226201735-46b91f19d98c -google.golang.org/genproto/googleapis/api google.golang.org/genproto/googleapis/api/annotations -google.golang.org/genproto/googleapis/api/distribution google.golang.org/genproto/googleapis/api/httpbody -google.golang.org/genproto/googleapis/api/label -google.golang.org/genproto/googleapis/api/metric -google.golang.org/genproto/googleapis/api/monitoredres -google.golang.org/genproto/googleapis/container/v1 -google.golang.org/genproto/googleapis/devtools/cloudtrace/v2 -google.golang.org/genproto/googleapis/monitoring/v3 google.golang.org/genproto/googleapis/rpc/status -google.golang.org/genproto/googleapis/type/calendarperiod google.golang.org/genproto/protobuf/field_mask # google.golang.org/grpc v1.27.1 google.golang.org/grpc @@ -326,23 +200,12 @@ google.golang.org/grpc/attributes google.golang.org/grpc/backoff google.golang.org/grpc/balancer google.golang.org/grpc/balancer/base -google.golang.org/grpc/balancer/grpclb -google.golang.org/grpc/balancer/grpclb/grpc_lb_v1 google.golang.org/grpc/balancer/roundrobin google.golang.org/grpc/binarylog/grpc_binarylog_v1 google.golang.org/grpc/codes google.golang.org/grpc/connectivity google.golang.org/grpc/credentials -google.golang.org/grpc/credentials/alts -google.golang.org/grpc/credentials/alts/internal -google.golang.org/grpc/credentials/alts/internal/authinfo -google.golang.org/grpc/credentials/alts/internal/conn -google.golang.org/grpc/credentials/alts/internal/handshaker -google.golang.org/grpc/credentials/alts/internal/handshaker/service -google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp -google.golang.org/grpc/credentials/google google.golang.org/grpc/credentials/internal -google.golang.org/grpc/credentials/oauth google.golang.org/grpc/encoding google.golang.org/grpc/encoding/gzip google.golang.org/grpc/encoding/proto -- GitLab